@aws-cdk/toolkit-lib 1.24.0 → 1.25.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.
Files changed (92) hide show
  1. package/build-info.json +2 -2
  2. package/db.json.gz +0 -0
  3. package/lib/actions/deploy/index.d.ts +15 -1
  4. package/lib/actions/deploy/index.js +1 -1
  5. package/lib/actions/deploy/private/deployment-method.d.ts +5 -9
  6. package/lib/actions/deploy/private/deployment-method.js +8 -1
  7. package/lib/actions/diagnose/index.d.ts +89 -0
  8. package/lib/actions/diagnose/index.js +3 -0
  9. package/lib/actions/diff/private/helpers.js +12 -15
  10. package/lib/actions/index.d.ts +2 -0
  11. package/lib/actions/index.js +3 -1
  12. package/lib/actions/orphan/index.d.ts +18 -0
  13. package/lib/actions/orphan/index.js +3 -0
  14. package/lib/api/aws-auth/sdk.d.ts +2 -1
  15. package/lib/api/aws-auth/sdk.js +2 -1
  16. package/lib/api/bootstrap/bootstrap-environment.js +4 -4
  17. package/lib/api/bootstrap/bootstrap-template.yaml +5 -16
  18. package/lib/api/bootstrap/deploy-bootstrap.js +9 -1
  19. package/lib/api/cloud-assembly/stack-selector.d.ts +1 -1
  20. package/lib/api/cloud-assembly/stack-selector.js +1 -1
  21. package/lib/api/cloudformation/index.d.ts +1 -0
  22. package/lib/api/cloudformation/index.js +2 -1
  23. package/lib/api/cloudformation/logical-id-map.d.ts +24 -0
  24. package/lib/api/cloudformation/logical-id-map.js +45 -0
  25. package/lib/api/cloudformation/stack-helpers.d.ts +6 -0
  26. package/lib/api/cloudformation/stack-helpers.js +12 -1
  27. package/lib/api/deployments/cfn-api.d.ts +8 -17
  28. package/lib/api/deployments/cfn-api.js +60 -71
  29. package/lib/api/deployments/deploy-stack.d.ts +6 -2
  30. package/lib/api/deployments/deploy-stack.js +42 -61
  31. package/lib/api/deployments/deployments.d.ts +3 -2
  32. package/lib/api/deployments/deployments.js +31 -7
  33. package/lib/api/diagnosing/diagnosis-formatting.d.ts +13 -0
  34. package/lib/api/diagnosing/diagnosis-formatting.js +139 -0
  35. package/lib/api/diagnosing/early-validation.d.ts +49 -0
  36. package/lib/api/diagnosing/early-validation.js +81 -0
  37. package/lib/api/diagnosing/stack-diagnoser.d.ts +99 -0
  38. package/lib/api/diagnosing/stack-diagnoser.js +338 -0
  39. package/lib/api/diagnosing/tree-builder.d.ts +12 -0
  40. package/lib/api/diagnosing/tree-builder.js +86 -0
  41. package/lib/api/diagnosing/tree.d.ts +13 -0
  42. package/lib/api/diagnosing/tree.js +61 -0
  43. package/lib/api/diff/diff-formatter.js +8 -12
  44. package/lib/api/drift/drift-formatter.d.ts +0 -1
  45. package/lib/api/drift/drift-formatter.js +3 -10
  46. package/lib/api/hotswap/hotswap-deployments.js +14 -2
  47. package/lib/api/hotswap/hotswap-template-cache.d.ts +19 -0
  48. package/lib/api/hotswap/hotswap-template-cache.js +96 -0
  49. package/lib/api/index.d.ts +1 -0
  50. package/lib/api/index.js +2 -1
  51. package/lib/api/io/private/messages.d.ts +5 -0
  52. package/lib/api/io/private/messages.js +23 -1
  53. package/lib/api/io/toolkit-action.d.ts +1 -1
  54. package/lib/api/io/toolkit-action.js +1 -1
  55. package/lib/api/orphan/orphaner.d.ts +75 -0
  56. package/lib/api/orphan/orphaner.js +246 -0
  57. package/lib/api/orphan/private/helpers.d.ts +56 -0
  58. package/lib/api/orphan/private/helpers.js +219 -0
  59. package/lib/api/orphan/private/index.d.ts +2 -0
  60. package/lib/api/orphan/private/index.js +18 -0
  61. package/lib/api/resource-import/importer.d.ts +5 -1
  62. package/lib/api/resource-import/importer.js +26 -6
  63. package/lib/api/settings.d.ts +3 -1
  64. package/lib/api/settings.js +16 -3
  65. package/lib/api/source-tracing/index.d.ts +2 -0
  66. package/lib/api/source-tracing/index.js +18 -0
  67. package/lib/api/source-tracing/private/source-tracing.d.ts +16 -0
  68. package/lib/api/source-tracing/private/source-tracing.js +8 -0
  69. package/lib/api/source-tracing/private/stack-source-tracing.d.ts +32 -0
  70. package/lib/api/source-tracing/private/stack-source-tracing.js +134 -0
  71. package/lib/api/source-tracing/types.d.ts +9 -0
  72. package/lib/api/source-tracing/types.js +3 -0
  73. package/lib/api/stack-events/resource-errors.d.ts +82 -0
  74. package/lib/api/stack-events/resource-errors.js +129 -0
  75. package/lib/api/stack-events/stack-activity-monitor.d.ts +2 -29
  76. package/lib/api/stack-events/stack-activity-monitor.js +5 -94
  77. package/lib/api/stack-events/stack-event-poller.d.ts +71 -8
  78. package/lib/api/stack-events/stack-event-poller.js +107 -13
  79. package/lib/api/work-graph/work-graph.d.ts +4 -0
  80. package/lib/api/work-graph/work-graph.js +6 -1
  81. package/lib/index.d.ts +1 -0
  82. package/lib/index.js +2 -1
  83. package/lib/index_bg.wasm +0 -0
  84. package/lib/toolkit/toolkit.d.ts +17 -1
  85. package/lib/toolkit/toolkit.js +194 -57
  86. package/lib/util/arrays.d.ts +1 -0
  87. package/lib/util/arrays.js +23 -1
  88. package/lib/util/type-brands.d.ts +1 -1
  89. package/lib/util/type-brands.js +1 -1
  90. package/package.json +11 -11
  91. package/lib/api/deployments/early-validation.d.ts +0 -19
  92. package/lib/api/deployments/early-validation.js +0 -57
@@ -13,7 +13,9 @@ const deployment_method_1 = require("../../actions/deploy/private/deployment-met
13
13
  const toolkit_error_1 = require("../../toolkit/toolkit-error");
14
14
  const util_1 = require("../../util");
15
15
  const cloudformation_1 = require("../cloudformation");
16
+ const stack_diagnoser_1 = require("../diagnosing/stack-diagnoser");
16
17
  const environment_1 = require("../environment");
18
+ const stack_source_tracing_1 = require("../source-tracing/private/stack-source-tracing");
17
19
  const stack_events_1 = require("../stack-events");
18
20
  const toolkit_info_1 = require("../toolkit-info");
19
21
  const BOOTSTRAP_STACK_VERSION_FOR_ROLLBACK = 23;
@@ -120,6 +122,13 @@ class Deployments {
120
122
  resourcesToImport: options.resourcesToImport,
121
123
  overrideTemplate: options.overrideTemplate,
122
124
  assetParallelism: options.assetParallelism,
125
+ diagnoser: new stack_diagnoser_1.CloudFormationStackDiagnoser({
126
+ sdk: env.sdk,
127
+ envResources: env.resources,
128
+ sourceTracer: new stack_source_tracing_1.StackArtifactSourceTracer(options.stack),
129
+ ioHelper: this.ioHelper,
130
+ topLevelStackHierarchicalId: options.stack.hierarchicalId,
131
+ }),
123
132
  }, this.ioHelper);
124
133
  }
125
134
  /**
@@ -167,6 +176,20 @@ class Deployments {
167
176
  await (0, cfn_api_1.waitForStackDelete)(cfn, this.ioHelper, deployName);
168
177
  }
169
178
  }
179
+ async describeChangeSet(stack, changeSetName) {
180
+ const env = await this.envs.accessStackForMutableStackOperations(stack);
181
+ const cfn = env.sdk.cloudFormation();
182
+ return (0, cfn_api_1.waitForChangeSet)(cfn, this.ioHelper, stack.stackName, changeSetName, {
183
+ fetchAll: true,
184
+ diagnoser: new stack_diagnoser_1.CloudFormationStackDiagnoser({
185
+ sdk: env.sdk,
186
+ envResources: env.resources,
187
+ sourceTracer: new stack_source_tracing_1.StackArtifactSourceTracer(stack),
188
+ ioHelper: this.ioHelper,
189
+ topLevelStackHierarchicalId: stack.hierarchicalId,
190
+ }),
191
+ });
192
+ }
170
193
  async rollbackStack(options) {
171
194
  let resourcesToSkip = options.orphanLogicalIds ?? [];
172
195
  if (options.orphanFailedResources && resourcesToSkip.length > 0) {
@@ -206,12 +229,13 @@ class Deployments {
206
229
  // `DescribeStackResources` permissions).
207
230
  const poller = new stack_events_1.StackEventPoller(cfn, {
208
231
  stackName: deployName,
209
- stackStatuses: ['ROLLBACK_IN_PROGRESS', 'UPDATE_ROLLBACK_IN_PROGRESS'],
232
+ initialPollRange: stack_events_1.PollRange.sinceStackStatus(['ROLLBACK_IN_PROGRESS', 'UPDATE_ROLLBACK_IN_PROGRESS']),
210
233
  });
211
234
  await poller.poll();
212
235
  resourcesToSkip = poller.resourceErrors
213
- .filter((r) => !r.isStackEvent && r.parentStackLogicalIds.length === 0)
214
- .map((r) => r.event.LogicalResourceId ?? '');
236
+ .filter((r) => r.parentStackLogicalIds.length === 0)
237
+ .map((r) => r.logicalId)
238
+ .filter((id) => typeof id === 'string');
215
239
  }
216
240
  const skipDescription = resourcesToSkip.length > 0 ? ` (orphaning: ${resourcesToSkip.join(', ')})` : '';
217
241
  await this.ioHelper.defaults.warn(`Continuing rollback of stack ${deployName}${skipDescription}`);
@@ -244,13 +268,13 @@ class Deployments {
244
268
  throw new toolkit_error_1.ToolkitError('StackDisappeared', 'Stack deploy failed (the stack disappeared while we were rolling it back)');
245
269
  }
246
270
  finalStackState = successStack;
247
- const errors = monitor.allErrorMessages.join(', ');
271
+ const errors = monitor.errors.allErrorMessages.join(', ');
248
272
  if (errors) {
249
273
  stackErrorMessage = errors;
250
274
  }
251
275
  }
252
276
  catch (e) {
253
- stackErrorMessage = suffixWithErrors((0, util_1.formatErrorMessage)(e), monitor.allErrorMessages);
277
+ stackErrorMessage = suffixWithErrors((0, util_1.formatErrorMessage)(e), monitor.errors.allErrorMessages);
254
278
  }
255
279
  finally {
256
280
  await monitor.stop();
@@ -263,7 +287,7 @@ class Deployments {
263
287
  // Do another loop-de-loop
264
288
  continue;
265
289
  }
266
- throw new toolkit_error_1.DeploymentError(`${stackErrorMessage} (fix problem and retry, or orphan these resources using --orphan or --force)`, monitor.rootCauseErrorCode ?? 'RollbackFailed');
290
+ throw new toolkit_error_1.DeploymentError(`${stackErrorMessage} (fix problem and retry, or orphan these resources using --orphan or --force)`, monitor.errors.rootCauseErrorCode ?? 'RollbackFailed');
267
291
  }
268
292
  throw new toolkit_error_1.ToolkitError('RollbackStalled', "Rollback did not finish after a large number of iterations; stopping because it looks like we're not making progress anymore. You can retry if rollback was progressing as expected.");
269
293
  }
@@ -384,4 +408,4 @@ class ParallelSafeAssetProgress extends asset_publishing_1.BasePublishProgressLi
384
408
  function suffixWithErrors(msg, errors) {
385
409
  return errors && errors.length > 0 ? `${msg}: ${errors.join(', ')}` : msg;
386
410
  }
387
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFDcEMsc0RBQXNEO0FBRXRELCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHVDQUltQjtBQUNuQixxQ0FBcUU7QUFFckUsaURBQTJEO0FBRzNELHNGQUFnRztBQUVoRywrREFBNEU7QUFDNUUscUNBQWdEO0FBTWhELHNEQUsyQjtBQUMzQixnREFBOEU7QUFHOUUsa0RBQXlGO0FBRXpGLGtEQUE2RDtBQUU3RCxNQUFNLG9DQUFvQyxHQUFHLEVBQUUsQ0FBQztBQXNPaEQ7Ozs7R0FJRztBQUNILE1BQWEsV0FBVztJQTZCTztJQTVCYixJQUFJLENBQW9CO0lBRXhDOzs7Ozs7O09BT0c7SUFDYyxnQkFBZ0IsQ0FBYztJQUUvQzs7Ozs7OztPQU9HO0lBQ2Msc0JBQXNCLENBQWM7SUFFcEMsY0FBYyxHQUFHLElBQUksR0FBRyxFQUF3RCxDQUFDO0lBRTFGLGlDQUFpQyxDQUFzQjtJQUU5QyxRQUFRLENBQVc7SUFFcEMsWUFBNkIsS0FBdUI7UUFBdkIsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSwrQkFBaUIsQ0FDL0IsS0FBSyxDQUFDLFdBQVcsRUFDakIsS0FBSyxDQUFDLGdCQUFnQixJQUFJLHlDQUEwQixFQUNwRCxJQUFJLENBQUMsUUFBUSxDQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBd0M7UUFDdEUs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LHlCQUEwQixTQUFRLDhDQUEyQjtJQUNoRCxNQUFNLENBQVM7SUFFaEMsWUFBWSxNQUFjLEVBQUUsUUFBa0I7UUFDNUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBMEIsRUFBRSxLQUFrQztRQUNqRixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLE1BQWlCO0lBQ3RELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBjZGtfYXNzZXRzIGZyb20gJ0Bhd3MtY2RrL2Nkay1hc3NldHMtbGliJztcbmltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi9hc3NldC1tYW5pZmVzdC1idWlsZGVyJztcbmltcG9ydCB7XG4gIEJhc2VQdWJsaXNoUHJvZ3Jlc3NMaXN0ZW5lcixcbiAgUHVibGlzaGluZ0F3cyxcbn0gZnJvbSAnLi9hc3NldC1wdWJsaXNoaW5nJztcbmltcG9ydCB7XG4gIHN0YWJpbGl6ZVN0YWNrLFxuICB1cGxvYWRTdGFja1RlbXBsYXRlQXNzZXRzLFxuICB3YWl0Rm9yU3RhY2tEZWxldGUsXG59IGZyb20gJy4vY2ZuLWFwaSc7XG5pbXBvcnQgeyBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyB9IGZyb20gJy4vY2hlY2tzJztcblxuaW1wb3J0IHsgZGVwbG95U3RhY2ssIGRlc3Ryb3lTdGFjayB9IGZyb20gJy4vZGVwbG95LXN0YWNrJztcbmltcG9ydCB0eXBlIHsgRGVwbG95U3RhY2tSZXN1bHQsIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB9IGZyb20gJy4vZGVwbG95bWVudC1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VTZXREZXBsb3ltZW50LCBEZXBsb3ltZW50TWV0aG9kIH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9kZXBsb3knO1xuaW1wb3J0IHsgREVGQVVMVF9ERVBMT1lfQ0hBTkdFX1NFVF9OQU1FIH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9kZXBsb3kvcHJpdmF0ZS9kZXBsb3ltZW50LW1ldGhvZCc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50IH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9kZXBsb3kvcHJpdmF0ZS9kZXBsb3ltZW50LW1ldGhvZCc7XG5pbXBvcnQgeyBEZXBsb3ltZW50RXJyb3IsIFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHtcbiAgVGVtcGxhdGUsXG4gIFJvb3RUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MsXG59IGZyb20gJy4uL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7XG4gIENsb3VkRm9ybWF0aW9uU3RhY2ssXG4gIGxvYWRDdXJyZW50VGVtcGxhdGUsXG4gIGxvYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLFxuICBtYWtlQm9keVBhcmFtZXRlcixcbn0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgdHlwZSBFbnZpcm9ubWVudFJlc291cmNlcywgRW52aXJvbm1lbnRBY2Nlc3MgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcywgUmVzb3VyY2VzVG9JbXBvcnQgfSBmcm9tICcuLi9yZXNvdXJjZS1pbXBvcnQnO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eU1vbml0b3IsIFN0YWNrRXZlbnRQb2xsZXIsIFJvbGxiYWNrQ2hvaWNlIH0gZnJvbSAnLi4vc3RhY2stZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgVGFnIH0gZnJvbSAnLi4vdGFncyc7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSB9IGZyb20gJy4uL3Rvb2xraXQtaW5mbyc7XG5cbmNvbnN0IEJPT1RTVFJBUF9TVEFDS19WRVJTSU9OX0ZPUl9ST0xMQkFDSyA9IDIzO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayB0byBkZXBsb3lcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiByb2xlIGZvciB0aGUgZGVwbG95bWVudCAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9waWMgQVJOcyB0byBzZW5kIGEgbWVzc2FnZSB3aGVuIGRlcGxveW1lbnQgZmluaXNoZXMgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG5hbWUgdW5kZXIgd2hpY2ggc3RhY2sgd2lsbCBiZSBkZXBsb3llZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSBhcnRpZmFjdCBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBkZXBsb3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrLCBpZiBub3QgdGhlIGRlZmF1bHQgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ0RLVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXNzZXQgSURzIHdoaWNoIHNob3VsZCBOT1QgYmUgYnVpbHQgb3IgdXBsb2FkZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBCdWlsZCBhbGwgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSByZXVzZUFzc2V0cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTdGFjayB0YWdzIChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogVGFnW107XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgZGVwbG95bWVudCBtZXRob2QgKGRpcmVjdCBvciB1c2luZyBhIGNoYW5nZSBzZXQpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ2hhbmdlIHNldCB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZD86IERlcGxveW1lbnRNZXRob2QgfCBFeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudDtcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCwgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2UgZGVwbG95bWVudCB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIHRlbXBsYXRlIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXBsb3ltZW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXh0cmEgcGFyYW1ldGVycyBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBleHRyYSBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlciB3aGVuIHBlcmZvcm1pbmcgQVdTIFNESyBjYWxscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb3RoaW5nIGV4dHJhIGlzIGFwcGVuZGVkIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFVc2VyQWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZXhpc3RpbmcgcmVzb3VyY2VzIHRvIGJlIElNUE9SVEVEIGludG8gdGhlIHN0YWNrLCBpbnN0ZWFkIG9mIGJlaW5nIENSRUFURURcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvSW1wb3J0PzogUmVzb3VyY2VzVG9JbXBvcnQ7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHVzZSB0aGlzIGdpdmVuIHRlbXBsYXRlIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgdGhlIHN0b3JlZCB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVUZW1wbGF0ZT86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBidWlsZC9wdWJsaXNoIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQYXJhbGxlbGlzbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZVN0YWNrT3B0aW9ucyBleHRlbmRzIE9taXQ8RGVwbG95U3RhY2tPcHRpb25zLCAnZGVwbG95bWVudE1ldGhvZCc+IHtcbiAgLyoqXG4gICAqIFRoZSBjaGFuZ2Utc2V0IGRlcGxveW1lbnQgbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNZXRob2Q6IENoYW5nZVNldERlcGxveW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY2xlYW4gdXAgdGhlIGNoYW5nZSBzZXQgaWYgaXQgaGFzIG5vIGNoYW5nZXMuXG4gICAqXG4gICAqIFNldCB0byB0cnVlIHdoZW4gdGhlIGNhbGxlciBmb3JjZWQgZXhlY3V0ZTogZmFsc2UgaW50ZXJuYWxseVxuICAgKiAodHdvLXBoYXNlIGRlcGxveSkuIFNldCB0byBmYWxzZSB3aGVuIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICogYXNrZWQgZm9yIC0tbm8tZXhlY3V0ZSAocHJlcGFyZS1jaGFuZ2Utc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXBPbk5vT3A/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGxiYWNrU3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIHRvIHJvbGwgYmFja1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBkZXBsb3ltZW50IChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrLCBpZiBub3QgdGhlIGRlZmF1bHQgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ0RLVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBvcnBoYW4gYWxsIGZhaWxlZCByZXNvdXJjZXMgZHVyaW5nIHRoZSByb2xsYmFja1xuICAgKlxuICAgKiBUaGlzIHdpbGwgZm9yY2UgYSByb2xsYmFjayB0aGF0IG90aGVyd2lzZSB3b3VsZCBoYXZlIGZhaWxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG9ycGhhbkZhaWxlZFJlc291cmNlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ycGhhbiB0aGUgcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIGxvZ2ljYWwgSURzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gb3JwaGFuaW5nXG4gICAqL1xuICByZWFkb25seSBvcnBoYW5Mb2dpY2FsSWRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIHZlcnNpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJvbGxiYWNrU3RhY2tSZXN1bHQgPSB7IHJlYWRvbmx5IHN0YWNrQXJuOiBzdHJpbmcgfSAmIChcbiAgfCB7IHJlYWRvbmx5IG5vdEluUm9sbGJhY2thYmxlU3RhdGU6IHRydWUgfVxuICB8IHsgcmVhZG9ubHkgc3VjY2VzczogdHJ1ZTsgbm90SW5Sb2xsYmFja2FibGVTdGF0ZT86IHVuZGVmaW5lZCB9XG4pO1xuXG5pbnRlcmZhY2UgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIHdpdGggYXNzZXRzIHRvIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBidWlsZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRTdGFja0Fzc2V0c09wdGlvbnMgZXh0ZW5kcyBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgbmFtZSB0aGlzIGFzc2V0IGlzIGZvclxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUHVibGlzaFN0YWNrQXNzZXRzT3B0aW9ucyBleHRlbmRzIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayBuYW1lIHRoaXMgYXNzZXQgaXMgZm9yXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBwdWJsaXNoLCBldmVuIGlmIGl0IGFscmVhZHkgZXhpc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZVB1Ymxpc2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lTdGFja09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuICByb2xlQXJuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrRXhpc3RzT3B0aW9ucyB7XG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHRyeUxvb2t1cFJvbGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRzUHJvcHMge1xuICByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbn1cblxuLyoqXG4gKiBTY29wZSBmb3IgYSBzaW5nbGUgc2V0IG9mIGRlcGxveW1lbnRzIGZyb20gYSBzZXQgb2YgQ2xvdWQgQXNzZW1ibHkgQXJ0aWZhY3RzXG4gKlxuICogTWFuYWdlcyBsb29rdXAgb2YgU0RLcywgQm9vdHN0cmFwIHN0YWNrcywgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgRGVwbG95bWVudHMge1xuICBwdWJsaWMgcmVhZG9ubHkgZW52czogRW52aXJvbm1lbnRBY2Nlc3M7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciBmb3IgYXNzZXQgcHVibGlzaGluZyAoZG8gbm90IHVzZSBmb3IgYW55dGhpbmcgZWxzZSkuXG4gICAqXG4gICAqIFRoaXMgU0RLIHByb3ZpZGVyIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UsIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogSXQncyBub3QgYSBkaWZmZXJlbnQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIG5hbWUgc2hvdWxkIGltcGx5IHRoYXQgdGhpc1xuICAgKiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBleGNlcHQgdG8gcGFzcyB0byBhc3NldCBoYW5kbGluZyByb3V0aW5lcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRTZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciBmb3IgcGFzc2luZyB0byBkZXBsb3lTdGFja1xuICAgKlxuICAgKiBUaGlzIFNESyBwcm92aWRlciBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLCBub3RoaW5nIGVsc2UuXG4gICAqXG4gICAqIEl0J3Mgbm90IGEgZGlmZmVyZW50IG9iamVjdCwgYnV0IHRoZSBmaWVsZCBuYW1lIHNob3VsZCBpbXBseSB0aGF0IHRoaXNcbiAgICogb2JqZWN0IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwgZXhjZXB0IHRvIHBhc3MgdG8gYGRlcGxveVN0YWNrYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95U3RhY2tTZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoZXJDYWNoZSA9IG5ldyBNYXA8Y2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LCBjZGtfYXNzZXRzLkFzc2V0UHVibGlzaGluZz4oKTtcblxuICBwcml2YXRlIF9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBEZXBsb3ltZW50c1Byb3BzKSB7XG4gICAgdGhpcy5hc3NldFNka1Byb3ZpZGVyID0gcHJvcHMuc2RrUHJvdmlkZXI7XG4gICAgdGhpcy5kZXBsb3lTdGFja1Nka1Byb3ZpZGVyID0gcHJvcHMuc2RrUHJvdmlkZXI7XG4gICAgdGhpcy5pb0hlbHBlciA9IHByb3BzLmlvSGVscGVyO1xuICAgIHRoaXMuZW52cyA9IG5ldyBFbnZpcm9ubWVudEFjY2VzcyhcbiAgICAgIHByb3BzLnNka1Byb3ZpZGVyLFxuICAgICAgcHJvcHMudG9vbGtpdFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSxcbiAgICAgIHRoaXMuaW9IZWxwZXIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZW52aXJvbm1lbnQgZm9yIGEgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZUVudmlyb25tZW50KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPGN4YXBpLkVudmlyb25tZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChzdGFjayk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEN1cnJlbnRUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MoXG4gICAgcm9vdFN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICByZXRyaWV2ZVByb2Nlc3NlZFRlbXBsYXRlOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFByb21pc2U8Um9vdFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcz4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQocm9vdFN0YWNrQXJ0aWZhY3QpO1xuICAgIHJldHVybiBsb2FkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhyb290U3RhY2tBcnRpZmFjdCwgZW52LnNkaywgcmV0cmlldmVQcm9jZXNzZWRUZW1wbGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEN1cnJlbnRUZW1wbGF0ZShzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPFRlbXBsYXRlPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgUmVhZGluZyBleGlzdGluZyB0ZW1wbGF0ZSBmb3Igc3RhY2sgJHtzdGFja0FydGlmYWN0LmRpc3BsYXlOYW1lfS5gKTtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHN0YWNrQXJ0aWZhY3QpO1xuICAgIHJldHVybiBsb2FkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3QsIGVudi5zZGspO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcyhcbiAgICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICk6IFByb21pc2U8UmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgUmV0cmlldmluZyB0ZW1wbGF0ZSBzdW1tYXJ5IGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApO1xuICAgIC8vIEN1cnJlbnRseSwgbmVlZHMgdG8gdXNlIGBkZXBsb3ktcm9sZWAgc2luY2UgaXQgbWF5IG5lZWQgdG8gcmVhZCB0ZW1wbGF0ZXMgaW4gdGhlIHN0YWdpbmdcbiAgICAvLyBidWNrZXQgd2hpY2ggaGF2ZSBiZWVuIGVuY3J5cHRlZCB3aXRoIGEgS01TIGtleSAoYW5kIGxvb2t1cC1yb2xlIG1heSBub3QgcmVhZCBlbmNyeXB0ZWQgdGhpbmdzKVxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKHN0YWNrQXJ0aWZhY3QpO1xuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICAgIGF3YWl0IHVwbG9hZFN0YWNrVGVtcGxhdGVBc3NldHMoc3RhY2tBcnRpZmFjdCwgdGhpcyk7XG5cbiAgICAvLyBVcGxvYWQgdGhlIHRlbXBsYXRlLCBpZiBuZWNlc3NhcnksIGJlZm9yZSBwYXNzaW5nIGl0IHRvIENGTlxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQXNzZXRNYW5pZmVzdEJ1aWxkZXIoKTtcbiAgICBjb25zdCBjZm5QYXJhbSA9IGF3YWl0IG1ha2VCb2R5UGFyYW1ldGVyKFxuICAgICAgdGhpcy5pb0hlbHBlcixcbiAgICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgICBlbnYucmVzb2x2ZWRFbnZpcm9ubWVudCxcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBlbnYucmVzb3VyY2VzLFxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgYG1ha2VCb2R5UGFyYW1ldGVyYCBiZWZvcmUgdGhpcyBhZGRlZCBhc3NldHMsIG1ha2Ugc3VyZSB0byBwdWJsaXNoIHRoZW0gYmVmb3JlXG4gICAgLy8gY2FsbGluZyB0aGUgQVBJLlxuICAgIGNvbnN0IGFkZGVkQXNzZXRzID0gYnVpbGRlci50b01hbmlmZXN0KHN0YWNrQXJ0aWZhY3QuYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFkZGVkQXNzZXRzLmVudHJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRTaW5nbGVBc3NldCgnbm8tdmVyc2lvbi12YWxpZGF0aW9uJywgYWRkZWRBc3NldHMsIGVudHJ5LCB7XG4gICAgICAgIHN0YWNrOiBzdGFja0FydGlmYWN0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLnB1Ymxpc2hTaW5nbGVBc3NldChhZGRlZEFzc2V0cywgZW50cnksIHtcbiAgICAgICAgc3RhY2s6IHN0YWNrQXJ0aWZhY3QsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNmbi5nZXRUZW1wbGF0ZVN1bW1hcnkoY2ZuUGFyYW0pO1xuICAgIGlmICghcmVzcG9uc2UuUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKCdHZXRUZW1wbGF0ZVN1bW1hcnkgQVBJIGNhbGwgZGlkIG5vdCByZXR1cm4gXCJSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXNcIicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UuUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlcGxveVN0YWNrKG9wdGlvbnM6IERlcGxveVN0YWNrT3B0aW9ucyk6IFByb21pc2U8RGVwbG95U3RhY2tSZXN1bHQ+IHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuXG4gICAgLy8gRG8gYSB2ZXJpZmljYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgb3B0aW9ucy5zdGFjay5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgZW52LnJlc291cmNlcyk7XG5cbiAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgIHJldHVybiBkZXBsb3lTdGFjayh7XG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQ6IGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgbm90aWZpY2F0aW9uQXJuczogb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgc2RrUHJvdmlkZXI6IHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlcixcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgIGVudlJlc291cmNlczogZW52LnJlc291cmNlcyxcbiAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgIGZvcmNlRGVwbG95bWVudDogb3B0aW9ucy5mb3JjZURlcGxveW1lbnQsXG4gICAgICBwYXJhbWV0ZXJzOiBvcHRpb25zLnBhcmFtZXRlcnMsXG4gICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMudXNlUHJldmlvdXNQYXJhbWV0ZXJzLFxuICAgICAgcm9sbGJhY2s6IG9wdGlvbnMucm9sbGJhY2ssXG4gICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgIHJlc291cmNlc1RvSW1wb3J0OiBvcHRpb25zLnJlc291cmNlc1RvSW1wb3J0LFxuICAgICAgb3ZlcnJpZGVUZW1wbGF0ZTogb3B0aW9ucy5vdmVycmlkZVRlbXBsYXRlLFxuICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgIH0sIHRoaXMuaW9IZWxwZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNoYW5nZSBzZXQgZm9yIGEgc3RhY2sgd2l0aG91dCBleGVjdXRpbmcgaXQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIHJlc3VsdCBpZiB0aGUgY2hhbmdlIHNldCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIG9yIHVuZGVmaW5lZFxuICAgKiBpZiB0aGUgcHJlcGFyZSByZXR1cm5lZCBhIG5vbi1zdWNjZXNzIHJlc3VsdCAoZS5nLiByb2xsYmFjayBuZWVkZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXBhcmVTdGFjayhcbiAgICBvcHRpb25zOiBQcmVwYXJlU3RhY2tPcHRpb25zLFxuICApOiBQcm9taXNlPFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95U3RhY2soe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGRlcGxveW1lbnRNZXRob2Q6IHsgLi4ub3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLCBleGVjdXRlOiBmYWxzZSB9LFxuICAgIH0pO1xuXG4gICAgLy8gV2l0aCBleGVjdXRlOiBmYWxzZSwgdGhlIG9ubHkgcG9zc2libGUgcmVzdWx0IHR5cGUgaXMgZGlkLWRlcGxveS1zdGFja1xuICAgIC8vIChlaXRoZXIgbm9PcCBmb3IgZW1wdHkgY2hhbmdlIHNldHMsIG9yIHdpdGggYSBjaGFuZ2VTZXQgZGVzY3JpcHRpb24pLlxuICAgIC8vIFJvbGxiYWNrL3JlcGxhY2VtZW50IGNoZWNrcyBhcmUgb25seSByZWFjaGVkIHdoZW4gZXhlY3V0aW5nLlxuICAgIGlmIChyZXN1bHQudHlwZSAhPT0gJ2RpZC1kZXBsb3ktc3RhY2snKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGVtcHR5IGNoYW5nZSBzZXRzIGlmIHJlcXVlc3RlZCAoaS5lLiB3aGVuIHRoZSBjYWxsZXIgZm9yY2VkXG4gICAgLy8gZXhlY3V0ZTogZmFsc2UgaW50ZXJuYWxseSwgbm90IHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgLS1uby1leGVjdXRlKS5cbiAgICBpZiAocmVzdWx0Lm5vT3AgJiYgb3B0aW9ucy5jbGVhbnVwT25Ob09wKSB7XG4gICAgICBjb25zdCBjaGFuZ2VTZXROYW1lID0gb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLmNoYW5nZVNldE5hbWUgPz8gREVGQVVMVF9ERVBMT1lfQ0hBTkdFX1NFVF9OQU1FO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQ2hhbmdlU2V0KG9wdGlvbnMuc3RhY2ssIGNoYW5nZVNldE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgYSBjaGFuZ2Ugc2V0IHRoYXQgd2FzIGNyZWF0ZWQgYnkgcHJlcGFyZVN0YWNrIGJ1dCBuZXZlciBleGVjdXRlZC5cbiAgICogSWYgdGhlIHN0YWNrIHdhcyBjcmVhdGVkIGluIFJFVklFV19JTl9QUk9HUkVTUyBzdGF0ZSAobmV3IHN0YWNrKSwgZGVsZXRlIHRoZSBzdGFjayB0b28uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYW51cENoYW5nZVNldChzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBjaGFuZ2VTZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKHN0YWNrKTtcbiAgICBjb25zdCBjZm4gPSBlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgY29uc3QgZGVwbG95TmFtZSA9IHN0YWNrLnN0YWNrTmFtZTtcblxuICAgIGNvbnN0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICAgIGlmICghY2xvdWRGb3JtYXRpb25TdGFjay5leGlzdHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBjZm4uZGVsZXRlQ2hhbmdlU2V0KHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLCBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXROYW1lIH0pO1xuXG4gICAgLy8gSWYgdGhlIHN0YWNrIHdhcyBuZXdseSBjcmVhdGVkIGZvciB0aGlzIGNoYW5nZSBzZXQsIGl0IHdpbGwgYmUgaW4gUkVWSUVXX0lOX1BST0dSRVNTLlxuICAgIC8vIERlbGV0ZSBpdCBhbmQgd2FpdCBmb3IgdGhlIGRlbGV0aW9uIHRvIGNvbXBsZXRlIHNvIHdlIGRvbid0IGxlYXZlIGFuIGVtcHR5IHN0YWNrIGJlaGluZC5cbiAgICBpZiAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5uYW1lID09PSAnUkVWSUVXX0lOX1BST0dSRVNTJykge1xuICAgICAgYXdhaXQgY2ZuLmRlbGV0ZVN0YWNrKHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lIH0pO1xuICAgICAgYXdhaXQgd2FpdEZvclN0YWNrRGVsZXRlKGNmbiwgdGhpcy5pb0hlbHBlciwgZGVwbG95TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHJvbGxiYWNrU3RhY2sob3B0aW9uczogUm9sbGJhY2tTdGFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrU3RhY2tSZXN1bHQ+IHtcbiAgICBsZXQgcmVzb3VyY2VzVG9Ta2lwOiBzdHJpbmdbXSA9IG9wdGlvbnMub3JwaGFuTG9naWNhbElkcyA/PyBbXTtcbiAgICBpZiAob3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMgJiYgcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmZsaWN0aW5nUm9sbGJhY2tPcHRpb25zJywgJ0Nhbm5vdCBjb21iaW5lIC0tZm9yY2Ugd2l0aCAtLW9ycGhhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG5cbiAgICBpZiAob3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbiA/PyB0cnVlKSB7XG4gICAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0ssXG4gICAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm4gPSBlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuXG4gICAgLy8gV2UgbG9vcCBpbiBjYXNlIG9mIGAtLWZvcmNlYCBhbmQgdGhlIHN0YWNrIGVuZHMgdXAgaW4gYENPTlRJTlVFX1VQREFURV9ST0xMQkFDS2AuXG4gICAgbGV0IG1heExvb3BzID0gMTA7XG4gICAgd2hpbGUgKG1heExvb3BzLS0pIHtcbiAgICAgIGNvbnN0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICAgICAgY29uc3Qgc3RhY2tBcm4gPSBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQ7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvblJvbGVBcm4gPSBhd2FpdCBlbnYucmVwbGFjZVBsYWNlaG9sZGVycyhvcHRpb25zLnJvbGVBcm4gPz8gb3B0aW9ucy5zdGFjay5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4pO1xuXG4gICAgICBzd2l0Y2ggKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UpIHtcbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5OT05FOlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMud2FybihgU3RhY2sgJHtkZXBsb3lOYW1lfSBkb2VzIG5vdCBuZWVkIGEgcm9sbGJhY2s6ICR7Y2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1c31gKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBJbml0aWF0aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX1gKTtcbiAgICAgICAgICBhd2FpdCBjZm4ucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgICAgICBSb2xlQVJOOiBleGVjdXRpb25Sb2xlQXJuLFxuICAgICAgICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICAvLyBFbmFibGluZyB0aGlzIGlzIGp1c3QgdGhlIGJldHRlciBvdmVyYWxsIGRlZmF1bHQsIHRoZSBvbmx5IHJlYXNvbiBpdCBpc24ndCB0aGUgdXBzdHJlYW0gZGVmYXVsdCBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgUmV0YWluRXhjZXB0T25DcmVhdGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5DT05USU5VRV9VUERBVEVfUk9MTEJBQ0s6XG4gICAgICAgICAgaWYgKG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBmYWlsZWQgcmVzb3VyY2VzIGZyb20gdGhlIGRlcGxveW1lbnQgYW5kIGF1dG9tYXRpY2FsbHkgc2tpcCB0aGVtXG4gICAgICAgICAgICAvLyAoVXNpbmcgZGVwbG95bWVudCBsb2cgYmVjYXVzZSB3ZSBkZWZpbml0ZWx5IGhhdmUgYERlc2NyaWJlU3RhY2tFdmVudHNgIHBlcm1pc3Npb25zLCBhbmQgd2UgbWlnaHQgbm90IGhhdmVcbiAgICAgICAgICAgIC8vIGBEZXNjcmliZVN0YWNrUmVzb3VyY2VzYCBwZXJtaXNzaW9ucykuXG4gICAgICAgICAgICBjb25zdCBwb2xsZXIgPSBuZXcgU3RhY2tFdmVudFBvbGxlcihjZm4sIHtcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgICBzdGFja1N0YXR1c2VzOiBbJ1JPTExCQUNLX0lOX1BST0dSRVNTJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUyddLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICAgICAgICAgICAgcmVzb3VyY2VzVG9Ta2lwID0gcG9sbGVyLnJlc291cmNlRXJyb3JzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHIpID0+ICFyLmlzU3RhY2tFdmVudCAmJiByLnBhcmVudFN0YWNrTG9naWNhbElkcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPz8gJycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNraXBEZXNjcmlwdGlvbiA9IHJlc291cmNlc1RvU2tpcC5sZW5ndGggPiAwID8gYCAob3JwaGFuaW5nOiAke3Jlc291cmNlc1RvU2tpcC5qb2luKCcsICcpfSlgIDogJyc7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKGBDb250aW51aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX0ke3NraXBEZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICBhd2FpdCBjZm4uY29udGludWVVcGRhdGVSb2xsYmFjayh7XG4gICAgICAgICAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIFJvbGVBUk46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICAgICAgICBSZXNvdXJjZXNUb1NraXA6IHJlc291cmNlc1RvU2tpcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLlJPTExCQUNLX0ZBSUxFRDpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLndhcm4oXG4gICAgICAgICAgICBgU3RhY2sgJHtkZXBsb3lOYW1lfSBmYWlsZWQgY3JlYXRpb24gYW5kIHJvbGxiYWNrLiBUaGlzIHN0YXRlIGNhbm5vdCBiZSByb2xsZWQgYmFjay4gWW91IGNhbiByZWNyZWF0ZSB0aGlzIHN0YWNrIGJ5IHJ1bm5pbmcgJ2NkayBkZXBsb3knLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0Fybiwgbm90SW5Sb2xsYmFja2FibGVTdGF0ZTogdHJ1ZSB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVW5leHBlY3RlZFJvbGxiYWNrQ2hvaWNlJywgYFVuZXhwZWN0ZWQgcm9sbGJhY2sgY2hvaWNlOiAke2Nsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vbml0b3IgPSBuZXcgU3RhY2tBY3Rpdml0eU1vbml0b3Ioe1xuICAgICAgICBjZm4sXG4gICAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgICBzdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgIGlvSGVscGVyOiB0aGlzLmlvSGVscGVyLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBtb25pdG9yLnN0YXJ0KCk7XG5cbiAgICAgIGxldCBzdGFja0Vycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGZpbmFsU3RhY2tTdGF0ZSA9IGNsb3VkRm9ybWF0aW9uU3RhY2s7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWNjZXNzU3RhY2sgPSBhd2FpdCBzdGFiaWxpemVTdGFjayhjZm4sIHRoaXMuaW9IZWxwZXIsIGRlcGxveU5hbWUpO1xuXG4gICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4sIGJ1dCBjYXRjaCBpdCBhbnl3YXkuIFlvdSBuZXZlciBrbm93LlxuICAgICAgICBpZiAoIXN1Y2Nlc3NTdGFjaykge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1N0YWNrRGlzYXBwZWFyZWQnLCAnU3RhY2sgZGVwbG95IGZhaWxlZCAodGhlIHN0YWNrIGRpc2FwcGVhcmVkIHdoaWxlIHdlIHdlcmUgcm9sbGluZyBpdCBiYWNrKScpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsU3RhY2tTdGF0ZSA9IHN1Y2Nlc3NTdGFjaztcblxuICAgICAgICBjb25zdCBlcnJvcnMgPSBtb25pdG9yLmFsbEVycm9yTWVzc2FnZXMuam9pbignLCAnKTtcbiAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgIHN0YWNrRXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgc3RhY2tFcnJvck1lc3NhZ2UgPSBzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5hbGxFcnJvck1lc3NhZ2VzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IG1vbml0b3Iuc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxTdGFja1N0YXRlLnN0YWNrU3RhdHVzLmlzUm9sbGJhY2tTdWNjZXNzIHx8ICFzdGFja0Vycm9yTWVzc2FnZSkge1xuICAgICAgICByZXR1cm4geyBzdGFja0Fybiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICAvLyBFaXRoZXIgd2UgbmVlZCB0byBpZ25vcmUgc29tZSByZXNvdXJjZXMgdG8gY29udGludWUgdGhlIHJvbGxiYWNrLCBvciBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgaWYgKGZpbmFsU3RhY2tTdGF0ZS5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZSA9PT0gUm9sbGJhY2tDaG9pY2UuQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLICYmIG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzKSB7XG4gICAgICAgIC8vIERvIGFub3RoZXIgbG9vcC1kZS1sb29wXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICBgJHtzdGFja0Vycm9yTWVzc2FnZX0gKGZpeCBwcm9ibGVtIGFuZCByZXRyeSwgb3Igb3JwaGFuIHRoZXNlIHJlc291cmNlcyB1c2luZyAtLW9ycGhhbiBvciAtLWZvcmNlKWAsXG4gICAgICAgIG1vbml0b3Iucm9vdENhdXNlRXJyb3JDb2RlID8/ICdSb2xsYmFja0ZhaWxlZCcsXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgJ1JvbGxiYWNrU3RhbGxlZCcsXG4gICAgICBcIlJvbGxiYWNrIGRpZCBub3QgZmluaXNoIGFmdGVyIGEgbGFyZ2UgbnVtYmVyIG9mIGl0ZXJhdGlvbnM7IHN0b3BwaW5nIGJlY2F1c2UgaXQgbG9va3MgbGlrZSB3ZSdyZSBub3QgbWFraW5nIHByb2dyZXNzIGFueW1vcmUuIFlvdSBjYW4gcmV0cnkgaWYgcm9sbGJhY2sgd2FzIHByb2dyZXNzaW5nIGFzIGV4cGVjdGVkLlwiLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVzdHJveVN0YWNrKG9wdGlvbnM6IERlc3Ryb3lTdGFja09wdGlvbnMpIHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgIGNvbnN0IGV4ZWN1dGlvblJvbGVBcm4gPSBhd2FpdCBlbnYucmVwbGFjZVBsYWNlaG9sZGVycyhvcHRpb25zLnJvbGVBcm4gPz8gb3B0aW9ucy5zdGFjay5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4pO1xuXG4gICAgcmV0dXJuIGRlc3Ryb3lTdGFjayh7XG4gICAgICBzZGs6IGVudi5zZGssXG4gICAgICByb2xlQXJuOiBleGVjdXRpb25Sb2xlQXJuLFxuICAgICAgc3RhY2s6IG9wdGlvbnMuc3RhY2ssXG4gICAgICBkZXBsb3lOYW1lOiBvcHRpb25zLmRlcGxveU5hbWUsXG4gICAgfSwgdGhpcy5pb0hlbHBlcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhY2tFeGlzdHMob3B0aW9uczogU3RhY2tFeGlzdHNPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGVudjtcbiAgICBpZiAob3B0aW9ucy50cnlMb29rdXBSb2xlKSB7XG4gICAgICBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KG9wdGlvbnMuc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JSZWFkT25seVN0YWNrT3BlcmF0aW9ucyhvcHRpb25zLnN0YWNrKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCksIG9wdGlvbnMuZGVwbG95TmFtZSA/PyBvcHRpb25zLnN0YWNrLnN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHN0YWNrLmV4aXN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHNpbmdsZSBhc3NldCBmcm9tIGFuIGFzc2V0IG1hbmlmZXN0XG4gICAqXG4gICAqIElmIGFuIGFzc2VydCBtYW5pZmVzdCBhcnRpZmFjdCBpcyBnaXZlbiwgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAqIHdpbGwgYmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgY29uc3RyYWludHMgaW4gdGhhdCBtYW5pZmVzdCBhcnRpZmFjdC5cbiAgICogSWYgdGhhdCBpcyBub3QgbmVjZXNzYXJ5LCBgJ25vLXZlcnNpb24tdmFsaWRhdGlvbidgIGNhbiBiZSBwYXNzZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHN0eWxpc3RpYy9tYXgtbGVuXG4gIHB1YmxpYyBhc3luYyBidWlsZFNpbmdsZUFzc2V0KFxuICAgIGFzc2V0QXJ0aWZhY3Q6IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdCB8ICduby12ZXJzaW9uLXZhbGlkYXRpb24nLFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBCdWlsZFN0YWNrQXNzZXRzT3B0aW9ucyxcbiAgKSB7XG4gICAgaWYgKGFzc2V0QXJ0aWZhY3QgIT09ICduby12ZXJzaW9uLXZhbGlkYXRpb24nKSB7XG4gICAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JSZWFkT25seVN0YWNrT3BlcmF0aW9ucyhvcHRpb25zLnN0YWNrKTtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBhc3NldEFydGlmYWN0LnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLFxuICAgICAgICBhc3NldEFydGlmYWN0LmJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcixcbiAgICAgICAgZW52LnJlc291cmNlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRFbnZpcm9ubWVudCA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcblxuICAgIGNvbnN0IHB1Ymxpc2hlciA9IHRoaXMuY2FjaGVkUHVibGlzaGVyKGFzc2V0TWFuaWZlc3QsIHJlc29sdmVkRW52aXJvbm1lbnQsIG9wdGlvbnMuc3RhY2tOYW1lKTtcbiAgICBhd2FpdCBwdWJsaXNoZXIuYnVpbGRFbnRyeShhc3NldCk7XG4gICAgaWYgKHB1Ymxpc2hlci5oYXNGYWlsdXJlcykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQXNzZXRCdWlsZEZhaWxlZCcsIGBGYWlsZWQgdG8gYnVpbGQgYXNzZXQgJHthc3NldC5kaXNwbGF5TmFtZShmYWxzZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBzaW5nbGUgYXNzZXQgZnJvbSBhbiBhc3NldCBtYW5pZmVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2hTaW5nbGVBc3NldChcbiAgICBhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsXG4gICAgYXNzZXQ6IGNka19hc3NldHMuSU1hbmlmZXN0RW50cnksXG4gICAgb3B0aW9uczogUHVibGlzaFN0YWNrQXNzZXRzT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc3RhY2tFbnYgPSBhd2FpdCB0aGlzLmVudnMucmVzb2x2ZVN0YWNrRW52aXJvbm1lbnQob3B0aW9ucy5zdGFjayk7XG5cbiAgICAvLyBObyBuZWVkIHRvIHZhbGlkYXRlIGFueW1vcmUsIHdlIGFscmVhZHkgZGlkIHRoYXQgZHVyaW5nIGJ1aWxkXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgc3RhY2tFbnYsIG9wdGlvbnMuc3RhY2tOYW1lKTtcbiAgICBhd2FpdCBwdWJsaXNoZXIucHVibGlzaEVudHJ5KGFzc2V0LCB7XG4gICAgICBhbGxvd0Nyb3NzQWNjb3VudDogYXdhaXQgdGhpcy5hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZ0ZvckVudihvcHRpb25zLnN0YWNrKSxcbiAgICAgIGZvcmNlOiBvcHRpb25zLmZvcmNlUHVibGlzaCxcbiAgICB9KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBUb29sa2l0RXJyb3Iud2l0aENhdXNlKCdBc3NldFB1Ymxpc2hGYWlsZWQnLCBgRmFpbGVkIHRvIHB1Ymxpc2ggYXNzZXQgJHthc3NldC5kaXNwbGF5TmFtZSh0cnVlKX1gLCBuZXcgQWdncmVnYXRlRXJyb3IocHVibGlzaGVyLmZhaWx1cmVzLm1hcChmID0+IGYuZXJyb3IpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZ0ZvckVudihzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuX2FsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKHN0YWNrKTtcbiAgICAgIHRoaXMuX2FsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nID0gYXdhaXQgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcoZW52LnNkaywgdGhpcy5pb0hlbHBlciwgdGhpcy5wcm9wcy50b29sa2l0U3RhY2tOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIGEgc2luZ2xlIGFzc2V0IGhhcyBiZWVuIHB1Ymxpc2hlZCBhbHJlYWR5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaXNTaW5nbGVBc3NldFB1Ymxpc2hlZChcbiAgICBhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsXG4gICAgYXNzZXQ6IGNka19hc3NldHMuSU1hbmlmZXN0RW50cnksXG4gICAgb3B0aW9uczogUHVibGlzaFN0YWNrQXNzZXRzT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc3RhY2tFbnYgPSBhd2FpdCB0aGlzLmVudnMucmVzb2x2ZVN0YWNrRW52aXJvbm1lbnQob3B0aW9ucy5zdGFjayk7XG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgc3RhY2tFbnYsIG9wdGlvbnMuc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gcHVibGlzaGVyLmlzRW50cnlQdWJsaXNoZWQoYXNzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIGJvb3RzdHJhcCBzdGFjayBoYXMgdGhlIHJpZ2h0IHZlcnNpb24gZm9yIHRoaXMgc3RhY2tcbiAgICpcbiAgICogQ2FsbCBpbnRvIGVudlJlc291cmNlcy52YWxpZGF0ZVZlcnNpb24sIGJ1dCBwcmVwZW5kIHRoZSBzdGFjayBuYW1lIGluIGNhc2Ugb2YgZmFpbHVyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgcmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBlbnZSZXNvdXJjZXM6IEVudmlyb25tZW50UmVzb3VyY2VzLFxuICApIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW52UmVzb3VyY2VzLnZhbGlkYXRlVmVyc2lvbihyZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbiwgYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Jvb3RzdHJhcFZlcnNpb25WYWxpZGF0aW9uJywgYCR7c3RhY2tOYW1lfTogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LCBlbnY6IGN4YXBpLkVudmlyb25tZW50LCBzdGFja05hbWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucHVibGlzaGVyQ2FjaGUuZ2V0KGFzc2V0TWFuaWZlc3QpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSBzdGFja05hbWUgPyBgJHtjaGFsay5ib2xkKHN0YWNrTmFtZSl9OiBgIDogJyc7XG4gICAgY29uc3QgcHVibGlzaGVyID0gbmV3IGNka19hc3NldHMuQXNzZXRQdWJsaXNoaW5nKGFzc2V0TWFuaWZlc3QsIHtcbiAgICAgIC8vIFRoZSBBc3NldFB1Ymxpc2hpbmcgY2xhc3MgdGFrZXMgY2FyZSBvZiByb2xlIGFzc3VtaW5nIGV0Yywgc28gaXQncyBva2F5IHRvXG4gICAgICAvLyBnaXZlIGl0IGEgZGlyZWN0IGBTZGtQcm92aWRlcmAuXG4gICAgICBhd3M6IG5ldyBQdWJsaXNoaW5nQXdzKHRoaXMuYXNzZXRTZGtQcm92aWRlciwgZW52KSxcbiAgICAgIHByb2dyZXNzTGlzdGVuZXI6IG5ldyBQYXJhbGxlbFNhZmVBc3NldFByb2dyZXNzKHByZWZpeCwgdGhpcy5pb0hlbHBlciksXG4gICAgfSk7XG4gICAgdGhpcy5wdWJsaXNoZXJDYWNoZS5zZXQoYXNzZXRNYW5pZmVzdCwgcHVibGlzaGVyKTtcbiAgICByZXR1cm4gcHVibGlzaGVyO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXQgcHJvZ3Jlc3MgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nIHdpdGggcGVyY2VudGFnZXMgKGN1cnJlbnRseSlcbiAqL1xuY2xhc3MgUGFyYWxsZWxTYWZlQXNzZXRQcm9ncmVzcyBleHRlbmRzIEJhc2VQdWJsaXNoUHJvZ3Jlc3NMaXN0ZW5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJlZml4OiBzdHJpbmcsIGlvSGVscGVyOiBJb0hlbHBlcikge1xuICAgIHN1cGVyKGlvSGVscGVyKTtcbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRNZXNzYWdlKHR5cGU6IGNka19hc3NldHMuRXZlbnRUeXBlLCBldmVudDogY2RrX2Fzc2V0cy5JUHVibGlzaFByb2dyZXNzKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHt0eXBlfTogJHtldmVudC5tZXNzYWdlfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VmZml4V2l0aEVycm9ycyhtc2c6IHN0cmluZywgZXJyb3JzPzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCA/IGAke21zZ306ICR7ZXJyb3JzLmpvaW4oJywgJyl9YCA6IG1zZztcbn1cbiJdfQ==
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFDcEMsc0RBQXNEO0FBR3RELCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHVDQUttQjtBQUNuQixxQ0FBcUU7QUFFckUsaURBQTJEO0FBRzNELHNGQUFnRztBQUNoRywrREFBNEU7QUFDNUUscUNBQWdEO0FBTWhELHNEQUsyQjtBQUMzQixtRUFBNkU7QUFDN0UsZ0RBQThFO0FBRzlFLHlGQUEyRjtBQUMzRixrREFBb0c7QUFFcEcsa0RBQTZEO0FBRTdELE1BQU0sb0NBQW9DLEdBQUcsRUFBRSxDQUFDO0FBc09oRDs7OztHQUlHO0FBQ0gsTUFBYSxXQUFXO0lBNkJPO0lBNUJiLElBQUksQ0FBb0I7SUFFeEM7Ozs7Ozs7T0FPRztJQUNjLGdCQUFnQixDQUFjO0lBRS9DOzs7Ozs7O09BT0c7SUFDYyxzQkFBc0IsQ0FBYztJQUVwQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQXdELENBQUM7SUFFMUYsaUNBQWlDLENBQXNCO0lBRTlDLFFBQVEsQ0FBVztJQUVwQyxZQUE2QixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLCtCQUFpQixDQUMvQixLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsZ0JBQWdCLElBQUkseUNBQTBCLEVBQ3BELElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FB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O0lBRWhDLFlBQVksTUFBYyxFQUFFLFFBQWtCO1FBQzVDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRVMsVUFBVSxDQUFDLElBQTBCLEVBQUUsS0FBa0M7UUFDakYsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxNQUFpQjtJQUN0RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgY2RrX2Fzc2V0cyBmcm9tICdAYXdzLWNkay9jZGstYXNzZXRzLWxpYic7XG5pbXBvcnQgdHlwZSAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZE91dHB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBBc3NldE1hbmlmZXN0QnVpbGRlciB9IGZyb20gJy4vYXNzZXQtbWFuaWZlc3QtYnVpbGRlcic7XG5pbXBvcnQge1xuICBCYXNlUHVibGlzaFByb2dyZXNzTGlzdGVuZXIsXG4gIFB1Ymxpc2hpbmdBd3MsXG59IGZyb20gJy4vYXNzZXQtcHVibGlzaGluZyc7XG5pbXBvcnQge1xuICBzdGFiaWxpemVTdGFjayxcbiAgdXBsb2FkU3RhY2tUZW1wbGF0ZUFzc2V0cyxcbiAgd2FpdEZvckNoYW5nZVNldCxcbiAgd2FpdEZvclN0YWNrRGVsZXRlLFxufSBmcm9tICcuL2Nmbi1hcGknO1xuaW1wb3J0IHsgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgfSBmcm9tICcuL2NoZWNrcyc7XG5cbmltcG9ydCB7IGRlcGxveVN0YWNrLCBkZXN0cm95U3RhY2sgfSBmcm9tICcuL2RlcGxveS1zdGFjayc7XG5pbXBvcnQgdHlwZSB7IERlcGxveVN0YWNrUmVzdWx0LCBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfSBmcm9tICcuL2RlcGxveW1lbnQtcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlU2V0RGVwbG95bWVudCwgRGVwbG95bWVudE1ldGhvZCB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGVwbG95JztcbmltcG9ydCB7IERFRkFVTFRfREVQTE9ZX0NIQU5HRV9TRVRfTkFNRSB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGVwbG95L3ByaXZhdGUvZGVwbG95bWVudC1tZXRob2QnO1xuaW1wb3J0IHsgRGVwbG95bWVudEVycm9yLCBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIFRlbXBsYXRlLFxuICBSb290VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLFxufSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQge1xuICBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICBsb2FkQ3VycmVudFRlbXBsYXRlLFxuICBsb2FkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyxcbiAgbWFrZUJvZHlQYXJhbWV0ZXIsXG59IGZyb20gJy4uL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIgfSBmcm9tICcuLi9kaWFnbm9zaW5nL3N0YWNrLWRpYWdub3Nlcic7XG5pbXBvcnQgeyB0eXBlIEVudmlyb25tZW50UmVzb3VyY2VzLCBFbnZpcm9ubWVudEFjY2VzcyB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzLCBSZXNvdXJjZXNUb0ltcG9ydCB9IGZyb20gJy4uL3Jlc291cmNlLWltcG9ydCc7XG5pbXBvcnQgeyBTdGFja0FydGlmYWN0U291cmNlVHJhY2VyIH0gZnJvbSAnLi4vc291cmNlLXRyYWNpbmcvcHJpdmF0ZS9zdGFjay1zb3VyY2UtdHJhY2luZyc7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5TW9uaXRvciwgU3RhY2tFdmVudFBvbGxlciwgUm9sbGJhY2tDaG9pY2UsIFBvbGxSYW5nZSB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gJy4uL3RhZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUgfSBmcm9tICcuLi90b29sa2l0LWluZm8nO1xuXG5jb25zdCBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0sgPSAyMztcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gZGVwbG95XG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvcGljIEFSTnMgdG8gc2VuZCBhIG1lc3NhZ2Ugd2hlbiBkZXBsb3ltZW50IGZpbmlzaGVzIChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uQXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBuYW1lIHVuZGVyIHdoaWNoIHN0YWNrIHdpbGwgYmUgZGVwbG95ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgYXJ0aWZhY3QgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGQgTk9UIGJlIGJ1aWx0IG9yIHVwbG9hZGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGRlcGxveW1lbnQgbWV0aG9kIChkaXJlY3Qgb3IgdXNpbmcgYSBjaGFuZ2Ugc2V0KVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIENoYW5nZSBzZXQgd2l0aCBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNZXRob2Q/OiBEZXBsb3ltZW50TWV0aG9kO1xuXG4gIC8qKlxuICAgKiBGb3JjZSBkZXBsb3ltZW50LCBldmVuIGlmIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZSBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gZGVwbG95LlxuICAgKiBAZGVmYXVsdCBmYWxzZSBkZXBsb3ltZW50IHdpbGwgYmUgc2tpcHBlZCBpZiB0aGUgdGVtcGxhdGUgaXMgaWRlbnRpY2FsXG4gICAqL1xuICByZWFkb25seSBmb3JjZURlcGxveW1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGV4dHJhIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyIHdoZW4gcGVyZm9ybWluZyBBV1MgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdGhpbmcgZXh0cmEgaXMgYXBwZW5kZWQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBleHRyYVVzZXJBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBleGlzdGluZyByZXNvdXJjZXMgdG8gYmUgSU1QT1JURUQgaW50byB0aGUgc3RhY2ssIGluc3RlYWQgb2YgYmVpbmcgQ1JFQVRFRFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzVG9JbXBvcnQ/OiBSZXNvdXJjZXNUb0ltcG9ydDtcblxuICAvKipcbiAgICogSWYgcHJlc2VudCwgdXNlIHRoaXMgZ2l2ZW4gdGVtcGxhdGUgaW5zdGVhZCBvZiB0aGUgc3RvcmVkIG9uZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSB0aGUgc3RvcmVkIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZVRlbXBsYXRlPzogYW55O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGJ1aWxkL3B1Ymxpc2ggYXNzZXRzIGluIHBhcmFsbGVsXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWUgVG8gcmVtYWluIGJhY2t3YXJkIGNvbXBhdGlibGUuXG4gICAqL1xuICByZWFkb25seSBhc3NldFBhcmFsbGVsaXNtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlU3RhY2tPcHRpb25zIGV4dGVuZHMgT21pdDxEZXBsb3lTdGFja09wdGlvbnMsICdkZXBsb3ltZW50TWV0aG9kJz4ge1xuICAvKipcbiAgICogVGhlIGNoYW5nZS1zZXQgZGVwbG95bWVudCBtZXRob2QgdG8gdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZDogQ2hhbmdlU2V0RGVwbG95bWVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbGVhbiB1cCB0aGUgY2hhbmdlIHNldCBpZiBpdCBoYXMgbm8gY2hhbmdlcy5cbiAgICpcbiAgICogU2V0IHRvIHRydWUgd2hlbiB0aGUgY2FsbGVyIGZvcmNlZCBleGVjdXRlOiBmYWxzZSBpbnRlcm5hbGx5XG4gICAqICh0d28tcGhhc2UgZGVwbG95KS4gU2V0IHRvIGZhbHNlIHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseVxuICAgKiBhc2tlZCBmb3IgLS1uby1leGVjdXRlIChwcmVwYXJlLWNoYW5nZS1zZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cE9uTm9PcD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sbGJhY2tTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gcm9sbCBiYWNrXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2ssIGlmIG5vdCB0aGUgZGVmYXVsdCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDREtUb29sa2l0J1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IG9ycGhhbiBhbGwgZmFpbGVkIHJlc291cmNlcyBkdXJpbmcgdGhlIHJvbGxiYWNrXG4gICAqXG4gICAqIFRoaXMgd2lsbCBmb3JjZSBhIHJvbGxiYWNrIHRoYXQgb3RoZXJ3aXNlIHdvdWxkIGhhdmUgZmFpbGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JwaGFuRmFpbGVkUmVzb3VyY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3JwaGFuIHRoZSByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBJRHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBvcnBoYW5pbmdcbiAgICovXG4gIHJlYWRvbmx5IG9ycGhhbkxvZ2ljYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHBlcm1pc3Npb25zXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUm9sbGJhY2tTdGFja1Jlc3VsdCA9IHsgcmVhZG9ubHkgc3RhY2tBcm46IHN0cmluZyB9ICYgKFxuICB8IHsgcmVhZG9ubHkgbm90SW5Sb2xsYmFja2FibGVTdGF0ZTogdHJ1ZSB9XG4gIHwgeyByZWFkb25seSBzdWNjZXNzOiB0cnVlOyBub3RJblJvbGxiYWNrYWJsZVN0YXRlPzogdW5kZWZpbmVkIH1cbik7XG5cbmludGVyZmFjZSBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgd2l0aCBhc3NldHMgdG8gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGJ1aWxkaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFN0YWNrQXNzZXRzT3B0aW9ucyBleHRlbmRzIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayBuYW1lIHRoaXMgYXNzZXQgaXMgZm9yXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zIGV4dGVuZHMgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIG5hbWUgdGhpcyBhc3NldCBpcyBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWx3YXlzIHB1Ymxpc2gsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlUHVibGlzaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJveVN0YWNrT3B0aW9ucyB7XG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tFeGlzdHNPcHRpb25zIHtcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgZGVwbG95TmFtZT86IHN0cmluZztcbiAgdHJ5TG9va3VwUm9sZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudHNQcm9wcyB7XG4gIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xufVxuXG4vKipcbiAqIFNjb3BlIGZvciBhIHNpbmdsZSBzZXQgb2YgZGVwbG95bWVudHMgZnJvbSBhIHNldCBvZiBDbG91ZCBBc3NlbWJseSBBcnRpZmFjdHNcbiAqXG4gKiBNYW5hZ2VzIGxvb2t1cCBvZiBTREtzLCBCb290c3RyYXAgc3RhY2tzLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50cyB7XG4gIHB1YmxpYyByZWFkb25seSBlbnZzOiBFbnZpcm9ubWVudEFjY2VzcztcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIGZvciBhc3NldCBwdWJsaXNoaW5nIChkbyBub3QgdXNlIGZvciBhbnl0aGluZyBlbHNlKS5cbiAgICpcbiAgICogVGhpcyBTREsgcHJvdmlkZXIgaXMgb25seSBhbGxvd2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQgcHVycG9zZSwgbm90aGluZyBlbHNlLlxuICAgKlxuICAgKiBJdCdzIG5vdCBhIGRpZmZlcmVudCBvYmplY3QsIGJ1dCB0aGUgZmllbGQgbmFtZSBzaG91bGQgaW1wbHkgdGhhdCB0aGlzXG4gICAqIG9iamVjdCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGV4Y2VwdCB0byBwYXNzIHRvIGFzc2V0IGhhbmRsaW5nIHJvdXRpbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NldFNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIGZvciBwYXNzaW5nIHRvIGRlcGxveVN0YWNrXG4gICAqXG4gICAqIFRoaXMgU0RLIHByb3ZpZGVyIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UsIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogSXQncyBub3QgYSBkaWZmZXJlbnQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIG5hbWUgc2hvdWxkIGltcGx5IHRoYXQgdGhpc1xuICAgKiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBleGNlcHQgdG8gcGFzcyB0byBgZGVwbG95U3RhY2tgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3lTdGFja1Nka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHB1Ymxpc2hlckNhY2hlID0gbmV3IE1hcDxjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGNka19hc3NldHMuQXNzZXRQdWJsaXNoaW5nPigpO1xuXG4gIHByaXZhdGUgX2FsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IERlcGxveW1lbnRzUHJvcHMpIHtcbiAgICB0aGlzLmFzc2V0U2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmRlcGxveVN0YWNrU2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmlvSGVscGVyID0gcHJvcHMuaW9IZWxwZXI7XG4gICAgdGhpcy5lbnZzID0gbmV3IEVudmlyb25tZW50QWNjZXNzKFxuICAgICAgcHJvcHMuc2RrUHJvdmlkZXIsXG4gICAgICBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLFxuICAgICAgdGhpcy5pb0hlbHBlcixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBlbnZpcm9ubWVudCBmb3IgYSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8Y3hhcGkuRW52aXJvbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KHN0YWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhcbiAgICByb290U3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxSb290VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzPiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTG9va3VwQmVzdEVmZm9ydChyb290U3RhY2tBcnRpZmFjdCk7XG4gICAgcmV0dXJuIGxvYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzKHJvb3RTdGFja0FydGlmYWN0LCBlbnYuc2RrLCByZXRyaWV2ZVByb2Nlc3NlZFRlbXBsYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBSZWFkaW5nIGV4aXN0aW5nIHRlbXBsYXRlIGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApO1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQoc3RhY2tBcnRpZmFjdCk7XG4gICAgcmV0dXJuIGxvYWRDdXJyZW50VGVtcGxhdGUoc3RhY2tBcnRpZmFjdCwgZW52LnNkayk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKFxuICAgIHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgKTogUHJvbWlzZTxSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXM+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBSZXRyaWV2aW5nIHRlbXBsYXRlIHN1bW1hcnkgZm9yIHN0YWNrICR7c3RhY2tBcnRpZmFjdC5kaXNwbGF5TmFtZX0uYCk7XG4gICAgLy8gQ3VycmVudGx5LCBuZWVkcyB0byB1c2UgYGRlcGxveS1yb2xlYCBzaW5jZSBpdCBtYXkgbmVlZCB0byByZWFkIHRlbXBsYXRlcyBpbiB0aGUgc3RhZ2luZ1xuICAgIC8vIGJ1Y2tldCB3aGljaCBoYXZlIGJlZW4gZW5jcnlwdGVkIHdpdGggYSBLTVMga2V5IChhbmQgbG9va3VwLXJvbGUgbWF5IG5vdCByZWFkIGVuY3J5cHRlZCB0aGluZ3MpXG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2tBcnRpZmFjdCk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gICAgYXdhaXQgdXBsb2FkU3RhY2tUZW1wbGF0ZUFzc2V0cyhzdGFja0FydGlmYWN0LCB0aGlzKTtcblxuICAgIC8vIFVwbG9hZCB0aGUgdGVtcGxhdGUsIGlmIG5lY2Vzc2FyeSwgYmVmb3JlIHBhc3NpbmcgaXQgdG8gQ0ZOXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICAgIGNvbnN0IGNmblBhcmFtID0gYXdhaXQgbWFrZUJvZHlQYXJhbWV0ZXIoXG4gICAgICB0aGlzLmlvSGVscGVyLFxuICAgICAgc3RhY2tBcnRpZmFjdCxcbiAgICAgIGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgYnVpbGRlcixcbiAgICAgIGVudi5yZXNvdXJjZXMsXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSBgbWFrZUJvZHlQYXJhbWV0ZXJgIGJlZm9yZSB0aGlzIGFkZGVkIGFzc2V0cywgbWFrZSBzdXJlIHRvIHB1Ymxpc2ggdGhlbSBiZWZvcmVcbiAgICAvLyBjYWxsaW5nIHRoZSBBUEkuXG4gICAgY29uc3QgYWRkZWRBc3NldHMgPSBidWlsZGVyLnRvTWFuaWZlc3Qoc3RhY2tBcnRpZmFjdC5hc3NlbWJseS5kaXJlY3RvcnkpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWRkZWRBc3NldHMuZW50cmllcykge1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFNpbmdsZUFzc2V0KCduby12ZXJzaW9uLXZhbGlkYXRpb24nLCBhZGRlZEFzc2V0cywgZW50cnksIHtcbiAgICAgICAgc3RhY2s6IHN0YWNrQXJ0aWZhY3QsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaFNpbmdsZUFzc2V0KGFkZGVkQXNzZXRzLCBlbnRyeSwge1xuICAgICAgICBzdGFjazogc3RhY2tBcnRpZmFjdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2ZuLmdldFRlbXBsYXRlU3VtbWFyeShjZm5QYXJhbSk7XG4gICAgaWYgKCFyZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcoJ0dldFRlbXBsYXRlU3VtbWFyeSBBUEkgY2FsbCBkaWQgbm90IHJldHVybiBcIlJlc291cmNlSWRlbnRpZmllclN1bW1hcmllc1wiJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG5cbiAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICBvcHRpb25zLnN0YWNrLnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLFxuICAgICAgb3B0aW9ucy5zdGFjay5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICBlbnYucmVzb3VyY2VzKTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJvbGVBcm4gPSBhd2FpdCBlbnYucmVwbGFjZVBsYWNlaG9sZGVycyhvcHRpb25zLnJvbGVBcm4gPz8gb3B0aW9ucy5zdGFjay5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4pO1xuXG4gICAgcmV0dXJuIGRlcGxveVN0YWNrKHtcbiAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgcmVzb2x2ZWRFbnZpcm9ubWVudDogZW52LnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgICBkZXBsb3lOYW1lOiBvcHRpb25zLmRlcGxveU5hbWUsXG4gICAgICBub3RpZmljYXRpb25Bcm5zOiBvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMsXG4gICAgICBzZGs6IGVudi5zZGssXG4gICAgICBzZGtQcm92aWRlcjogdGhpcy5kZXBsb3lTdGFja1Nka1Byb3ZpZGVyLFxuICAgICAgcm9sZUFybjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIHJldXNlQXNzZXRzOiBvcHRpb25zLnJldXNlQXNzZXRzLFxuICAgICAgZW52UmVzb3VyY2VzOiBlbnYucmVzb3VyY2VzLFxuICAgICAgdGFnczogb3B0aW9ucy50YWdzLFxuICAgICAgZGVwbG95bWVudE1ldGhvZDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgZm9yY2VEZXBsb3ltZW50OiBvcHRpb25zLmZvcmNlRGVwbG95bWVudCxcbiAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMsXG4gICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgcmVzb3VyY2VzVG9JbXBvcnQ6IG9wdGlvbnMucmVzb3VyY2VzVG9JbXBvcnQsXG4gICAgICBvdmVycmlkZVRlbXBsYXRlOiBvcHRpb25zLm92ZXJyaWRlVGVtcGxhdGUsXG4gICAgICBhc3NldFBhcmFsbGVsaXNtOiBvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20sXG4gICAgICBkaWFnbm9zZXI6IG5ldyBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyKHtcbiAgICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IGVudi5yZXNvdXJjZXMsXG4gICAgICAgIHNvdXJjZVRyYWNlcjogbmV3IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIob3B0aW9ucy5zdGFjayksXG4gICAgICAgIGlvSGVscGVyOiB0aGlzLmlvSGVscGVyLFxuICAgICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IG9wdGlvbnMuc3RhY2suaGllcmFyY2hpY2FsSWQsXG4gICAgICB9KSxcbiAgICB9LCB0aGlzLmlvSGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjaGFuZ2Ugc2V0IGZvciBhIHN0YWNrIHdpdGhvdXQgZXhlY3V0aW5nIGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgaWYgdGhlIGNoYW5nZSBzZXQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBvciB1bmRlZmluZWRcbiAgICogaWYgdGhlIHByZXBhcmUgcmV0dXJuZWQgYSBub24tc3VjY2VzcyByZXN1bHQgKGUuZy4gcm9sbGJhY2sgbmVlZGVkKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlU3RhY2soXG4gICAgb3B0aW9uczogUHJlcGFyZVN0YWNrT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveVN0YWNrKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXBsb3ltZW50TWV0aG9kOiB7IC4uLm9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCwgZXhlY3V0ZTogZmFsc2UgfSxcbiAgICB9KTtcblxuICAgIC8vIFdpdGggZXhlY3V0ZTogZmFsc2UsIHRoZSBvbmx5IHBvc3NpYmxlIHJlc3VsdCB0eXBlIGlzIGRpZC1kZXBsb3ktc3RhY2tcbiAgICAvLyAoZWl0aGVyIG5vT3AgZm9yIGVtcHR5IGNoYW5nZSBzZXRzLCBvciB3aXRoIGEgY2hhbmdlU2V0IGRlc2NyaXB0aW9uKS5cbiAgICAvLyBSb2xsYmFjay9yZXBsYWNlbWVudCBjaGVja3MgYXJlIG9ubHkgcmVhY2hlZCB3aGVuIGV4ZWN1dGluZy5cbiAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdkaWQtZGVwbG95LXN0YWNrJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBlbXB0eSBjaGFuZ2Ugc2V0cyBpZiByZXF1ZXN0ZWQgKGkuZS4gd2hlbiB0aGUgY2FsbGVyIGZvcmNlZFxuICAgIC8vIGV4ZWN1dGU6IGZhbHNlIGludGVybmFsbHksIG5vdCB3aGVuIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIC0tbm8tZXhlY3V0ZSkuXG4gICAgaWYgKHJlc3VsdC5ub09wICYmIG9wdGlvbnMuY2xlYW51cE9uTm9PcCkge1xuICAgICAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZC5jaGFuZ2VTZXROYW1lID8/IERFRkFVTFRfREVQTE9ZX0NIQU5HRV9TRVRfTkFNRTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENoYW5nZVNldChvcHRpb25zLnN0YWNrLCBjaGFuZ2VTZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGEgY2hhbmdlIHNldCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHByZXBhcmVTdGFjayBidXQgbmV2ZXIgZXhlY3V0ZWQuXG4gICAqIElmIHRoZSBzdGFjayB3YXMgY3JlYXRlZCBpbiBSRVZJRVdfSU5fUFJPR1JFU1Mgc3RhdGUgKG5ldyBzdGFjayksIGRlbGV0ZSB0aGUgc3RhY2sgdG9vLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFudXBDaGFuZ2VTZXQoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCwgY2hhbmdlU2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhzdGFjayk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgIGNvbnN0IGRlcGxveU5hbWUgPSBzdGFjay5zdGFja05hbWU7XG5cbiAgICBjb25zdCBjbG91ZEZvcm1hdGlvblN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgICBpZiAoIWNsb3VkRm9ybWF0aW9uU3RhY2suZXhpc3RzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgY2ZuLmRlbGV0ZUNoYW5nZVNldCh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSwgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSB9KTtcblxuICAgIC8vIElmIHRoZSBzdGFjayB3YXMgbmV3bHkgY3JlYXRlZCBmb3IgdGhpcyBjaGFuZ2Ugc2V0LCBpdCB3aWxsIGJlIGluIFJFVklFV19JTl9QUk9HUkVTUy5cbiAgICAvLyBEZWxldGUgaXQgYW5kIHdhaXQgZm9yIHRoZSBkZWxldGlvbiB0byBjb21wbGV0ZSBzbyB3ZSBkb24ndCBsZWF2ZSBhbiBlbXB0eSBzdGFjayBiZWhpbmQuXG4gICAgaWYgKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMubmFtZSA9PT0gJ1JFVklFV19JTl9QUk9HUkVTUycpIHtcbiAgICAgIGF3YWl0IGNmbi5kZWxldGVTdGFjayh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSB9KTtcbiAgICAgIGF3YWl0IHdhaXRGb3JTdGFja0RlbGV0ZShjZm4sIHRoaXMuaW9IZWxwZXIsIGRlcGxveU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXNjcmliZUNoYW5nZVNldChzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBjaGFuZ2VTZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZE91dHB1dD4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICByZXR1cm4gd2FpdEZvckNoYW5nZVNldChjZm4sIHRoaXMuaW9IZWxwZXIsIHN0YWNrLnN0YWNrTmFtZSwgY2hhbmdlU2V0TmFtZSwge1xuICAgICAgZmV0Y2hBbGw6IHRydWUsXG4gICAgICBkaWFnbm9zZXI6IG5ldyBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyKHtcbiAgICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IGVudi5yZXNvdXJjZXMsXG4gICAgICAgIHNvdXJjZVRyYWNlcjogbmV3IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIoc3RhY2spLFxuICAgICAgICBpb0hlbHBlcjogdGhpcy5pb0hlbHBlcixcbiAgICAgICAgdG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJvbGxiYWNrU3RhY2sob3B0aW9uczogUm9sbGJhY2tTdGFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrU3RhY2tSZXN1bHQ+IHtcbiAgICBsZXQgcmVzb3VyY2VzVG9Ta2lwOiBzdHJpbmdbXSA9IG9wdGlvbnMub3JwaGFuTG9naWNhbElkcyA/PyBbXTtcbiAgICBpZiAob3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMgJiYgcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmZsaWN0aW5nUm9sbGJhY2tPcHRpb25zJywgJ0Nhbm5vdCBjb21iaW5lIC0tZm9yY2Ugd2l0aCAtLW9ycGhhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG5cbiAgICBpZiAob3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbiA/PyB0cnVlKSB7XG4gICAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0ssXG4gICAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm4gPSBlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuXG4gICAgLy8gV2UgbG9vcCBpbiBjYXNlIG9mIGAtLWZvcmNlYCBhbmQgdGhlIHN0YWNrIGVuZHMgdXAgaW4gYENPTlRJTlVFX1VQREFURV9ST0xMQkFDS2AuXG4gICAgbGV0IG1heExvb3BzID0gMTA7XG4gICAgd2hpbGUgKG1heExvb3BzLS0pIHtcbiAgICAgIGNvbnN0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICAgICAgY29uc3Qgc3RhY2tBcm4gPSBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQ7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvblJvbGVBcm4gPSBhd2FpdCBlbnYucmVwbGFjZVBsYWNlaG9sZGVycyhvcHRpb25zLnJvbGVBcm4gPz8gb3B0aW9ucy5zdGFjay5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4pO1xuXG4gICAgICBzd2l0Y2ggKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UpIHtcbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5OT05FOlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMud2FybihgU3RhY2sgJHtkZXBsb3lOYW1lfSBkb2VzIG5vdCBuZWVkIGEgcm9sbGJhY2s6ICR7Y2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1c31gKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBJbml0aWF0aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX1gKTtcbiAgICAgICAgICBhd2FpdCBjZm4ucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgICAgICBSb2xlQVJOOiBleGVjdXRpb25Sb2xlQXJuLFxuICAgICAgICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICAvLyBFbmFibGluZyB0aGlzIGlzIGp1c3QgdGhlIGJldHRlciBvdmVyYWxsIGRlZmF1bHQsIHRoZSBvbmx5IHJlYXNvbiBpdCBpc24ndCB0aGUgdXBzdHJlYW0gZGVmYXVsdCBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgUmV0YWluRXhjZXB0T25DcmVhdGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5DT05USU5VRV9VUERBVEVfUk9MTEJBQ0s6XG4gICAgICAgICAgaWYgKG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBmYWlsZWQgcmVzb3VyY2VzIGZyb20gdGhlIGRlcGxveW1lbnQgYW5kIGF1dG9tYXRpY2FsbHkgc2tpcCB0aGVtXG4gICAgICAgICAgICAvLyAoVXNpbmcgZGVwbG95bWVudCBsb2cgYmVjYXVzZSB3ZSBkZWZpbml0ZWx5IGhhdmUgYERlc2NyaWJlU3RhY2tFdmVudHNgIHBlcm1pc3Npb25zLCBhbmQgd2UgbWlnaHQgbm90IGhhdmVcbiAgICAgICAgICAgIC8vIGBEZXNjcmliZVN0YWNrUmVzb3VyY2VzYCBwZXJtaXNzaW9ucykuXG4gICAgICAgICAgICBjb25zdCBwb2xsZXIgPSBuZXcgU3RhY2tFdmVudFBvbGxlcihjZm4sIHtcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgICBpbml0aWFsUG9sbFJhbmdlOiBQb2xsUmFuZ2Uuc2luY2VTdGFja1N0YXR1cyhbJ1JPTExCQUNLX0lOX1BST0dSRVNTJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUyddKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgICAgICAgIHJlc291cmNlc1RvU2tpcCA9IHBvbGxlci5yZXNvdXJjZUVycm9yc1xuICAgICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLnBhcmVudFN0YWNrTG9naWNhbElkcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+IHIubG9naWNhbElkKVxuICAgICAgICAgICAgICAuZmlsdGVyKChpZCkgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2tpcERlc2NyaXB0aW9uID0gcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDAgPyBgIChvcnBoYW5pbmc6ICR7cmVzb3VyY2VzVG9Ta2lwLmpvaW4oJywgJyl9KWAgOiAnJztcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLndhcm4oYENvbnRpbnVpbmcgcm9sbGJhY2sgb2Ygc3RhY2sgJHtkZXBsb3lOYW1lfSR7c2tpcERlc2NyaXB0aW9ufWApO1xuICAgICAgICAgIGF3YWl0IGNmbi5jb250aW51ZVVwZGF0ZVJvbGxiYWNrKHtcbiAgICAgICAgICAgIFN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgUm9sZUFSTjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgICAgICAgIFJlc291cmNlc1RvU2tpcDogcmVzb3VyY2VzVG9Ta2lwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuUk9MTEJBQ0tfRkFJTEVEOlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMud2FybihcbiAgICAgICAgICAgIGBTdGFjayAke2RlcGxveU5hbWV9IGZhaWxlZCBjcmVhdGlvbiBhbmQgcm9sbGJhY2suIFRoaXMgc3RhdGUgY2Fubm90IGJlIHJvbGxlZCBiYWNrLiBZb3UgY2FuIHJlY3JlYXRlIHRoaXMgc3RhY2sgYnkgcnVubmluZyAnY2RrIGRlcGxveScuYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHN0YWNrQXJuLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdVbmV4cGVjdGVkUm9sbGJhY2tDaG9pY2UnLCBgVW5leHBlY3RlZCByb2xsYmFjayBjaG9pY2U6ICR7Y2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9uaXRvciA9IG5ldyBTdGFja0FjdGl2aXR5TW9uaXRvcih7XG4gICAgICAgIGNmbixcbiAgICAgICAgc3RhY2s6IG9wdGlvbnMuc3RhY2ssXG4gICAgICAgIHN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RhcnQoKTtcblxuICAgICAgbGV0IHN0YWNrRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluYWxTdGFja1N0YXRlID0gY2xvdWRGb3JtYXRpb25TdGFjaztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NTdGFjayA9IGF3YWl0IHN0YWJpbGl6ZVN0YWNrKGNmbiwgdGhpcy5pb0hlbHBlciwgZGVwbG95TmFtZSk7XG5cbiAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiwgYnV0IGNhdGNoIGl0IGFueXdheS4gWW91IG5ldmVyIGtub3cuXG4gICAgICAgIGlmICghc3VjY2Vzc1N0YWNrKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU3RhY2tEaXNhcHBlYXJlZCcsICdTdGFjayBkZXBsb3kgZmFpbGVkICh0aGUgc3RhY2sgZGlzYXBwZWFyZWQgd2hpbGUgd2Ugd2VyZSByb2xsaW5nIGl0IGJhY2spJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxTdGFja1N0YXRlID0gc3VjY2Vzc1N0YWNrO1xuXG4gICAgICAgIGNvbnN0IGVycm9ycyA9IG1vbml0b3IuZXJyb3JzLmFsbEVycm9yTWVzc2FnZXMuam9pbignLCAnKTtcbiAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgIHN0YWNrRXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgc3RhY2tFcnJvck1lc3NhZ2UgPSBzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5lcnJvcnMuYWxsRXJyb3JNZXNzYWdlcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBtb25pdG9yLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsU3RhY2tTdGF0ZS5zdGFja1N0YXR1cy5pc1JvbGxiYWNrU3VjY2VzcyB8fCAhc3RhY2tFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhY2tBcm4sIHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRWl0aGVyIHdlIG5lZWQgdG8gaWdub3JlIHNvbWUgcmVzb3VyY2VzIHRvIGNvbnRpbnVlIHRoZSByb2xsYmFjaywgb3Igc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIGlmIChmaW5hbFN0YWNrU3RhdGUuc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UgPT09IFJvbGxiYWNrQ2hvaWNlLkNPTlRJTlVFX1VQREFURV9ST0xMQkFDSyAmJiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAvLyBEbyBhbm90aGVyIGxvb3AtZGUtbG9vcFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgYCR7c3RhY2tFcnJvck1lc3NhZ2V9IChmaXggcHJvYmxlbSBhbmQgcmV0cnksIG9yIG9ycGhhbiB0aGVzZSByZXNvdXJjZXMgdXNpbmcgLS1vcnBoYW4gb3IgLS1mb3JjZSlgLFxuICAgICAgICBtb25pdG9yLmVycm9ycy5yb290Q2F1c2VFcnJvckNvZGUgPz8gJ1JvbGxiYWNrRmFpbGVkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAnUm9sbGJhY2tTdGFsbGVkJyxcbiAgICAgIFwiUm9sbGJhY2sgZGlkIG5vdCBmaW5pc2ggYWZ0ZXIgYSBsYXJnZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgc3RvcHBpbmcgYmVjYXVzZSBpdCBsb29rcyBsaWtlIHdlJ3JlIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgYW55bW9yZS4gWW91IGNhbiByZXRyeSBpZiByb2xsYmFjayB3YXMgcHJvZ3Jlc3NpbmcgYXMgZXhwZWN0ZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucykge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICByZXR1cm4gZGVzdHJveVN0YWNrKHtcbiAgICAgIHNkazogZW52LnNkayxcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIGRlcGxveU5hbWU6IG9wdGlvbnMuZGVwbG95TmFtZSxcbiAgICB9LCB0aGlzLmlvSGVscGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFja0V4aXN0cyhvcHRpb25zOiBTdGFja0V4aXN0c09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZW52O1xuICAgIGlmIChvcHRpb25zLnRyeUxvb2t1cFJvbGUpIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQob3B0aW9ucy5zdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKSwgb3B0aW9ucy5kZXBsb3lOYW1lID8/IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2suZXhpc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc2luZ2xlIGFzc2V0IGZyb20gYW4gYXNzZXQgbWFuaWZlc3RcbiAgICpcbiAgICogSWYgYW4gYXNzZXJ0IG1hbmlmZXN0IGFydGlmYWN0IGlzIGdpdmVuLCB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICogd2lsbCBiZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50cyBpbiB0aGF0IG1hbmlmZXN0IGFydGlmYWN0LlxuICAgKiBJZiB0aGF0IGlzIG5vdCBuZWNlc3NhcnksIGAnbm8tdmVyc2lvbi12YWxpZGF0aW9uJ2AgY2FuIGJlIHBhc3NlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgcHVibGljIGFzeW5jIGJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgYXNzZXRBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHwgJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBpZiAoYXNzZXRBcnRpZmFjdCAhPT0gJ25vLXZlcnNpb24tdmFsaWRhdGlvbicpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5idWlsZEVudHJ5KGFzc2V0KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBc3NldEJ1aWxkRmFpbGVkJywgYEZhaWxlZCB0byBidWlsZCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKGZhbHNlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIHNpbmdsZSBhc3NldCBmcm9tIGFuIGFzc2V0IG1hbmlmZXN0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaFNpbmdsZUFzc2V0KFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gdmFsaWRhdGUgYW55bW9yZSwgd2UgYWxyZWFkeSBkaWQgdGhhdCBkdXJpbmcgYnVpbGRcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5wdWJsaXNoRW50cnkoYXNzZXQsIHtcbiAgICAgIGFsbG93Q3Jvc3NBY2NvdW50OiBhd2FpdCB0aGlzLmFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KG9wdGlvbnMuc3RhY2spLFxuICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2VQdWJsaXNoLFxuICAgIH0pO1xuICAgIGlmIChwdWJsaXNoZXIuaGFzRmFpbHVyZXMpIHtcbiAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoJ0Fzc2V0UHVibGlzaEZhaWxlZCcsIGBGYWlsZWQgdG8gcHVibGlzaCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKHRydWUpfWAsIG5ldyBBZ2dyZWdhdGVFcnJvcihwdWJsaXNoZXIuZmFpbHVyZXMubWFwKGYgPT4gZi5lcnJvcikpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgICAgdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhlbnYuc2RrLCB0aGlzLmlvSGVscGVyLCB0aGlzLnByb3BzLnRvb2xraXRTdGFja05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBzaW5nbGUgYXNzZXQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc1NpbmdsZUFzc2V0UHVibGlzaGVkKFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIHJldHVybiBwdWJsaXNoZXIuaXNFbnRyeVB1Ymxpc2hlZChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgYm9vdHN0cmFwIHN0YWNrIGhhcyB0aGUgcmlnaHQgdmVyc2lvbiBmb3IgdGhpcyBzdGFja1xuICAgKlxuICAgKiBDYWxsIGludG8gZW52UmVzb3VyY2VzLnZhbGlkYXRlVmVyc2lvbiwgYnV0IHByZXBlbmQgdGhlIHN0YWNrIG5hbWUgaW4gY2FzZSBvZiBmYWlsdXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICBzdGFja05hbWU6IHN0cmluZyxcbiAgICByZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVudlJlc291cmNlczogRW52aXJvbm1lbnRSZXNvdXJjZXMsXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnZSZXNvdXJjZXMudmFsaWRhdGVWZXJzaW9uKHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLCBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQm9vdHN0cmFwVmVyc2lvblZhbGlkYXRpb24nLCBgJHtzdGFja05hbWV9OiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGVudjogY3hhcGkuRW52aXJvbm1lbnQsIHN0YWNrTmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wdWJsaXNoZXJDYWNoZS5nZXQoYXNzZXRNYW5pZmVzdCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IHN0YWNrTmFtZSA/IGAke2NoYWxrLmJvbGQoc3RhY2tOYW1lKX06IGAgOiAnJztcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgY2RrX2Fzc2V0cy5Bc3NldFB1Ymxpc2hpbmcoYXNzZXRNYW5pZmVzdCwge1xuICAgICAgLy8gVGhlIEFzc2V0UHVibGlzaGluZyBjbGFzcyB0YWtlcyBjYXJlIG9mIHJvbGUgYXNzdW1pbmcgZXRjLCBzbyBpdCdzIG9rYXkgdG9cbiAgICAgIC8vIGdpdmUgaXQgYSBkaXJlY3QgYFNka1Byb3ZpZGVyYC5cbiAgICAgIGF3czogbmV3IFB1Ymxpc2hpbmdBd3ModGhpcy5hc3NldFNka1Byb3ZpZGVyLCBlbnYpLFxuICAgICAgcHJvZ3Jlc3NMaXN0ZW5lcjogbmV3IFBhcmFsbGVsU2FmZUFzc2V0UHJvZ3Jlc3MocHJlZml4LCB0aGlzLmlvSGVscGVyKSxcbiAgICB9KTtcbiAgICB0aGlzLnB1Ymxpc2hlckNhY2hlLnNldChhc3NldE1hbmlmZXN0LCBwdWJsaXNoZXIpO1xuICAgIHJldHVybiBwdWJsaXNoZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NldCBwcm9ncmVzcyB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCBwZXJjZW50YWdlcyAoY3VycmVudGx5KVxuICovXG5jbGFzcyBQYXJhbGxlbFNhZmVBc3NldFByb2dyZXNzIGV4dGVuZHMgQmFzZVB1Ymxpc2hQcm9ncmVzc0xpc3RlbmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwcmVmaXg6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyKSB7XG4gICAgc3VwZXIoaW9IZWxwZXIpO1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UodHlwZTogY2RrX2Fzc2V0cy5FdmVudFR5cGUsIGV2ZW50OiBjZGtfYXNzZXRzLklQdWJsaXNoUHJvZ3Jlc3MpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0ke3R5cGV9OiAke2V2ZW50Lm1lc3NhZ2V9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWZmaXhXaXRoRXJyb3JzKG1zZzogc3RyaW5nLCBlcnJvcnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwID8gYCR7bXNnfTogJHtlcnJvcnMuam9pbignLCAnKX1gIDogbXNnO1xufVxuIl19
@@ -0,0 +1,13 @@
1
+ import type { DiagnosedStack, StackDiagnosis } from '../../actions/diagnose';
2
+ import type { ActionLessMessage } from '../io/private';
3
+ /**
4
+ * Turn the given stack diagnosis result into an IO message, with default message formatting
5
+ *
6
+ * The default message formatting is what the CLI will print.
7
+ */
8
+ export declare function hostMessageFromDiagnosis(stack: DiagnosedStack): ActionLessMessage<any>;
9
+ /**
10
+ * Turn the given diagnosis into a DeploymentError
11
+ */
12
+ export declare function throwDeploymentErrorFromDiagnosis(diag: StackDiagnosis): never;
13
+ //# sourceMappingURL=diagnosis-formatting.d.ts.map
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hostMessageFromDiagnosis = hostMessageFromDiagnosis;
4
+ exports.throwDeploymentErrorFromDiagnosis = throwDeploymentErrorFromDiagnosis;
5
+ const tree_builder_1 = require("./tree-builder");
6
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
7
+ const util_1 = require("../../util");
8
+ const private_1 = require("../io/private");
9
+ /**
10
+ * Turn the given stack diagnosis result into an IO message, with default message formatting
11
+ *
12
+ * The default message formatting is what the CLI will print.
13
+ */
14
+ function hostMessageFromDiagnosis(stack) {
15
+ const diagnosis = stack.result;
16
+ switch (diagnosis.type) {
17
+ case 'no-problem':
18
+ return private_1.IO.CDK_TOOLKIT_I9500.msg(formatNoProblemStack(stack, diagnosis), stack);
19
+ case 'problem':
20
+ return private_1.IO.CDK_TOOLKIT_E9500.msg(formatProblemStack(stack, diagnosis), stack);
21
+ case 'error-diagnosing':
22
+ return private_1.IO.CDK_TOOLKIT_W9501.msg(formatDiagnosisErrorStack(stack, diagnosis), stack);
23
+ }
24
+ }
25
+ /**
26
+ * Turn the given diagnosis into a DeploymentError
27
+ */
28
+ function throwDeploymentErrorFromDiagnosis(diag) {
29
+ switch (diag.type) {
30
+ case 'no-problem':
31
+ throw new toolkit_error_1.ToolkitError('DeploymentErrorNotError', 'Diagnosis should represent an error, but does not');
32
+ case 'error-diagnosing':
33
+ throw new toolkit_error_1.DeploymentError(diag.message, 'ErrorDiagnosisFailed');
34
+ }
35
+ // Guaranteed 'type=problem' here
36
+ const errorCode = diag.problems[0]?.errorCode;
37
+ let defaultErrorCode;
38
+ switch (diag.detectedBy.type) {
39
+ case 'change-set':
40
+ defaultErrorCode = 'ChangeSetCreationFailed';
41
+ break;
42
+ case 'early-validation':
43
+ defaultErrorCode = 'EarlyValidationFailure';
44
+ break;
45
+ case 'deployment':
46
+ defaultErrorCode = 'StackDeployFailed';
47
+ break;
48
+ }
49
+ throw new toolkit_error_1.DeploymentError(formatProblemDiagnosis(diag), errorCode ?? defaultErrorCode);
50
+ }
51
+ function formatProblemDiagnosis(diag) {
52
+ switch (diag.detectedBy.type) {
53
+ case 'change-set':
54
+ return formatChangeSetProblems(diag.problems, diag.detectedBy);
55
+ case 'early-validation':
56
+ return formatEarlyValidationProblems(diag.problems, diag.detectedBy);
57
+ case 'deployment':
58
+ return formatDeploymentProblems(diag.problems, diag.detectedBy);
59
+ }
60
+ }
61
+ function formatChangeSetProblems(problems, detectedBy) {
62
+ const caption = `Failed to create change set ${detectedBy.changeSetName}`;
63
+ if (problems.length > 0) {
64
+ return `${caption}:\n${formatResourceErrors(problems)}`;
65
+ }
66
+ else {
67
+ return `${caption}: ${detectedBy.statusReason}`;
68
+ }
69
+ }
70
+ function formatEarlyValidationProblems(problems, detectedBy) {
71
+ const caption = `Early validation failed for change set ${detectedBy.changeSetName}`;
72
+ if (problems.length > 0) {
73
+ return `${caption}:\n${formatResourceErrors(problems)}`;
74
+ }
75
+ else {
76
+ return caption;
77
+ }
78
+ }
79
+ function formatDeploymentProblems(problems, detectedBy) {
80
+ const caption = 'Resource updates failed';
81
+ if (problems.length > 0) {
82
+ return `${caption}:\n${formatResourceErrors(problems)}`;
83
+ }
84
+ else {
85
+ return `${caption} (${detectedBy.stackStatus}): ${detectedBy.statusReason}`;
86
+ }
87
+ }
88
+ function formatNoProblemStack(stack, _m) {
89
+ // TODO: print stack by construct path, not name
90
+ return `✅ Stack ${stack.stackName}: no issues found.`;
91
+ }
92
+ function formatProblemStack(stack, m) {
93
+ // TODO: print stack by construct path, not name
94
+ return `❌ Stack ${stack.stackName}:\n${formatProblemDiagnosis(m)}`;
95
+ }
96
+ function formatDiagnosisErrorStack(stack, m) {
97
+ // TODO: print stack by construct path, not name
98
+ return `⚠️ Could not diagnose stack ${stack.stackName}: ${m.message}`;
99
+ }
100
+ function formatResourceErrors(es) {
101
+ (0, util_1.sortByKey)(es, (e) => [locateResourceError(e)]);
102
+ const b = new tree_builder_1.TreeBuilder('');
103
+ for (const e of es) {
104
+ const p = locateResourceError(e);
105
+ const lastPart = p.split('/').slice(-1)[0];
106
+ b.setNodeText(p, [
107
+ `${lastPart} ${addendum(' ', e.resourceType, e.logicalId)}`.trim(),
108
+ ...(0, tree_builder_1.sideBySide)(['🛑'], ' ', (0, tree_builder_1.wrapText)(120, e.message)),
109
+ ...e.sourceTrace?.creationStackTrace ? (0, tree_builder_1.sideBySide)(['Source Location:'], ' ', e.sourceTrace?.creationStackTrace) : [],
110
+ ].join('\n'));
111
+ }
112
+ return b.render();
113
+ }
114
+ /**
115
+ * Return a /-separated construct path for the given error, or try to build as close a represention as possible if we don't have a construct path
116
+ *
117
+ * The root will be the "app"
118
+ */
119
+ function locateResourceError(e) {
120
+ if (e.sourceTrace?.constructPath) {
121
+ return e.sourceTrace?.constructPath;
122
+ }
123
+ const nestedStackParts = e.parentStackLogicalIds.map((l) => `Nested stack ${l}`);
124
+ if (e.logicalId) {
125
+ return [e.topLevelStackHierarchicalId, ...nestedStackParts, e.logicalId].join('/');
126
+ }
127
+ // No logical ID means we are targeting the stack itself
128
+ return [e.topLevelStackHierarchicalId, nestedStackParts].join('/');
129
+ }
130
+ function addendum(sep, ...xs) {
131
+ xs = xs.filter(x => x && typeof x === 'string');
132
+ if (xs.length > 0) {
133
+ return `(${xs.join(sep)})`;
134
+ }
135
+ else {
136
+ return '';
137
+ }
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc2lzLWZvcm1hdHRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWFnbm9zaXMtZm9ybWF0dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDREQWFDO0FBS0QsOEVBMkJDO0FBekRELGlEQUFtRTtBQUVuRSwrREFBNEU7QUFDNUUscUNBQXVDO0FBRXZDLDJDQUFtQztBQUVuQzs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBcUI7SUFDNUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUUvQixRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWpGLEtBQUssU0FBUztZQUNaLE9BQU8sWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsSUFBb0I7SUFDcEUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxJQUFJLDRCQUFZLENBQUMseUJBQXlCLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUV6RyxLQUFLLGtCQUFrQjtZQUNyQixNQUFNLElBQUksK0JBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENB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QUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaWRlQnlTaWRlLCBUcmVlQnVpbGRlciwgd3JhcFRleHQgfSBmcm9tICcuL3RyZWUtYnVpbGRlcic7XG5pbXBvcnQgdHlwZSB7IERpYWdub3NlZFN0YWNrLCBTdGFja0RpYWdub3NpcywgU3RhY2tQcm9ibGVtU291cmNlLCBUcmFjZWRSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9kaWFnbm9zZSc7XG5pbXBvcnQgeyBEZXBsb3ltZW50RXJyb3IsIFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBzb3J0QnlLZXkgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uTGVzc01lc3NhZ2UgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IElPIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbi8qKlxuICogVHVybiB0aGUgZ2l2ZW4gc3RhY2sgZGlhZ25vc2lzIHJlc3VsdCBpbnRvIGFuIElPIG1lc3NhZ2UsIHdpdGggZGVmYXVsdCBtZXNzYWdlIGZvcm1hdHRpbmdcbiAqXG4gKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGZvcm1hdHRpbmcgaXMgd2hhdCB0aGUgQ0xJIHdpbGwgcHJpbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob3N0TWVzc2FnZUZyb21EaWFnbm9zaXMoc3RhY2s6IERpYWdub3NlZFN0YWNrKTogQWN0aW9uTGVzc01lc3NhZ2U8YW55PiB7XG4gIGNvbnN0IGRpYWdub3NpcyA9IHN0YWNrLnJlc3VsdDtcblxuICBzd2l0Y2ggKGRpYWdub3Npcy50eXBlKSB7XG4gICAgY2FzZSAnbm8tcHJvYmxlbSc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfSTk1MDAubXNnKGZvcm1hdE5vUHJvYmxlbVN0YWNrKHN0YWNrLCBkaWFnbm9zaXMpLCBzdGFjayk7XG5cbiAgICBjYXNlICdwcm9ibGVtJzpcbiAgICAgIHJldHVybiBJTy5DREtfVE9PTEtJVF9FOTUwMC5tc2coZm9ybWF0UHJvYmxlbVN0YWNrKHN0YWNrLCBkaWFnbm9zaXMpLCBzdGFjayk7XG5cbiAgICBjYXNlICdlcnJvci1kaWFnbm9zaW5nJzpcbiAgICAgIHJldHVybiBJTy5DREtfVE9PTEtJVF9XOTUwMS5tc2coZm9ybWF0RGlhZ25vc2lzRXJyb3JTdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuICB9XG59XG5cbi8qKlxuICogVHVybiB0aGUgZ2l2ZW4gZGlhZ25vc2lzIGludG8gYSBEZXBsb3ltZW50RXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93RGVwbG95bWVudEVycm9yRnJvbURpYWdub3NpcyhkaWFnOiBTdGFja0RpYWdub3Npcyk6IG5ldmVyIHtcbiAgc3dpdGNoIChkaWFnLnR5cGUpIHtcbiAgICBjYXNlICduby1wcm9ibGVtJzpcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RlcGxveW1lbnRFcnJvck5vdEVycm9yJywgJ0RpYWdub3NpcyBzaG91bGQgcmVwcmVzZW50IGFuIGVycm9yLCBidXQgZG9lcyBub3QnKTtcblxuICAgIGNhc2UgJ2Vycm9yLWRpYWdub3NpbmcnOlxuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihkaWFnLm1lc3NhZ2UsICdFcnJvckRpYWdub3Npc0ZhaWxlZCcpO1xuICB9XG4gIC8vIEd1YXJhbnRlZWQgJ3R5cGU9cHJvYmxlbScgaGVyZVxuXG4gIGNvbnN0IGVycm9yQ29kZSA9IGRpYWcucHJvYmxlbXNbMF0/LmVycm9yQ29kZTtcbiAgbGV0IGRlZmF1bHRFcnJvckNvZGU7XG4gIHN3aXRjaCAoZGlhZy5kZXRlY3RlZEJ5LnR5cGUpIHtcbiAgICBjYXNlICdjaGFuZ2Utc2V0JzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnQ2hhbmdlU2V0Q3JlYXRpb25GYWlsZWQnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdlYXJseS12YWxpZGF0aW9uJzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnRWFybHlWYWxpZGF0aW9uRmFpbHVyZSc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RlcGxveW1lbnQnOlxuICAgICAgZGVmYXVsdEVycm9yQ29kZSA9ICdTdGFja0RlcGxveUZhaWxlZCc7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoZm9ybWF0UHJvYmxlbURpYWdub3NpcyhkaWFnKSwgZXJyb3JDb2RlID8/IGRlZmF1bHRFcnJvckNvZGUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9ibGVtRGlhZ25vc2lzKGRpYWc6IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ3Byb2JsZW0nIH0+KTogc3RyaW5nIHtcbiAgc3dpdGNoIChkaWFnLmRldGVjdGVkQnkudHlwZSkge1xuICAgIGNhc2UgJ2NoYW5nZS1zZXQnOlxuICAgICAgcmV0dXJuIGZvcm1hdENoYW5nZVNldFByb2JsZW1zKGRpYWcucHJvYmxlbXMsIGRpYWcuZGV0ZWN0ZWRCeSk7XG5cbiAgICBjYXNlICdlYXJseS12YWxpZGF0aW9uJzpcbiAgICAgIHJldHVybiBmb3JtYXRFYXJseVZhbGlkYXRpb25Qcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuXG4gICAgY2FzZSAnZGVwbG95bWVudCc6XG4gICAgICByZXR1cm4gZm9ybWF0RGVwbG95bWVudFByb2JsZW1zKGRpYWcucHJvYmxlbXMsIGRpYWcuZGV0ZWN0ZWRCeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Q2hhbmdlU2V0UHJvYmxlbXMocHJvYmxlbXM6IFRyYWNlZFJlc291cmNlRXJyb3JbXSwgZGV0ZWN0ZWRCeTogRXh0cmFjdDxTdGFja1Byb2JsZW1Tb3VyY2UsIHsgdHlwZTogJ2NoYW5nZS1zZXQnIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgY2FwdGlvbiA9IGBGYWlsZWQgdG8gY3JlYXRlIGNoYW5nZSBzZXQgJHtkZXRlY3RlZEJ5LmNoYW5nZVNldE5hbWV9YDtcblxuICBpZiAocHJvYmxlbXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgJHtjYXB0aW9ufTpcXG4ke2Zvcm1hdFJlc291cmNlRXJyb3JzKHByb2JsZW1zKX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHtjYXB0aW9ufTogJHtkZXRlY3RlZEJ5LnN0YXR1c1JlYXNvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVhcmx5VmFsaWRhdGlvblByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdlYXJseS12YWxpZGF0aW9uJyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSBgRWFybHkgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIGNoYW5nZSBzZXQgJHtkZXRlY3RlZEJ5LmNoYW5nZVNldE5hbWV9YDtcbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FwdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXREZXBsb3ltZW50UHJvYmxlbXMocHJvYmxlbXM6IFRyYWNlZFJlc291cmNlRXJyb3JbXSwgZGV0ZWN0ZWRCeTogRXh0cmFjdDxTdGFja1Byb2JsZW1Tb3VyY2UsIHsgdHlwZTogJ2RlcGxveW1lbnQnIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgY2FwdGlvbiA9ICdSZXNvdXJjZSB1cGRhdGVzIGZhaWxlZCc7XG5cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn0gKCR7ZGV0ZWN0ZWRCeS5zdGFja1N0YXR1c30pOiAke2RldGVjdGVkQnkuc3RhdHVzUmVhc29ufWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Tm9Qcm9ibGVtU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBfbTogRXh0cmFjdDxTdGFja0RpYWdub3NpcywgeyB0eXBlOiAnbm8tcHJvYmxlbScgfT4pIHtcbiAgLy8gVE9ETzogcHJpbnQgc3RhY2sgYnkgY29uc3RydWN0IHBhdGgsIG5vdCBuYW1lXG4gIHJldHVybiBg4pyFIFN0YWNrICR7c3RhY2suc3RhY2tOYW1lfTogbm8gaXNzdWVzIGZvdW5kLmA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFByb2JsZW1TdGFjayhzdGFjazogRGlhZ25vc2VkU3RhY2ssIG06IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ3Byb2JsZW0nIH0+KSB7XG4gIC8vIFRPRE86IHByaW50IHN0YWNrIGJ5IGNvbnN0cnVjdCBwYXRoLCBub3QgbmFtZVxuICByZXR1cm4gYOKdjCBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX06XFxuJHtmb3JtYXRQcm9ibGVtRGlhZ25vc2lzKG0pfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERpYWdub3Npc0Vycm9yU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBtOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdlcnJvci1kaWFnbm9zaW5nJyB9Pikge1xuICAvLyBUT0RPOiBwcmludCBzdGFjayBieSBjb25zdHJ1Y3QgcGF0aCwgbm90IG5hbWVcbiAgcmV0dXJuIGDimqDvuI8gQ291bGQgbm90IGRpYWdub3NlIHN0YWNrICR7c3RhY2suc3RhY2tOYW1lfTogJHttLm1lc3NhZ2V9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzb3VyY2VFcnJvcnMoZXM6IFRyYWNlZFJlc291cmNlRXJyb3JbXSkge1xuICBzb3J0QnlLZXkoZXMsIChlKSA9PiBbbG9jYXRlUmVzb3VyY2VFcnJvcihlKV0pO1xuXG4gIGNvbnN0IGIgPSBuZXcgVHJlZUJ1aWxkZXIoJycpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXMpIHtcbiAgICBjb25zdCBwID0gbG9jYXRlUmVzb3VyY2VFcnJvcihlKTtcbiAgICBjb25zdCBsYXN0UGFydCA9IHAuc3BsaXQoJy8nKS5zbGljZSgtMSlbMF07XG4gICAgYi5zZXROb2RlVGV4dChwLCBbXG4gICAgICBgJHtsYXN0UGFydH0gICR7YWRkZW5kdW0oJyAnLCBlLnJlc291cmNlVHlwZSwgZS5sb2dpY2FsSWQpfWAudHJpbSgpLFxuICAgICAgLi4uc2lkZUJ5U2lkZShbJ/Cfm5EnXSwgJyAnLCB3cmFwVGV4dCgxMjAsIGUubWVzc2FnZSkpLFxuICAgICAgLi4uZS5zb3VyY2VUcmFjZT8uY3JlYXRpb25TdGFja1RyYWNlID8gc2lkZUJ5U2lkZShbJ1NvdXJjZSBMb2NhdGlvbjonXSwgJyAnLCBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2UpIDogW10sXG4gICAgXS5qb2luKCdcXG4nKSk7XG4gIH1cbiAgcmV0dXJuIGIucmVuZGVyKCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgLy1zZXBhcmF0ZWQgY29uc3RydWN0IHBhdGggZm9yIHRoZSBnaXZlbiBlcnJvciwgb3IgdHJ5IHRvIGJ1aWxkIGFzIGNsb3NlIGEgcmVwcmVzZW50aW9uIGFzIHBvc3NpYmxlIGlmIHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3QgcGF0aFxuICpcbiAqIFRoZSByb290IHdpbGwgYmUgdGhlIFwiYXBwXCJcbiAqL1xuZnVuY3Rpb24gbG9jYXRlUmVzb3VyY2VFcnJvcihlOiBUcmFjZWRSZXNvdXJjZUVycm9yKTogc3RyaW5nIHtcbiAgaWYgKGUuc291cmNlVHJhY2U/LmNvbnN0cnVjdFBhdGgpIHtcbiAgICByZXR1cm4gZS5zb3VyY2VUcmFjZT8uY29uc3RydWN0UGF0aDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZFN0YWNrUGFydHMgPSBlLnBhcmVudFN0YWNrTG9naWNhbElkcy5tYXAoKGwpID0+IGBOZXN0ZWQgc3RhY2sgJHtsfWApO1xuICBpZiAoZS5sb2dpY2FsSWQpIHtcbiAgICByZXR1cm4gW2UudG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkLCAuLi5uZXN0ZWRTdGFja1BhcnRzLCBlLmxvZ2ljYWxJZF0uam9pbignLycpO1xuICB9XG4gIC8vIE5vIGxvZ2ljYWwgSUQgbWVhbnMgd2UgYXJlIHRhcmdldGluZyB0aGUgc3RhY2sgaXRzZWxmXG4gIHJldHVybiBbZS50b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQsIG5lc3RlZFN0YWNrUGFydHNdLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gYWRkZW5kdW0oc2VwOiBzdHJpbmcsIC4uLnhzOiBBcnJheTxzdHJpbmcgfCB1bmRlZmluZWQ+KTogc3RyaW5nIHtcbiAgeHMgPSB4cy5maWx0ZXIoeCA9PiB4ICYmIHR5cGVvZiB4ID09PSAnc3RyaW5nJyk7XG4gIGlmICh4cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAoJHt4cy5qb2luKHNlcCl9KWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,49 @@
1
+ import type { SDK } from '../aws-auth/sdk';
2
+ import type { EnvironmentResources } from '../environment';
3
+ import type { IoHelper } from '../io/private/io-helper';
4
+ /**
5
+ * A ValidationReporter that checks for early validation errors right after
6
+ * creating the change set.
7
+ */
8
+ export declare class EarlyValidationReporter {
9
+ private readonly sdk;
10
+ private readonly envResources?;
11
+ constructor(sdk: SDK, envResources?: EnvironmentResources | undefined);
12
+ /**
13
+ * Fetch the details and return them as a string.
14
+ *
15
+ * If the details could not be fetched, log that as a warning using the IoHelper.
16
+ */
17
+ fetchDetailsString(changeSetName: string, stackName: string, ioHelper: IoHelper): Promise<string>;
18
+ /**
19
+ * Fetch the details and return them in structured form.
20
+ */
21
+ fetchDetailsStructured(changeSetName: string, stackName: string): Promise<EarlyValidationCheckResult>;
22
+ private getFailedEvents;
23
+ }
24
+ export type EarlyValidationCheckResult = {
25
+ type: 'could-not-check';
26
+ message: string;
27
+ } | {
28
+ type: 'resource-errors';
29
+ errors: EarlyValidationError[];
30
+ };
31
+ export interface EarlyValidationError {
32
+ readonly logicalId: string;
33
+ readonly physicalId?: string;
34
+ readonly message: string;
35
+ readonly resourceType?: string;
36
+ /**
37
+ * Example: `VALIDATION_ERROR`
38
+ */
39
+ readonly eventType: string;
40
+ /**
41
+ * Example: `NAME_CONFLICT_VALIDATION`
42
+ */
43
+ readonly validationName: string;
44
+ /**
45
+ * Example: `/Resources/SomeBucketD5B70704`
46
+ */
47
+ readonly documentPath: string;
48
+ }
49
+ //# sourceMappingURL=early-validation.d.ts.map