@cdklabs/cdk-appmod-catalog-blueprints 1.5.0 → 1.6.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/.jsii +2537 -204
  2. package/lib/document-processing/adapter/adapter.d.ts +4 -2
  3. package/lib/document-processing/adapter/adapter.js +1 -1
  4. package/lib/document-processing/adapter/queued-s3-adapter.d.ts +9 -2
  5. package/lib/document-processing/adapter/queued-s3-adapter.js +29 -15
  6. package/lib/document-processing/agentic-document-processing.d.ts +4 -0
  7. package/lib/document-processing/agentic-document-processing.js +20 -10
  8. package/lib/document-processing/base-document-processing.d.ts +54 -2
  9. package/lib/document-processing/base-document-processing.js +136 -82
  10. package/lib/document-processing/bedrock-document-processing.d.ts +202 -2
  11. package/lib/document-processing/bedrock-document-processing.js +717 -77
  12. package/lib/document-processing/chunking-config.d.ts +614 -0
  13. package/lib/document-processing/chunking-config.js +5 -0
  14. package/lib/document-processing/default-document-processing-config.js +1 -1
  15. package/lib/document-processing/index.d.ts +1 -0
  16. package/lib/document-processing/index.js +2 -1
  17. package/lib/document-processing/resources/aggregation/handler.py +567 -0
  18. package/lib/document-processing/resources/aggregation/requirements.txt +7 -0
  19. package/lib/document-processing/resources/aggregation/test_handler.py +362 -0
  20. package/lib/document-processing/resources/cleanup/handler.py +276 -0
  21. package/lib/document-processing/resources/cleanup/requirements.txt +5 -0
  22. package/lib/document-processing/resources/cleanup/test_handler.py +436 -0
  23. package/lib/document-processing/resources/default-bedrock-invoke/index.py +85 -3
  24. package/lib/document-processing/resources/default-bedrock-invoke/test_index.py +622 -0
  25. package/lib/document-processing/resources/pdf-chunking/README.md +313 -0
  26. package/lib/document-processing/resources/pdf-chunking/chunking_strategies.py +460 -0
  27. package/lib/document-processing/resources/pdf-chunking/error_handling.py +491 -0
  28. package/lib/document-processing/resources/pdf-chunking/handler.py +958 -0
  29. package/lib/document-processing/resources/pdf-chunking/metrics.py +435 -0
  30. package/lib/document-processing/resources/pdf-chunking/requirements.txt +3 -0
  31. package/lib/document-processing/resources/pdf-chunking/strategy_selection.py +420 -0
  32. package/lib/document-processing/resources/pdf-chunking/structured_logging.py +457 -0
  33. package/lib/document-processing/resources/pdf-chunking/test_chunking_strategies.py +353 -0
  34. package/lib/document-processing/resources/pdf-chunking/test_error_handling.py +487 -0
  35. package/lib/document-processing/resources/pdf-chunking/test_handler.py +609 -0
  36. package/lib/document-processing/resources/pdf-chunking/test_integration.py +694 -0
  37. package/lib/document-processing/resources/pdf-chunking/test_metrics.py +532 -0
  38. package/lib/document-processing/resources/pdf-chunking/test_strategy_selection.py +471 -0
  39. package/lib/document-processing/resources/pdf-chunking/test_structured_logging.py +449 -0
  40. package/lib/document-processing/resources/pdf-chunking/test_token_estimation.py +374 -0
  41. package/lib/document-processing/resources/pdf-chunking/token_estimation.py +189 -0
  42. package/lib/document-processing/tests/agentic-document-processing-nag.test.js +4 -3
  43. package/lib/document-processing/tests/agentic-document-processing.test.js +488 -4
  44. package/lib/document-processing/tests/base-document-processing-nag.test.js +9 -2
  45. package/lib/document-processing/tests/base-document-processing-schema.test.d.ts +1 -0
  46. package/lib/document-processing/tests/base-document-processing-schema.test.js +337 -0
  47. package/lib/document-processing/tests/base-document-processing.test.js +114 -8
  48. package/lib/document-processing/tests/bedrock-document-processing-chunking-nag.test.d.ts +1 -0
  49. package/lib/document-processing/tests/bedrock-document-processing-chunking-nag.test.js +382 -0
  50. package/lib/document-processing/tests/bedrock-document-processing-nag.test.js +4 -3
  51. package/lib/document-processing/tests/bedrock-document-processing-security.test.d.ts +1 -0
  52. package/lib/document-processing/tests/bedrock-document-processing-security.test.js +389 -0
  53. package/lib/document-processing/tests/bedrock-document-processing.test.js +808 -8
  54. package/lib/document-processing/tests/chunking-config.test.d.ts +1 -0
  55. package/lib/document-processing/tests/chunking-config.test.js +238 -0
  56. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +9 -2
  57. package/lib/document-processing/tests/queued-s3-adapter.test.js +17 -6
  58. package/lib/framework/agents/base-agent.js +1 -1
  59. package/lib/framework/agents/batch-agent.js +1 -1
  60. package/lib/framework/agents/default-agent-config.js +1 -1
  61. package/lib/framework/bedrock/bedrock.js +1 -1
  62. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  63. package/lib/framework/foundation/access-log.js +1 -1
  64. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  65. package/lib/framework/foundation/network.js +1 -1
  66. package/lib/framework/tests/access-log.test.js +5 -2
  67. package/lib/framework/tests/batch-agent.test.js +5 -2
  68. package/lib/framework/tests/bedrock.test.js +5 -2
  69. package/lib/framework/tests/eventbridge-broker.test.js +5 -2
  70. package/lib/framework/tests/framework-nag.test.js +16 -8
  71. package/lib/framework/tests/network.test.js +9 -4
  72. package/lib/tsconfig.tsbuildinfo +1 -1
  73. package/lib/utilities/data-loader.js +1 -1
  74. package/lib/utilities/lambda-iam-utils.js +1 -1
  75. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  76. package/lib/utilities/observability/default-observability-config.js +1 -1
  77. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  78. package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
  79. package/lib/utilities/observability/powertools-config.d.ts +10 -1
  80. package/lib/utilities/observability/powertools-config.js +19 -3
  81. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  82. package/lib/utilities/test-utils.d.ts +43 -0
  83. package/lib/utilities/test-utils.js +56 -0
  84. package/lib/utilities/tests/data-loader-nag.test.js +3 -2
  85. package/lib/utilities/tests/data-loader.test.js +3 -2
  86. package/lib/webapp/frontend-construct.js +1 -1
  87. package/lib/webapp/tests/frontend-construct-nag.test.js +3 -2
  88. package/lib/webapp/tests/frontend-construct.test.js +3 -2
  89. package/package.json +6 -5
  90. package/lib/document-processing/resources/default-error-handler/index.js +0 -46
  91. package/lib/document-processing/resources/default-pdf-processor/index.js +0 -46
  92. package/lib/document-processing/resources/default-pdf-validator/index.js +0 -36
@@ -90,26 +90,132 @@ class BaseDocumentProcessing extends constructs_1.Construct {
90
90
  this.metricServiceName = props.metricServiceName || default_document_processing_config_1.DefaultDocumentProcessingConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME;
91
91
  }
92
92
  handleStateMachineCreation(stateMachineId) {
93
- const classificationStep = this.classificationStep();
94
- const processingStep = this.processingStep();
95
- const enrichmentStep = this.enrichmentStep();
96
- const postProcessingStep = this.postProcessingStep();
93
+ // Check if preprocessing is needed (e.g., for chunking large documents)
94
+ const preprocessingStep = this.preprocessingStep();
95
+ // Initialize metadata entry in DynamoDB
96
+ // Base class only knows about core document fields
97
+ const baseItem = {
98
+ DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
99
+ ContentType: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.contentType')),
100
+ Content: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.content'))),
101
+ WorkflowStatus: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString('pending'),
102
+ StateMachineExecId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$$.Execution.Id')),
103
+ };
104
+ // Allow concrete implementations to add preprocessing-specific metadata
105
+ // This is a hook for subclasses to extend the schema without base class knowing the details
106
+ const additionalMetadata = this.preprocessingMetadata();
107
+ Object.assign(baseItem, additionalMetadata);
97
108
  const initMetadataEntry = new aws_stepfunctions_tasks_1.DynamoPutItem(this, 'InitMetadataEntry', {
98
109
  table: this.documentProcessingTable,
99
- item: {
100
- DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
101
- ContentType: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.contentType')),
102
- Content: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.content'))),
103
- WorkflowStatus: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString('pending'),
104
- StateMachineExecId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$$.Execution.Id')),
105
- },
110
+ item: baseItem,
106
111
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
107
112
  });
113
+ // Build workflow: if preprocessing exists, chain it before the main workflow
114
+ let workflowDefinition;
115
+ if (preprocessingStep) {
116
+ // Preprocessing → InitMetadata → Custom Processing Workflow
117
+ workflowDefinition = preprocessingStep
118
+ .next(initMetadataEntry)
119
+ .next(this.createProcessingWorkflow());
120
+ }
121
+ else {
122
+ // InitMetadata → Standard Processing Workflow (backward compatible)
123
+ workflowDefinition = initMetadataEntry
124
+ .next(this.createStandardProcessingWorkflow());
125
+ }
126
+ const role = this.createStateMachineRole();
127
+ this.encryptionKey.grantEncryptDecrypt(role);
128
+ const stateMachine = new aws_stepfunctions_1.StateMachine(this, stateMachineId, {
129
+ definitionBody: aws_stepfunctions_1.DefinitionBody.fromChainable(workflowDefinition),
130
+ timeout: this.props.workflowTimeout || aws_cdk_lib_1.Duration.minutes(15),
131
+ role,
132
+ encryptionConfiguration: new aws_stepfunctions_1.CustomerManagedEncryptionConfiguration(this.encryptionKey),
133
+ });
134
+ this.ingressAdapter.createIngressTrigger(this, stateMachine, this.props);
135
+ return stateMachine;
136
+ }
137
+ createStateMachineRole() {
138
+ return new aws_iam_1.Role(this, 'StateMachineRole', {
139
+ assumedBy: new aws_iam_1.ServicePrincipal('states.amazonaws.com'),
140
+ inlinePolicies: {
141
+ StateMachineExecutionPolicy: new aws_iam_1.PolicyDocument({
142
+ statements: [
143
+ ...this.ingressAdapter.generateAdapterIAMPolicies(),
144
+ new aws_iam_1.PolicyStatement({
145
+ effect: aws_iam_1.Effect.ALLOW,
146
+ actions: ['dynamodb:PutItem', 'dynamodb:UpdateItem'],
147
+ resources: [this.documentProcessingTable.tableArn],
148
+ }),
149
+ ],
150
+ }),
151
+ },
152
+ });
153
+ }
154
+ createMoveToFailedChain(idPrefix) {
155
+ const failedChain = this.ingressAdapter.createFailedChain(this, idPrefix);
156
+ if (this.props.eventbridgeBroker) {
157
+ const ebChain = this.props.eventbridgeBroker.sendViaSfnChain('document-processing-failed', {
158
+ documentId: aws_stepfunctions_1.JsonPath.stringAt('$.documentId'),
159
+ contentType: aws_stepfunctions_1.JsonPath.stringAt('$.contentType'),
160
+ content: aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.content')),
161
+ });
162
+ failedChain.next(ebChain);
163
+ }
164
+ return failedChain;
165
+ }
166
+ createMoveToProcessedChain(idPrefix) {
167
+ const processedChain = this.ingressAdapter.createSuccessChain(this, idPrefix);
168
+ if (this.props.eventbridgeBroker) {
169
+ processedChain.next(this.props.eventbridgeBroker.sendViaSfnChain('document-processed-successful', {
170
+ documentId: aws_stepfunctions_1.JsonPath.stringAt('$.documentId'),
171
+ contentType: aws_stepfunctions_1.JsonPath.stringAt('$.contentType'),
172
+ content: aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.content')),
173
+ classification: aws_stepfunctions_1.JsonPath.stringAt('$.classificationResult.documentClassification'),
174
+ }));
175
+ }
176
+ return processedChain;
177
+ }
178
+ metrics() {
179
+ return [];
180
+ }
181
+ /**
182
+ * Hook for concrete implementations to add preprocessing-specific metadata to DynamoDB.
183
+ *
184
+ * This method is called during InitMetadata creation and allows subclasses to extend
185
+ * the DynamoDB schema with their own fields without the base class knowing the details.
186
+ *
187
+ * The base class provides the core document fields (DocumentId, ContentType, etc.),
188
+ * and subclasses can add their own fields (e.g., chunking metadata) by overriding this method.
189
+ *
190
+ * @returns Record of additional DynamoDB attribute values to include in InitMetadata
191
+ * @default {} (no additional metadata)
192
+ */
193
+ preprocessingMetadata() {
194
+ // Default: no additional metadata
195
+ // Subclasses override this to add their own preprocessing-specific fields
196
+ return {};
197
+ }
198
+ /**
199
+ * Creates the standard processing workflow (no preprocessing customization).
200
+ *
201
+ * This is the existing workflow: Classification → Processing → Enrichment → PostProcessing
202
+ * Concrete classes can call this method to reuse the standard flow when they don't
203
+ * need custom workflow branching.
204
+ *
205
+ * @param idPrefix Optional prefix for construct IDs to ensure uniqueness when called multiple times
206
+ * @returns Step Functions chain for standard processing
207
+ */
208
+ createStandardProcessingWorkflow(idPrefix) {
209
+ const classificationStep = this.classificationStep();
210
+ const processingStep = this.processingStep();
211
+ const enrichmentStep = this.enrichmentStep();
212
+ const postProcessingStep = this.postProcessingStep();
108
213
  // File movement operations
109
- const moveToFailed = this.createMoveToFailedChain();
110
- const moveToProcessed = this.createMoveToProcessedChain();
214
+ const moveToFailed = this.createMoveToFailedChain(idPrefix);
215
+ const moveToProcessed = this.createMoveToProcessedChain(idPrefix);
216
+ const prefix = idPrefix ? `${idPrefix}-` : '';
111
217
  const processingChain = processingStep
112
- .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'ProcessingFailDDBUpdate', {
218
+ .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}ProcessingFailDDBUpdate`, {
113
219
  table: this.documentProcessingTable,
114
220
  key: {
115
221
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -122,7 +228,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
122
228
  }).next(moveToFailed), {
123
229
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
124
230
  })
125
- .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'ProcessingSuccessUpdate', {
231
+ .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}ProcessingSuccessUpdate`, {
126
232
  table: this.documentProcessingTable,
127
233
  key: {
128
234
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -137,7 +243,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
137
243
  // Build the complete chain including optional steps
138
244
  if (enrichmentStep) {
139
245
  const enrichmentChain = enrichmentStep
140
- .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'EnrichmentFailDDBUpdate', {
246
+ .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}EnrichmentFailDDBUpdate`, {
141
247
  table: this.documentProcessingTable,
142
248
  key: {
143
249
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -150,7 +256,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
150
256
  }).next(moveToFailed), {
151
257
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
152
258
  })
153
- .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'EnrichmentSuccessUpdate', {
259
+ .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}EnrichmentSuccessUpdate`, {
154
260
  table: this.documentProcessingTable,
155
261
  key: {
156
262
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -165,7 +271,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
165
271
  processingChain.next(enrichmentChain);
166
272
  if (postProcessingStep) {
167
273
  const postProcessingChain = postProcessingStep
168
- .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'PostProcessingFailDDBUpdate', {
274
+ .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}PostProcessingFailDDBUpdate`, {
169
275
  table: this.documentProcessingTable,
170
276
  key: {
171
277
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -178,7 +284,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
178
284
  }).next(moveToFailed), {
179
285
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
180
286
  })
181
- .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'PostProcessingSuccessUpdate', {
287
+ .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}PostProcessingSuccessUpdate`, {
182
288
  table: this.documentProcessingTable,
183
289
  key: {
184
290
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -198,7 +304,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
198
304
  }
199
305
  else if (postProcessingStep) {
200
306
  const postProcessingChain = postProcessingStep
201
- .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'PostProcessingFailDDBUpdate', {
307
+ .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}PostProcessingFailDDBUpdate2`, {
202
308
  table: this.documentProcessingTable,
203
309
  key: {
204
310
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -211,7 +317,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
211
317
  }).next(moveToFailed), {
212
318
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
213
319
  })
214
- .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'PostProcessingSuccessUpdate', {
320
+ .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}PostProcessingSuccessUpdate2`, {
215
321
  table: this.documentProcessingTable,
216
322
  key: {
217
323
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -227,7 +333,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
227
333
  }
228
334
  else {
229
335
  // No optional steps - mark as complete after extraction
230
- processingChain.next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'WorkflowCompleteUpdate', {
336
+ processingChain.next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}WorkflowCompleteUpdate`, {
231
337
  table: this.documentProcessingTable,
232
338
  key: {
233
339
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -239,8 +345,8 @@ class BaseDocumentProcessing extends constructs_1.Construct {
239
345
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
240
346
  }).next(moveToProcessed));
241
347
  }
242
- const workflowDefinition = initMetadataEntry.next(classificationStep
243
- .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'ClassificationFailDDBUpdate', {
348
+ const classificationChain = classificationStep
349
+ .addCatch(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}ClassificationFailDDBUpdate`, {
244
350
  table: this.documentProcessingTable,
245
351
  key: {
246
352
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -253,7 +359,7 @@ class BaseDocumentProcessing extends constructs_1.Construct {
253
359
  }).next(moveToFailed), {
254
360
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
255
361
  })
256
- .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, 'ClassificationSuccessUpdate', {
362
+ .next(new aws_stepfunctions_tasks_1.DynamoUpdateItem(this, `${prefix}ClassificationSuccessUpdate`, {
257
363
  table: this.documentProcessingTable,
258
364
  key: {
259
365
  DocumentId: aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.stringAt('$.documentId')),
@@ -264,64 +370,12 @@ class BaseDocumentProcessing extends constructs_1.Construct {
264
370
  ':classificationResult': aws_stepfunctions_tasks_1.DynamoAttributeValue.fromString(aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.classificationResult'))),
265
371
  },
266
372
  resultPath: aws_stepfunctions_1.JsonPath.DISCARD,
267
- }))).next(processingChain);
268
- const role = this.createStateMachineRole();
269
- this.encryptionKey.grantEncryptDecrypt(role);
270
- const stateMachine = new aws_stepfunctions_1.StateMachine(this, stateMachineId, {
271
- definitionBody: aws_stepfunctions_1.DefinitionBody.fromChainable(workflowDefinition),
272
- timeout: this.props.workflowTimeout || aws_cdk_lib_1.Duration.minutes(15),
273
- role,
274
- encryptionConfiguration: new aws_stepfunctions_1.CustomerManagedEncryptionConfiguration(this.encryptionKey),
275
- });
276
- this.ingressAdapter.createIngressTrigger(this, stateMachine, this.props);
277
- return stateMachine;
278
- }
279
- createStateMachineRole() {
280
- return new aws_iam_1.Role(this, 'StateMachineRole', {
281
- assumedBy: new aws_iam_1.ServicePrincipal('states.amazonaws.com'),
282
- inlinePolicies: {
283
- StateMachineExecutionPolicy: new aws_iam_1.PolicyDocument({
284
- statements: [
285
- ...this.ingressAdapter.generateAdapterIAMPolicies(),
286
- new aws_iam_1.PolicyStatement({
287
- effect: aws_iam_1.Effect.ALLOW,
288
- actions: ['dynamodb:PutItem', 'dynamodb:UpdateItem'],
289
- resources: [this.documentProcessingTable.tableArn],
290
- }),
291
- ],
292
- }),
293
- },
294
- });
295
- }
296
- createMoveToFailedChain() {
297
- const failedChain = this.ingressAdapter.createFailedChain(this);
298
- if (this.props.eventbridgeBroker) {
299
- const ebChain = this.props.eventbridgeBroker.sendViaSfnChain('document-processing-failed', {
300
- documentId: aws_stepfunctions_1.JsonPath.stringAt('$.documentId'),
301
- contentType: aws_stepfunctions_1.JsonPath.stringAt('$.contentType'),
302
- content: aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.content')),
303
- });
304
- failedChain.next(ebChain);
305
- }
306
- return failedChain;
307
- }
308
- createMoveToProcessedChain() {
309
- const processedChain = this.ingressAdapter.createSuccessChain(this);
310
- if (this.props.eventbridgeBroker) {
311
- processedChain.next(this.props.eventbridgeBroker.sendViaSfnChain('document-processed-successful', {
312
- documentId: aws_stepfunctions_1.JsonPath.stringAt('$.documentId'),
313
- contentType: aws_stepfunctions_1.JsonPath.stringAt('$.contentType'),
314
- content: aws_stepfunctions_1.JsonPath.jsonToString(aws_stepfunctions_1.JsonPath.objectAt('$.content')),
315
- classification: aws_stepfunctions_1.JsonPath.stringAt('$.classificationResult.documentClassification'),
316
- }));
317
- }
318
- return processedChain;
319
- }
320
- metrics() {
321
- return [];
373
+ }))
374
+ .next(processingChain);
375
+ return classificationChain;
322
376
  }
323
377
  }
324
378
  exports.BaseDocumentProcessing = BaseDocumentProcessing;
325
379
  _a = JSII_RTTI_SYMBOL_1;
326
- BaseDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BaseDocumentProcessing", version: "1.5.0" };
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2Q0FBeUU7QUFFekUsMkRBQThGO0FBQzlGLGlEQUFxRTtBQUNyRSxpREFBc0c7QUFDdEcsaURBQTBDO0FBQzFDLHFFQUErSDtBQUMvSCxpRkFBMks7QUFDM0ssMkNBQXVDO0FBQ3ZDLHVDQUFzRDtBQUN0RCw2RkFBdUY7QUFHdkYsNENBQXdGO0FBQ3hGLDBHQUFxRztBQUNyRyw4SEFBd0g7QUFFeEgsNElBQXFJO0FBNkRySTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBc0Isc0JBQXVCLFNBQVEsc0JBQVM7SUFnQjVEOzs7Ozs7Ozs7T0FTRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksSUFBSSx5QkFBZSxFQUFFLENBQUM7UUFFcEUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsd0NBQThCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsd0NBQThCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0YsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIs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QUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztnQkFDL0MsT0FBTyxFQUFFLDRCQUFRLENBQUMsWUFBWSxDQUFDLDRCQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5RCxjQUFjLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsK0NBQStDLENBQUM7YUFDbkYsQ0FDRixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU87UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O0FBeFZILHdEQWlZQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgRHVyYXRpb24sIFByb3BlcnR5SW5qZWN0b3JzLCBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgSU1ldHJpYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmdNb2RlLCBUYWJsZSwgVGFibGVFbmNyeXB0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiJztcbmltcG9ydCB7IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lEb2N1bWVudCwgUG9saWN5U3RhdGVtZW50LCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IEN1c3RvbWVyTWFuYWdlZEVuY3J5cHRpb25Db25maWd1cmF0aW9uLCBEZWZpbml0aW9uQm9keSwgSnNvblBhdGgsIFN0YXRlTWFjaGluZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJztcbmltcG9ydCB7IEJlZHJvY2tJbnZva2VNb2RlbCwgRHluYW1vQXR0cmlidXRlVmFsdWUsIER5bmFtb1B1dEl0ZW0sIER5bmFtb1VwZGF0ZUl0ZW0sIExhbWJkYUludm9rZSwgU3RlcEZ1bmN0aW9uc1N0YXJ0RXhlY3V0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQWRhcHRlciwgUXVldWVkUzNBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7IERlZmF1bHREb2N1bWVudFByb2Nlc3NpbmdDb25maWcgfSBmcm9tICcuL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZyYW1ld29yayc7XG5pbXBvcnQgeyBFdmVudGJyaWRnZUJyb2tlciB9IGZyb20gJy4uL2ZyYW1ld29yay9mb3VuZGF0aW9uL2V2ZW50YnJpZGdlLWJyb2tlcic7XG5pbXBvcnQgeyBMb2dHcm91cERhdGFQcm90ZWN0aW9uUHJvcHMsIExvZ0dyb3VwRGF0YVByb3RlY3Rpb25VdGlscyB9IGZyb20gJy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L2RlZmF1bHQtb2JzZXJ2YWJpbGl0eS1jb25maWcnO1xuaW1wb3J0IHsgTGFtYmRhT2JzZXJ2YWJpbGl0eVByb3BlcnR5SW5qZWN0b3IgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JzZXJ2YWJpbGl0eS9sYW1iZGEtb2JzZXJ2YWJpbGl0eS1wcm9wZXJ0eS1pbmplY3Rvcic7XG5pbXBvcnQgeyBJT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZVByb3BzIH0gZnJvbSAnLi4vdXRpbGl0aWVzL29ic2VydmFiaWxpdHkvb2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdGF0ZU1hY2hpbmVPYnNlcnZhYmlsaXR5UHJvcGVydHlJbmplY3RvciB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L3N0YXRlLW1hY2hpbmUtb2JzZXJ2YWJpbGl0eS1wcm9wZXJ0eS1pbmplY3Rvcic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgZXh0ZW5kcyBPYnNlcnZhYmxlUHJvcHMge1xuXG4gIC8qKlxuICAgKiBBZGFwdGVyIHRoYXQgZGVmaW5lcyBob3cgdGhlIGRvY3VtZW50IHByb2Nlc3Npbmcgd29ya2Zsb3cgaXMgdHJpZ2dlcmVkXG4gICAqXG4gICAqIEBkZWZhdWx0IFF1ZXVlZFMzQWRhcHRlclxuICAgKi9cbiAgcmVhZG9ubHkgaW5ncmVzc0FkYXB0ZXI/OiBJQWRhcHRlcjtcblxuICAvKipcbiAgICogRHluYW1vREIgdGFibGUgZm9yIHN0b3JpbmcgZG9jdW1lbnQgcHJvY2Vzc2luZyBtZXRhZGF0YSBhbmQgd29ya2Zsb3cgc3RhdGUuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgdGFibGUgd2lsbCBiZSBjcmVhdGVkIHdpdGggRG9jdW1lbnRJZCBhcyBwYXJ0aXRpb24ga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnRQcm9jZXNzaW5nVGFibGU/OiBUYWJsZTtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBmb3IgdGhlIFN0ZXAgRnVuY3Rpb25zIHdvcmtmbG93LlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUaW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgY3JlYXRlZCByZXNvdXJjZXMgKGJ1Y2tldCwgdGFibGUsIHF1ZXVlKS5cbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIEV2ZW50QnJpZGdlIGJyb2tlciBmb3IgcHVibGlzaGluZyBjdXN0b20gZXZlbnRzIGR1cmluZyBwcm9jZXNzaW5nLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIG5vIGN1c3RvbSBldmVudHMgd2lsbCBiZSBzZW50IG91dC5cbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50YnJpZGdlQnJva2VyPzogRXZlbnRicmlkZ2VCcm9rZXI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBsb2dnaW5nIGFuZCB0cmFjaW5nIGZvciBhbGwgc3VwcG9ydGluZyByZXNvdXJjZVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlT2JzZXJ2YWJpbGl0eT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGF0IGNhbiBydW4gaW5zaWRlIGEgVlBDIHdpbGwgZm9sbG93IHRoZSBwcm92aWRlZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgcmVzb3VyY2VzIHdpbGwgcnVuIG91dHNpZGUgb2YgYSBWUENcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBOZXR3b3JrO1xuXG4gIC8qKlxuICAgKiBLTVMga2V5IHRvIGJlIHVzZWQuXG4gICAqIEBkZWZhdWx0IEEgbmV3IGtleSB3b3VsZCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogS2V5O1xufVxuXG4vKipcbiAqIFVuaW9uIHR5cGUgZm9yIFN0ZXAgRnVuY3Rpb25zIHRhc2tzIHRoYXQgY2FuIGJlIHVzZWQgaW4gZG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvd3MuXG4gKiBTdXBwb3J0cyBCZWRyb2NrIG1vZGVsIGludm9jYXRpb24sIExhbWJkYSBmdW5jdGlvbiBpbnZvY2F0aW9uLCBhbmQgbmVzdGVkIFN0ZXAgRnVuY3Rpb25zIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgPSBCZWRyb2NrSW52b2tlTW9kZWwgfCBMYW1iZGFJbnZva2UgfCBTdGVwRnVuY3Rpb25zU3RhcnRFeGVjdXRpb247XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc2VydmVybGVzcyBkb2N1bWVudCBwcm9jZXNzaW5nIHdvcmtmbG93cy5cbiAqXG4gKiBQcm92aWRlcyBhIGNvbXBsZXRlIGRvY3VtZW50IHByb2Nlc3NpbmcgcGlwZWxpbmUgd2l0aDpcbiAqIC0gKipTMyBTdG9yYWdlKio6IE9yZ2FuaXplZCB3aXRoIHByZWZpeGVzIChyYXcvLCBwcm9jZXNzZWQvLCBmYWlsZWQvKSBmb3IgZG9jdW1lbnQgbGlmZWN5Y2xlIG1hbmFnZW1lbnRcbiAqIC0gKipTUVMgUXVldWUqKjogUmVsaWFibGUgbWVzc2FnZSBwcm9jZXNzaW5nIHdpdGggY29uZmlndXJhYmxlIHZpc2liaWxpdHkgdGltZW91dCBhbmQgZGVhZCBsZXR0ZXIgcXVldWVcbiAqIC0gKipEeW5hbW9EQiBUYWJsZSoqOiBXb3JrZmxvdyBtZXRhZGF0YSB0cmFja2luZyB3aXRoIERvY3VtZW50SWQgYXMgcGFydGl0aW9uIGtleVxuICogLSAqKlN0ZXAgRnVuY3Rpb25zKio6IE9yY2hlc3RyYXRlZCB3b3JrZmxvdyB3aXRoIGF1dG9tYXRpYyBmaWxlIG1vdmVtZW50IGJhc2VkIG9uIHByb2Nlc3Npbmcgb3V0Y29tZVxuICogLSAqKkF1dG8tdHJpZ2dlcmluZyoqOiBTMyBldmVudCBub3RpZmljYXRpb25zIGF1dG9tYXRpY2FsbHkgc3RhcnQgcHJvY2Vzc2luZyB3aGVuIGZpbGVzIGFyZSB1cGxvYWRlZCB0byByYXcvIHByZWZpeFxuICogLSAqKkVycm9yIEhhbmRsaW5nKio6IEZhaWxlZCBkb2N1bWVudHMgYXJlIG1vdmVkIHRvIGZhaWxlZC8gcHJlZml4IHdpdGggZXJyb3IgZGV0YWlscyBzdG9yZWQgaW4gRHluYW1vREJcbiAqIC0gKipFdmVudEJyaWRnZSBJbnRlZ3JhdGlvbioqOiBPcHRpb25hbCBjdXN0b20gZXZlbnQgcHVibGlzaGluZyBmb3Igd29ya2Zsb3cgc3RhdGUgY2hhbmdlc1xuICpcbiAqICMjIEFyY2hpdGVjdHVyZSBGbG93XG4gKiBTMyBVcGxvYWQgKHJhdy8pIOKGkiBTUVMg4oaSIExhbWJkYSBDb25zdW1lciDihpIgU3RlcCBGdW5jdGlvbnMg4oaSIFByb2Nlc3NpbmcgU3RlcHMg4oaSIFMzIChwcm9jZXNzZWQvZmFpbGVkLylcbiAqXG4gKiAjIyBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlbWVudHNcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZm91ciBhYnN0cmFjdCBtZXRob2RzIHRvIGRlZmluZSB0aGUgcHJvY2Vzc2luZyB3b3JrZmxvdzpcbiAqIC0gYGNsYXNzaWZpY2F0aW9uU3RlcCgpYDogRG9jdW1lbnQgdHlwZSBjbGFzc2lmaWNhdGlvblxuICogLSBgZXh0cmFjdGlvblN0ZXAoKWA6IERhdGEgZXh0cmFjdGlvbiBmcm9tIGRvY3VtZW50c1xuICogLSBgZW5yaWNobWVudFN0ZXAoKWA6IE9wdGlvbmFsIGRhdGEgZW5yaWNobWVudCAocmV0dXJuIHVuZGVmaW5lZCB0byBza2lwKVxuICogLSBgcG9zdFByb2Nlc3NpbmdTdGVwKClgOiBPcHRpb25hbCBwb3N0LXByb2Nlc3NpbmcgKHJldHVybiB1bmRlZmluZWQgdG8gc2tpcClcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJT2JzZXJ2YWJsZSB7XG4gIC8qKiBCdXNpbmVzcyBtZXRyaWMgc2VydmljZSBuYW1lLiBUaGlzIGlzIHBhcnQgb2YgdGhlIGluaXRpYWwgc2VydmljZSBkaW1lbnNpb24gKi9cbiAgcmVhZG9ubHkgbWV0cmljU2VydmljZU5hbWU6IHN0cmluZztcbiAgLyoqIEJ1c2luZXNzIG1ldHJpYyBuYW1lc3BhY2UuICovXG4gIHJlYWRvbmx5IG1ldHJpY05hbWVzcGFjZTogc3RyaW5nO1xuICAvKiogbG9nIGdyb3VwIGRhdGEgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwRGF0YVByb3RlY3Rpb246IExvZ0dyb3VwRGF0YVByb3RlY3Rpb25Qcm9wcztcbiAgLyoqIER5bmFtb0RCIHRhYmxlIGZvciBzdG9yaW5nIGRvY3VtZW50IHByb2Nlc3NpbmcgbWV0YWRhdGEgYW5kIHdvcmtmbG93IHN0YXRlICovXG4gIHJlYWRvbmx5IGRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlOiBUYWJsZTtcbiAgLyoqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIGRvY3VtZW50IHByb2Nlc3NpbmcgcGlwZWxpbmUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzO1xuICAvKiogS01TIGtleSAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5OiBLZXk7XG4gIC8qKiBJbmdyZXNzIGFkYXB0ZXIsIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHdvcmtmbG93ICovXG4gIHJlYWRvbmx5IGluZ3Jlc3NBZGFwdGVyOiBJQWRhcHRlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdC5cbiAgICpcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBsZXRlIGRvY3VtZW50IHByb2Nlc3NpbmcgaW5mcmFzdHJ1Y3R1cmUgaW5jbHVkaW5nIFMzIGJ1Y2tldCxcbiAgICogU1FTIHF1ZXVlLCBEeW5hbW9EQiB0YWJsZSwgYW5kIHNldHMgdXAgUzMgZXZlbnQgbm90aWZpY2F0aW9ucyB0byB0cmlnZ2VyIHByb2Nlc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIGRvY3VtZW50IHByb2Nlc3NpbmcgcGlwZWxpbmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmluZ3Jlc3NBZGFwdGVyID0gcHJvcHMuaW5ncmVzc0FkYXB0ZXIgfHwgbmV3IFF1ZXVlZFMzQWRhcHRlcigpO1xuXG4gICAgaWYgKHByb3BzLm5ldHdvcmspIHtcbiAgICAgIHByb3BzLm5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCd2cGNlLXNmbicsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TVEVQX0ZVTkNUSU9OUyk7XG4gICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1lYicsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5FVkVOVEJSSURHRSk7XG4gICAgICBpZiAocHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSkge1xuICAgICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1sb2dzJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkNMT1VEV0FUQ0hfTE9HUyk7XG4gICAgICAgIHByb3BzLm5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCd2cGNlLW1ldHJpY3MnLCBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuQ0xPVURXQVRDSF9NT05JVE9SSU5HKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluZ3Jlc3NBZGFwdGVyLmluaXQodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gcHJvcHMuZW5jcnlwdGlvbktleSB8fCBuZXcgS2V5KHRoaXMsICdJRFBFbmNyeXB0aW9uS2V5Jywge1xuICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nR3JvdXBEYXRhUHJvdGVjdGlvbiA9IExvZ0dyb3VwRGF0YVByb3RlY3Rpb25VdGlscy5oYW5kbGVEZWZhdWx0KHRoaXMsIHByb3BzLmxvZ0dyb3VwRGF0YVByb3RlY3Rpb24sIHByb3BzLnJlbW92YWxQb2xpY3kpO1xuXG4gICAgdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSA9IHByb3BzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlIHx8IG5ldyBUYWJsZSh0aGlzLCAnRG9jdW1lbnRQcm9jZXNzaW5nVGFibGUnLCB7XG4gICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgbmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBiaWxsaW5nTW9kZTogQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5U3BlY2lmaWNhdGlvbjoge1xuICAgICAgICBwb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uOiBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCxcbiAgICAgIGVuY3J5cHRpb25LZXk6IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5KSB7XG4gICAgICBQcm9wZXJ0eUluamVjdG9ycy5vZih0aGlzKS5hZGQoXG4gICAgICAgIG5ldyBTdGF0ZU1hY2hpbmVPYnNlcnZhYmlsaXR5UHJvcGVydHlJbmplY3Rvcih0aGlzLmxvZ0dyb3VwRGF0YVByb3RlY3Rpb24pLFxuICAgICAgICBuZXcgTGFtYmRhT2JzZXJ2YWJpbGl0eVByb3BlcnR5SW5qZWN0b3IodGhpcy5sb2dHcm91cERhdGFQcm90ZWN0aW9uKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5tZXRyaWNOYW1lc3BhY2UgfHwgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcuREVGQVVMVF9NRVRSSUNfTkFNRVNQQUNFO1xuICAgIHRoaXMubWV0cmljU2VydmljZU5hbWUgPSBwcm9wcy5tZXRyaWNTZXJ2aWNlTmFtZSB8fCBEZWZhdWx0RG9jdW1lbnRQcm9jZXNzaW5nQ29uZmlnLkRFRkFVTFRfT0JTRVJWQUJJTElUWV9NRVRSSUNfU1ZDX05BTUU7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBoYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbihzdGF0ZU1hY2hpbmVJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NpZmljYXRpb25TdGVwID0gdGhpcy5jbGFzc2lmaWNhdGlvblN0ZXAoKTtcbiAgICBjb25zdCBwcm9jZXNzaW5nU3RlcCA9IHRoaXMucHJvY2Vzc2luZ1N0ZXAoKTtcbiAgICBjb25zdCBlbnJpY2htZW50U3RlcCA9IHRoaXMuZW5yaWNobWVudFN0ZXAoKTtcbiAgICBjb25zdCBwb3N0UHJvY2Vzc2luZ1N0ZXAgPSB0aGlzLnBvc3RQcm9jZXNzaW5nU3RlcCgpO1xuXG4gICAgY29uc3QgaW5pdE1ldGFkYXRhRW50cnkgPSBuZXcgRHluYW1vUHV0SXRlbSh0aGlzLCAnSW5pdE1ldGFkYXRhRW50cnknLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICBDb250ZW50VHlwZTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50VHlwZScpKSxcbiAgICAgICAgQ29udGVudDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY29udGVudCcpKSksXG4gICAgICAgIFdvcmtmbG93U3RhdHVzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwZW5kaW5nJyksXG4gICAgICAgIFN0YXRlTWFjaGluZUV4ZWNJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJCQuRXhlY3V0aW9uLklkJykpLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgfSk7XG5cbiAgICAvLyBGaWxlIG1vdmVtZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBtb3ZlVG9GYWlsZWQgPSB0aGlzLmNyZWF0ZU1vdmVUb0ZhaWxlZENoYWluKCk7XG4gICAgY29uc3QgbW92ZVRvUHJvY2Vzc2VkID0gdGhpcy5jcmVhdGVNb3ZlVG9Qcm9jZXNzZWRDaGFpbigpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2luZ0NoYWluID0gcHJvY2Vzc2luZ1N0ZXBcbiAgICAgIC5hZGRDYXRjaChuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnUHJvY2Vzc2luZ0ZhaWxEREJVcGRhdGUnLCB7XG4gICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICBrZXk6IHtcbiAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzJyxcbiAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICc6bmV3U3RhdHVzJzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygncHJvY2Vzc2luZy1mYWlsdXJlJyksXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICB9KS5uZXh0KG1vdmVUb0ZhaWxlZCksIHtcbiAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgIH0pXG4gICAgICAubmV4dChcbiAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ1Byb2Nlc3NpbmdTdWNjZXNzVXBkYXRlJywge1xuICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIFByb2Nlc3NpbmdSZXN1bHQgPSA6cHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwcm9jZXNzaW5nLWNvbXBsZXRlJyksXG4gICAgICAgICAgICAnOnByb2Nlc3NpbmdSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5wcm9jZXNzaW5nUmVzdWx0JykpKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBjb21wbGV0ZSBjaGFpbiBpbmNsdWRpbmcgb3B0aW9uYWwgc3RlcHNcbiAgICBpZiAoZW5yaWNobWVudFN0ZXApIHtcbiAgICAgIGNvbnN0IGVucmljaG1lbnRDaGFpbiA9IGVucmljaG1lbnRTdGVwXG4gICAgICAgIC5hZGRDYXRjaChuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnRW5yaWNobWVudEZhaWxEREJVcGRhdGUnLCB7XG4gICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdlbnJpY2htZW50LWZhaWx1cmUnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgIH0pLm5leHQobW92ZVRvRmFpbGVkKSwge1xuICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgIH0pXG4gICAgICAgIC5uZXh0KFxuICAgICAgICAgIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdFbnJpY2htZW50U3VjY2Vzc1VwZGF0ZScsIHtcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cywgRW5yaWNobWVudFJlc3VsdCA9IDplbnJpY2htZW50UmVzdWx0JyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBwb3N0UHJvY2Vzc2luZ1N0ZXAgPyBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdlbnJpY2htZW50LWNvbXBsZXRlJykgOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgICAgICAnOmVucmljaG1lbnRSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5lbnJpY2hlZFJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgcHJvY2Vzc2luZ0NoYWluLm5leHQoZW5yaWNobWVudENoYWluKTtcblxuICAgICAgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgICBjb25zdCBwb3N0UHJvY2Vzc2luZ0NoYWluID0gcG9zdFByb2Nlc3NpbmdTdGVwXG4gICAgICAgICAgLmFkZENhdGNoKG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdQb3N0UHJvY2Vzc2luZ0ZhaWxEREJVcGRhdGUnLCB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ3Bvc3QtcHJvY2Vzc2luZy1mYWlsdXJlJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KS5uZXh0KG1vdmVUb0ZhaWxlZCksIHtcbiAgICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAubmV4dChcbiAgICAgICAgICAgIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdQb3N0UHJvY2Vzc2luZ1N1Y2Nlc3NVcGRhdGUnLCB7XG4gICAgICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzLCBQb3N0UHJvY2Vzc2luZ1Jlc3VsdCA9IDpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NvbXBsZXRlJyksXG4gICAgICAgICAgICAgICAgJzpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLnBvc3RQcm9jZXNzZWRSZXN1bHQnKSkpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICAgICAgfSkubmV4dChtb3ZlVG9Qcm9jZXNzZWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIGVucmljaG1lbnRDaGFpbi5uZXh0KHBvc3RQcm9jZXNzaW5nQ2hhaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5yaWNobWVudENoYWluLm5leHQobW92ZVRvUHJvY2Vzc2VkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgY29uc3QgcG9zdFByb2Nlc3NpbmdDaGFpbiA9IHBvc3RQcm9jZXNzaW5nU3RlcFxuICAgICAgICAuYWRkQ2F0Y2gobmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ1Bvc3RQcm9jZXNzaW5nRmFpbEREQlVwZGF0ZScsIHtcbiAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzJyxcbiAgICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ3Bvc3QtcHJvY2Vzc2luZy1mYWlsdXJlJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICB9KS5uZXh0KG1vdmVUb0ZhaWxlZCksIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICB9KVxuICAgICAgICAubmV4dChcbiAgICAgICAgICBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnUG9zdFByb2Nlc3NpbmdTdWNjZXNzVXBkYXRlJywge1xuICAgICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzLCBQb3N0UHJvY2Vzc2luZ1Jlc3VsdCA9IDpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAgICc6bmV3U3RhdHVzJzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygnY29tcGxldGUnKSxcbiAgICAgICAgICAgICAgJzpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLnBvc3RQcm9jZXNzZWRSZXN1bHQnKSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgICAgfSkubmV4dChtb3ZlVG9Qcm9jZXNzZWQpLFxuICAgICAgICApO1xuICAgICAgcHJvY2Vzc2luZ0NoYWluLm5leHQocG9zdFByb2Nlc3NpbmdDaGFpbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG9wdGlvbmFsIHN0ZXBzIC0gbWFyayBhcyBjb21wbGV0ZSBhZnRlciBleHRyYWN0aW9uXG4gICAgICBwcm9jZXNzaW5nQ2hhaW4ubmV4dChcbiAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ1dvcmtmbG93Q29tcGxldGVVcGRhdGUnLCB7XG4gICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSkubmV4dChtb3ZlVG9Qcm9jZXNzZWQpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd0RlZmluaXRpb24gPSBpbml0TWV0YWRhdGFFbnRyeS5uZXh0KFxuICAgICAgY2xhc3NpZmljYXRpb25TdGVwXG4gICAgICAgIC5hZGRDYXRjaChuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2xhc3NpZmljYXRpb25GYWlsRERCVXBkYXRlJywge1xuICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICc6bmV3U3RhdHVzJzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygnY2xhc3NpZmljYXRpb24tZmFpbHVyZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSkubmV4dChtb3ZlVG9GYWlsZWQpLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSlcbiAgICAgICAgLm5leHQoXG4gICAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ0NsYXNzaWZpY2F0aW9uU3VjY2Vzc1VwZGF0ZScsIHtcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cywgQ2xhc3NpZmljYXRpb25SZXN1bHQgPSA6Y2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NsYXNzaWZpY2F0aW9uLWNvbXBsZXRlJyksXG4gICAgICAgICAgICAgICc6Y2xhc3NpZmljYXRpb25SZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApLm5leHQocHJvY2Vzc2luZ0NoYWluKTtcblxuICAgIGNvbnN0IHJvbGUgPSB0aGlzLmNyZWF0ZVN0YXRlTWFjaGluZVJvbGUoKTtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IG5ldyBTdGF0ZU1hY2hpbmUodGhpcywgc3RhdGVNYWNoaW5lSWQsIHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBEZWZpbml0aW9uQm9keS5mcm9tQ2hhaW5hYmxlKHdvcmtmbG93RGVmaW5pdGlvbiksXG4gICAgICB0aW1lb3V0OiB0aGlzLnByb3BzLndvcmtmbG93VGltZW91dCB8fCBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIHJvbGUsXG4gICAgICBlbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogbmV3IEN1c3RvbWVyTWFuYWdlZEVuY3J5cHRpb25Db25maWd1cmF0aW9uKHRoaXMuZW5jcnlwdGlvbktleSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUluZ3Jlc3NUcmlnZ2VyKHRoaXMsIHN0YXRlTWFjaGluZSwgdGhpcy5wcm9wcyk7XG5cbiAgICByZXR1cm4gc3RhdGVNYWNoaW5lO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0ZU1hY2hpbmVSb2xlKCk6IFJvbGUge1xuICAgIHJldHVybiBuZXcgUm9sZSh0aGlzLCAnU3RhdGVNYWNoaW5lUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3N0YXRlcy5hbWF6b25hd3MuY29tJyksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBTdGF0ZU1hY2hpbmVFeGVjdXRpb25Qb2xpY3k6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgLi4udGhpcy5pbmdyZXNzQWRhcHRlci5nZW5lcmF0ZUFkYXB0ZXJJQU1Qb2xpY2llcygpLFxuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ2R5bmFtb2RiOlB1dEl0ZW0nLCAnZHluYW1vZGI6VXBkYXRlSXRlbSddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLnRhYmxlQXJuXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTW92ZVRvRmFpbGVkQ2hhaW4oKSB7XG4gICAgY29uc3QgZmFpbGVkQ2hhaW4gPSB0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZXZlbnRicmlkZ2VCcm9rZXIpIHtcbiAgICAgIGNvbnN0IGViQ2hhaW4gPSB0aGlzLnByb3BzLmV2ZW50YnJpZGdlQnJva2VyLnNlbmRWaWFTZm5DaGFpbihcbiAgICAgICAgJ2RvY3VtZW50LXByb2Nlc3NpbmctZmFpbGVkJyxcbiAgICAgICAge1xuICAgICAgICAgIGRvY3VtZW50SWQ6IEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSxcbiAgICAgICAgICBjb250ZW50VHlwZTogSnNvblBhdGguc3RyaW5nQXQoJyQuY29udGVudFR5cGUnKSxcbiAgICAgICAgICBjb250ZW50OiBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY29udGVudCcpKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGZhaWxlZENoYWluLm5leHQoZWJDaGFpbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhaWxlZENoYWluO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNb3ZlVG9Qcm9jZXNzZWRDaGFpbigpIHtcbiAgICBjb25zdCBwcm9jZXNzZWRDaGFpbiA9IHRoaXMuaW5ncmVzc0FkYXB0ZXIuY3JlYXRlU3VjY2Vzc0NoYWluKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZXZlbnRicmlkZ2VCcm9rZXIpIHtcbiAgICAgIHByb2Nlc3NlZENoYWluLm5leHQoXG4gICAgICAgIHRoaXMucHJvcHMuZXZlbnRicmlkZ2VCcm9rZXIuc2VuZFZpYVNmbkNoYWluKFxuICAgICAgICAgICdkb2N1bWVudC1wcm9jZXNzZWQtc3VjY2Vzc2Z1bCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZG9jdW1lbnRJZDogSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpLFxuICAgICAgICAgICAgY29udGVudFR5cGU6IEpzb25QYXRoLnN0cmluZ0F0KCckLmNvbnRlbnRUeXBlJyksXG4gICAgICAgICAgICBjb250ZW50OiBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY29udGVudCcpKSxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiBKc29uUGF0aC5zdHJpbmdBdCgnJC5jbGFzc2lmaWNhdGlvblJlc3VsdC5kb2N1bWVudENsYXNzaWZpY2F0aW9uJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NlZENoYWluO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY3MoKTogSU1ldHJpY1tdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcCBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqICoqQ1JJVElDQUwqKjogTXVzdCBzZXQgYG91dHB1dFBhdGhgIHRvIHByZXNlcnZlIHdvcmtmbG93IHN0YXRlIGZvciBzdWJzZXF1ZW50IHN0ZXBzLlxuICAgKiBUaGUgY2xhc3NpZmljYXRpb24gcmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgYXQgYCQuY2xhc3NpZmljYXRpb25SZXN1bHRgIGZvciBEeW5hbW9EQiBzdG9yYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyB0YXNrIGZvciBkb2N1bWVudCBjbGFzc2lmaWNhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZTtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgZG9jdW1lbnQgcHJvY2Vzc2luZyBzdGVwIG9mIHRoZSB3b3JrZmxvdy5cbiAgICpcbiAgICogKipDUklUSUNBTCoqOiBNdXN0IHNldCBgb3V0cHV0UGF0aGAgdG8gcHJlc2VydmUgd29ya2Zsb3cgc3RhdGUgZm9yIHN1YnNlcXVlbnQgc3RlcHMuXG4gICAqIFRoZSBleHRyYWN0aW9uIHJlc3VsdCBzaG91bGQgYmUgYXZhaWxhYmxlIGF0IGAkLnByb2Nlc3NpbmdSZXN1bHRgIGZvciBEeW5hbW9EQiBzdG9yYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyB0YXNrIGZvciBkb2N1bWVudCBleHRyYWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG9wdGlvbmFsIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcCBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqICoqQ1JJVElDQUwqKjogSWYgaW1wbGVtZW50ZWQsIG11c3Qgc2V0IGBvdXRwdXRQYXRoYCB0byBwcmVzZXJ2ZSB3b3JrZmxvdyBzdGF0ZS5cbiAgICogVGhlIGVucmljaG1lbnQgcmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgYXQgYCQuZW5yaWNoZWRSZXN1bHRgIGZvciBEeW5hbW9EQiBzdG9yYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyB0YXNrIGZvciBkb2N1bWVudCBlbnJpY2htZW50LCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgb3B0aW9uYWwgcG9zdC1wcm9jZXNzaW5nIHN0ZXAgb2YgdGhlIHdvcmtmbG93LlxuICAgKlxuICAgKiAqKkNSSVRJQ0FMKio6IElmIGltcGxlbWVudGVkLCBtdXN0IHNldCBgb3V0cHV0UGF0aGAgdG8gcHJlc2VydmUgd29ya2Zsb3cgc3RhdGUuXG4gICAqIFRoZSBwb3N0LXByb2Nlc3NpbmcgcmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgYXQgYCQucG9zdFByb2Nlc3NlZFJlc3VsdGAgZm9yIER5bmFtb0RCIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIHRhc2sgZm9yIHBvc3QtcHJvY2Vzc2luZywgb3IgdW5kZWZpbmVkIHRvIHNraXAgdGhpcyBzdGVwXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkO1xufVxuIl19
380
+ BaseDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BaseDocumentProcessing", version: "1.6.0" };
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2Q0FBeUU7QUFFekUsMkRBQThGO0FBQzlGLGlEQUFxRTtBQUNyRSxpREFBc0c7QUFDdEcsaURBQTBDO0FBQzFDLHFFQUEySTtBQUMzSSxpRkFBMks7QUFDM0ssMkNBQXVDO0FBQ3ZDLHVDQUFzRDtBQUN0RCw2RkFBdUY7QUFHdkYsNENBQXdGO0FBQ3hGLDBHQUFxRztBQUNyRyw4SEFBd0g7QUFFeEgsNElBQXFJO0FBNkRySTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBc0Isc0JBQXVCLFNBQVEsc0JBQVM7SUFnQjVEOzs7Ozs7Ozs7T0FTRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksSUFBSSx5QkFBZSxFQUFFLENBQUM7UUFFcEUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsd0NBQThCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsd0NBQThCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0YsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIs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Q2pHLHlCQUF5QixFQUFFO2dCQUN6QixZQUFZLEVBQUUsOENBQW9CLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDO2dCQUN4RSx1QkFBdUIsRUFBRSw4Q0FBb0IsQ0FBQyxVQUFVLENBQUMsNEJBQVEsQ0FBQyxZQUFZLENBQUMsNEJBQVEsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO2FBQzdIO1lBQ0QsVUFBVSxFQUFFLDRCQUFRLENBQUMsT0FBTztTQUM3QixDQUFDLENBQ0g7YUFDQSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFekIsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDOztBQWhiSCx3REF5ZEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IER1cmF0aW9uLCBQcm9wZXJ0eUluamVjdG9ycywgUmVtb3ZhbFBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElNZXRyaWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUeXBlLCBCaWxsaW5nTW9kZSwgVGFibGUsIFRhYmxlRW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgeyBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5RG9jdW1lbnQsIFBvbGljeVN0YXRlbWVudCwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRFbmNyeXB0aW9uQ29uZmlndXJhdGlvbiwgRGVmaW5pdGlvbkJvZHksIElDaGFpbmFibGUsIEpzb25QYXRoLCBTdGF0ZU1hY2hpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBCZWRyb2NrSW52b2tlTW9kZWwsIER5bmFtb0F0dHJpYnV0ZVZhbHVlLCBEeW5hbW9QdXRJdGVtLCBEeW5hbW9VcGRhdGVJdGVtLCBMYW1iZGFJbnZva2UsIFN0ZXBGdW5jdGlvbnNTdGFydEV4ZWN1dGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSUFkYXB0ZXIsIFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlcic7XG5pbXBvcnQgeyBEZWZhdWx0RG9jdW1lbnRQcm9jZXNzaW5nQ29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWRvY3VtZW50LXByb2Nlc3NpbmctY29uZmlnJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgRXZlbnRicmlkZ2VCcm9rZXIgfSBmcm9tICcuLi9mcmFtZXdvcmsvZm91bmRhdGlvbi9ldmVudGJyaWRnZS1icm9rZXInO1xuaW1wb3J0IHsgTG9nR3JvdXBEYXRhUHJvdGVjdGlvblByb3BzLCBMb2dHcm91cERhdGFQcm90ZWN0aW9uVXRpbHMgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JzZXJ2YWJpbGl0eS9kZWZhdWx0LW9ic2VydmFiaWxpdHktY29uZmlnJztcbmltcG9ydCB7IExhbWJkYU9ic2VydmFiaWxpdHlQcm9wZXJ0eUluamVjdG9yIH0gZnJvbSAnLi4vdXRpbGl0aWVzL29ic2VydmFiaWxpdHkvbGFtYmRhLW9ic2VydmFiaWxpdHktcHJvcGVydHktaW5qZWN0b3InO1xuaW1wb3J0IHsgSU9ic2VydmFibGUsIE9ic2VydmFibGVQcm9wcyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L29ic2VydmFibGUnO1xuaW1wb3J0IHsgU3RhdGVNYWNoaW5lT2JzZXJ2YWJpbGl0eVByb3BlcnR5SW5qZWN0b3IgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JzZXJ2YWJpbGl0eS9zdGF0ZS1tYWNoaW5lLW9ic2VydmFiaWxpdHktcHJvcGVydHktaW5qZWN0b3InO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGV4dGVuZHMgT2JzZXJ2YWJsZVByb3BzIHtcblxuICAvKipcbiAgICogQWRhcHRlciB0aGF0IGRlZmluZXMgaG93IHRoZSBkb2N1bWVudCBwcm9jZXNzaW5nIHdvcmtmbG93IGlzIHRyaWdnZXJlZFxuICAgKlxuICAgKiBAZGVmYXVsdCBRdWV1ZWRTM0FkYXB0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGluZ3Jlc3NBZGFwdGVyPzogSUFkYXB0ZXI7XG5cbiAgLyoqXG4gICAqIER5bmFtb0RCIHRhYmxlIGZvciBzdG9yaW5nIGRvY3VtZW50IHByb2Nlc3NpbmcgbWV0YWRhdGEgYW5kIHdvcmtmbG93IHN0YXRlLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmV3IHRhYmxlIHdpbGwgYmUgY3JlYXRlZCB3aXRoIERvY3VtZW50SWQgYXMgcGFydGl0aW9uIGtleS5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlPzogVGFibGU7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgZm9yIHRoZSBTdGVwIEZ1bmN0aW9ucyB3b3JrZmxvdy5cbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIGNyZWF0ZWQgcmVzb3VyY2VzIChidWNrZXQsIHRhYmxlLCBxdWV1ZSkuXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBFdmVudEJyaWRnZSBicm9rZXIgZm9yIHB1Ymxpc2hpbmcgY3VzdG9tIGV2ZW50cyBkdXJpbmcgcHJvY2Vzc2luZy5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBubyBjdXN0b20gZXZlbnRzIHdpbGwgYmUgc2VudCBvdXQuXG4gICAqL1xuICByZWFkb25seSBldmVudGJyaWRnZUJyb2tlcj86IEV2ZW50YnJpZGdlQnJva2VyO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9nZ2luZyBhbmQgdHJhY2luZyBmb3IgYWxsIHN1cHBvcnRpbmcgcmVzb3VyY2VcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZU9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhhdCBjYW4gcnVuIGluc2lkZSBhIFZQQyB3aWxsIGZvbGxvdyB0aGUgcHJvdmlkZWQgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IHJlc291cmNlcyB3aWxsIHJ1biBvdXRzaWRlIG9mIGEgVlBDXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrPzogTmV0d29yaztcblxuICAvKipcbiAgICogS01TIGtleSB0byBiZSB1c2VkLlxuICAgKiBAZGVmYXVsdCBBIG5ldyBrZXkgd291bGQgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IEtleTtcbn1cblxuLyoqXG4gKiBVbmlvbiB0eXBlIGZvciBTdGVwIEZ1bmN0aW9ucyB0YXNrcyB0aGF0IGNhbiBiZSB1c2VkIGluIGRvY3VtZW50IHByb2Nlc3Npbmcgd29ya2Zsb3dzLlxuICogU3VwcG9ydHMgQmVkcm9jayBtb2RlbCBpbnZvY2F0aW9uLCBMYW1iZGEgZnVuY3Rpb24gaW52b2NhdGlvbiwgYW5kIG5lc3RlZCBTdGVwIEZ1bmN0aW9ucyBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlID0gQmVkcm9ja0ludm9rZU1vZGVsIHwgTGFtYmRhSW52b2tlIHwgU3RlcEZ1bmN0aW9uc1N0YXJ0RXhlY3V0aW9uO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHNlcnZlcmxlc3MgZG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvd3MuXG4gKlxuICogUHJvdmlkZXMgYSBjb21wbGV0ZSBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lIHdpdGg6XG4gKiAtICoqUzMgU3RvcmFnZSoqOiBPcmdhbml6ZWQgd2l0aCBwcmVmaXhlcyAocmF3LywgcHJvY2Vzc2VkLywgZmFpbGVkLykgZm9yIGRvY3VtZW50IGxpZmVjeWNsZSBtYW5hZ2VtZW50XG4gKiAtICoqU1FTIFF1ZXVlKio6IFJlbGlhYmxlIG1lc3NhZ2UgcHJvY2Vzc2luZyB3aXRoIGNvbmZpZ3VyYWJsZSB2aXNpYmlsaXR5IHRpbWVvdXQgYW5kIGRlYWQgbGV0dGVyIHF1ZXVlXG4gKiAtICoqRHluYW1vREIgVGFibGUqKjogV29ya2Zsb3cgbWV0YWRhdGEgdHJhY2tpbmcgd2l0aCBEb2N1bWVudElkIGFzIHBhcnRpdGlvbiBrZXlcbiAqIC0gKipTdGVwIEZ1bmN0aW9ucyoqOiBPcmNoZXN0cmF0ZWQgd29ya2Zsb3cgd2l0aCBhdXRvbWF0aWMgZmlsZSBtb3ZlbWVudCBiYXNlZCBvbiBwcm9jZXNzaW5nIG91dGNvbWVcbiAqIC0gKipBdXRvLXRyaWdnZXJpbmcqKjogUzMgZXZlbnQgbm90aWZpY2F0aW9ucyBhdXRvbWF0aWNhbGx5IHN0YXJ0IHByb2Nlc3Npbmcgd2hlbiBmaWxlcyBhcmUgdXBsb2FkZWQgdG8gcmF3LyBwcmVmaXhcbiAqIC0gKipFcnJvciBIYW5kbGluZyoqOiBGYWlsZWQgZG9jdW1lbnRzIGFyZSBtb3ZlZCB0byBmYWlsZWQvIHByZWZpeCB3aXRoIGVycm9yIGRldGFpbHMgc3RvcmVkIGluIER5bmFtb0RCXG4gKiAtICoqRXZlbnRCcmlkZ2UgSW50ZWdyYXRpb24qKjogT3B0aW9uYWwgY3VzdG9tIGV2ZW50IHB1Ymxpc2hpbmcgZm9yIHdvcmtmbG93IHN0YXRlIGNoYW5nZXNcbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmUgRmxvd1xuICogUzMgVXBsb2FkIChyYXcvKSDihpIgU1FTIOKGkiBMYW1iZGEgQ29uc3VtZXIg4oaSIFN0ZXAgRnVuY3Rpb25zIOKGkiBQcm9jZXNzaW5nIFN0ZXBzIOKGkiBTMyAocHJvY2Vzc2VkL2ZhaWxlZC8pXG4gKlxuICogIyMgSW1wbGVtZW50YXRpb24gUmVxdWlyZW1lbnRzXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGZvdXIgYWJzdHJhY3QgbWV0aG9kcyB0byBkZWZpbmUgdGhlIHByb2Nlc3Npbmcgd29ya2Zsb3c6XG4gKiAtIGBjbGFzc2lmaWNhdGlvblN0ZXAoKWA6IERvY3VtZW50IHR5cGUgY2xhc3NpZmljYXRpb25cbiAqIC0gYGV4dHJhY3Rpb25TdGVwKClgOiBEYXRhIGV4dHJhY3Rpb24gZnJvbSBkb2N1bWVudHNcbiAqIC0gYGVucmljaG1lbnRTdGVwKClgOiBPcHRpb25hbCBkYXRhIGVucmljaG1lbnQgKHJldHVybiB1bmRlZmluZWQgdG8gc2tpcClcbiAqIC0gYHBvc3RQcm9jZXNzaW5nU3RlcCgpYDogT3B0aW9uYWwgcG9zdC1wcm9jZXNzaW5nIChyZXR1cm4gdW5kZWZpbmVkIHRvIHNraXApXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSU9ic2VydmFibGUge1xuICAvKiogQnVzaW5lc3MgbWV0cmljIHNlcnZpY2UgbmFtZS4gVGhpcyBpcyBwYXJ0IG9mIHRoZSBpbml0aWFsIHNlcnZpY2UgZGltZW5zaW9uICovXG4gIHJlYWRvbmx5IG1ldHJpY1NlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBCdXNpbmVzcyBtZXRyaWMgbmFtZXNwYWNlLiAqL1xuICByZWFkb25seSBtZXRyaWNOYW1lc3BhY2U6IHN0cmluZztcbiAgLyoqIGxvZyBncm91cCBkYXRhIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiAqL1xuICByZWFkb25seSBsb2dHcm91cERhdGFQcm90ZWN0aW9uOiBMb2dHcm91cERhdGFQcm90ZWN0aW9uUHJvcHM7XG4gIC8qKiBEeW5hbW9EQiB0YWJsZSBmb3Igc3RvcmluZyBkb2N1bWVudCBwcm9jZXNzaW5nIG1ldGFkYXRhIGFuZCB3b3JrZmxvdyBzdGF0ZSAqL1xuICByZWFkb25seSBkb2N1bWVudFByb2Nlc3NpbmdUYWJsZTogVGFibGU7XG4gIC8qKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEJhc2VEb2N1bWVudFByb2Nlc3NpbmdQcm9wcztcbiAgLyoqIEtNUyBrZXkgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogS2V5O1xuICAvKiogSW5ncmVzcyBhZGFwdGVyLCByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB3b3JrZmxvdyAqL1xuICByZWFkb25seSBpbmdyZXNzQWRhcHRlcjogSUFkYXB0ZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQmFzZURvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjb21wbGV0ZSBkb2N1bWVudCBwcm9jZXNzaW5nIGluZnJhc3RydWN0dXJlIGluY2x1ZGluZyBTMyBidWNrZXQsXG4gICAqIFNRUyBxdWV1ZSwgRHluYW1vREIgdGFibGUsIGFuZCBzZXRzIHVwIFMzIGV2ZW50IG5vdGlmaWNhdGlvbnMgdG8gdHJpZ2dlciBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5pbmdyZXNzQWRhcHRlciA9IHByb3BzLmluZ3Jlc3NBZGFwdGVyIHx8IG5ldyBRdWV1ZWRTM0FkYXB0ZXIoKTtcblxuICAgIGlmIChwcm9wcy5uZXR3b3JrKSB7XG4gICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1zZm4nLCBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuU1RFUF9GVU5DVElPTlMpO1xuICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2UtZWInLCBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuRVZFTlRCUklER0UpO1xuICAgICAgaWYgKHByb3BzLmVuYWJsZU9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2UtbG9ncycsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5DTE9VRFdBVENIX0xPR1MpO1xuICAgICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1tZXRyaWNzJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkNMT1VEV0FUQ0hfTU9OSVRPUklORyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pbmdyZXNzQWRhcHRlci5pbml0KHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXkgfHwgbmV3IEtleSh0aGlzLCAnSURQRW5jcnlwdGlvbktleScsIHtcbiAgICAgIGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0dyb3VwRGF0YVByb3RlY3Rpb24gPSBMb2dHcm91cERhdGFQcm90ZWN0aW9uVXRpbHMuaGFuZGxlRGVmYXVsdCh0aGlzLCBwcm9wcy5sb2dHcm91cERhdGFQcm90ZWN0aW9uLCBwcm9wcy5yZW1vdmFsUG9saWN5KTtcblxuICAgIHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUgPSBwcm9wcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSB8fCBuZXcgVGFibGUodGhpcywgJ0RvY3VtZW50UHJvY2Vzc2luZ1RhYmxlJywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeUVuYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbjogVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRUQsXG4gICAgICBlbmNyeXB0aW9uS2V5OiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSkge1xuICAgICAgUHJvcGVydHlJbmplY3RvcnMub2YodGhpcykuYWRkKFxuICAgICAgICBuZXcgU3RhdGVNYWNoaW5lT2JzZXJ2YWJpbGl0eVByb3BlcnR5SW5qZWN0b3IodGhpcy5sb2dHcm91cERhdGFQcm90ZWN0aW9uKSxcbiAgICAgICAgbmV3IExhbWJkYU9ic2VydmFiaWxpdHlQcm9wZXJ0eUluamVjdG9yKHRoaXMubG9nR3JvdXBEYXRhUHJvdGVjdGlvbiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubWV0cmljTmFtZXNwYWNlID0gcHJvcHMubWV0cmljTmFtZXNwYWNlIHx8IERlZmF1bHRPYnNlcnZhYmlsaXR5Q29uZmlnLkRFRkFVTFRfTUVUUklDX05BTUVTUEFDRTtcbiAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lID0gcHJvcHMubWV0cmljU2VydmljZU5hbWUgfHwgRGVmYXVsdERvY3VtZW50UHJvY2Vzc2luZ0NvbmZpZy5ERUZBVUxUX09CU0VSVkFCSUxJVFlfTUVUUklDX1NWQ19OQU1FO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgaGFuZGxlU3RhdGVNYWNoaW5lQ3JlYXRpb24oc3RhdGVNYWNoaW5lSWQ6IHN0cmluZykge1xuICAgIC8vIENoZWNrIGlmIHByZXByb2Nlc3NpbmcgaXMgbmVlZGVkIChlLmcuLCBmb3IgY2h1bmtpbmcgbGFyZ2UgZG9jdW1lbnRzKVxuICAgIGNvbnN0IHByZXByb2Nlc3NpbmdTdGVwID0gdGhpcy5wcmVwcm9jZXNzaW5nU3RlcCgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBtZXRhZGF0YSBlbnRyeSBpbiBEeW5hbW9EQlxuICAgIC8vIEJhc2UgY2xhc3Mgb25seSBrbm93cyBhYm91dCBjb3JlIGRvY3VtZW50IGZpZWxkc1xuICAgIGNvbnN0IGJhc2VJdGVtOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbW9BdHRyaWJ1dGVWYWx1ZT4gPSB7XG4gICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICBDb250ZW50VHlwZTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50VHlwZScpKSxcbiAgICAgIENvbnRlbnQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLmNvbnRlbnQnKSkpLFxuICAgICAgV29ya2Zsb3dTdGF0dXM6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ3BlbmRpbmcnKSxcbiAgICAgIFN0YXRlTWFjaGluZUV4ZWNJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJCQuRXhlY3V0aW9uLklkJykpLFxuICAgIH07XG5cbiAgICAvLyBBbGxvdyBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgdG8gYWRkIHByZXByb2Nlc3Npbmctc3BlY2lmaWMgbWV0YWRhdGFcbiAgICAvLyBUaGlzIGlzIGEgaG9vayBmb3Igc3ViY2xhc3NlcyB0byBleHRlbmQgdGhlIHNjaGVtYSB3aXRob3V0IGJhc2UgY2xhc3Mga25vd2luZyB0aGUgZGV0YWlsc1xuICAgIGNvbnN0IGFkZGl0aW9uYWxNZXRhZGF0YSA9IHRoaXMucHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk7XG4gICAgT2JqZWN0LmFzc2lnbihiYXNlSXRlbSwgYWRkaXRpb25hbE1ldGFkYXRhKTtcblxuICAgIGNvbnN0IGluaXRNZXRhZGF0YUVudHJ5ID0gbmV3IER5bmFtb1B1dEl0ZW0odGhpcywgJ0luaXRNZXRhZGF0YUVudHJ5Jywge1xuICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICBpdGVtOiBiYXNlSXRlbSxcbiAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgfSk7XG5cbiAgICAvLyBCdWlsZCB3b3JrZmxvdzogaWYgcHJlcHJvY2Vzc2luZyBleGlzdHMsIGNoYWluIGl0IGJlZm9yZSB0aGUgbWFpbiB3b3JrZmxvd1xuICAgIGxldCB3b3JrZmxvd0RlZmluaXRpb246IElDaGFpbmFibGU7XG4gICAgaWYgKHByZXByb2Nlc3NpbmdTdGVwKSB7XG4gICAgICAvLyBQcmVwcm9jZXNzaW5nIOKGkiBJbml0TWV0YWRhdGEg4oaSIEN1c3RvbSBQcm9jZXNzaW5nIFdvcmtmbG93XG4gICAgICB3b3JrZmxvd0RlZmluaXRpb24gPSBwcmVwcm9jZXNzaW5nU3RlcFxuICAgICAgICAubmV4dChpbml0TWV0YWRhdGFFbnRyeSlcbiAgICAgICAgLm5leHQodGhpcy5jcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRNZXRhZGF0YSDihpIgU3RhbmRhcmQgUHJvY2Vzc2luZyBXb3JrZmxvdyAoYmFja3dhcmQgY29tcGF0aWJsZSlcbiAgICAgIHdvcmtmbG93RGVmaW5pdGlvbiA9IGluaXRNZXRhZGF0YUVudHJ5XG4gICAgICAgIC5uZXh0KHRoaXMuY3JlYXRlU3RhbmRhcmRQcm9jZXNzaW5nV29ya2Zsb3coKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sZSA9IHRoaXMuY3JlYXRlU3RhdGVNYWNoaW5lUm9sZSgpO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KHJvbGUpO1xuXG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gbmV3IFN0YXRlTWFjaGluZSh0aGlzLCBzdGF0ZU1hY2hpbmVJZCwge1xuICAgICAgZGVmaW5pdGlvbkJvZHk6IERlZmluaXRpb25Cb2R5LmZyb21DaGFpbmFibGUod29ya2Zsb3dEZWZpbml0aW9uKSxcbiAgICAgIHRpbWVvdXQ6IHRoaXMucHJvcHMud29ya2Zsb3dUaW1lb3V0IHx8IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgcm9sZSxcbiAgICAgIGVuY3J5cHRpb25Db25maWd1cmF0aW9uOiBuZXcgQ3VzdG9tZXJNYW5hZ2VkRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24odGhpcy5lbmNyeXB0aW9uS2V5KSxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5ncmVzc0FkYXB0ZXIuY3JlYXRlSW5ncmVzc1RyaWdnZXIodGhpcywgc3RhdGVNYWNoaW5lLCB0aGlzLnByb3BzKTtcblxuICAgIHJldHVybiBzdGF0ZU1hY2hpbmU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRlTWFjaGluZVJvbGUoKTogUm9sZSB7XG4gICAgcmV0dXJuIG5ldyBSb2xlKHRoaXMsICdTdGF0ZU1hY2hpbmVSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnc3RhdGVzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIFN0YXRlTWFjaGluZUV4ZWN1dGlvblBvbGljeTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAuLi50aGlzLmluZ3Jlc3NBZGFwdGVyLmdlbmVyYXRlQWRhcHRlcklBTVBvbGljaWVzKCksXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnZHluYW1vZGI6UHV0SXRlbScsICdkeW5hbW9kYjpVcGRhdGVJdGVtJ10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW3RoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUudGFibGVBcm5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNb3ZlVG9GYWlsZWRDaGFpbihpZFByZWZpeD86IHN0cmluZykge1xuICAgIGNvbnN0IGZhaWxlZENoYWluID0gdGhpcy5pbmdyZXNzQWRhcHRlci5jcmVhdGVGYWlsZWRDaGFpbih0aGlzLCBpZFByZWZpeCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5ldmVudGJyaWRnZUJyb2tlcikge1xuICAgICAgY29uc3QgZWJDaGFpbiA9IHRoaXMucHJvcHMuZXZlbnRicmlkZ2VCcm9rZXIuc2VuZFZpYVNmbkNoYWluKFxuICAgICAgICAnZG9jdW1lbnQtcHJvY2Vzc2luZy1mYWlsZWQnLFxuICAgICAgICB7XG4gICAgICAgICAgZG9jdW1lbnRJZDogSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiBKc29uUGF0aC5zdHJpbmdBdCgnJC5jb250ZW50VHlwZScpLFxuICAgICAgICAgIGNvbnRlbnQ6IEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5jb250ZW50JykpLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgZmFpbGVkQ2hhaW4ubmV4dChlYkNoYWluKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFpbGVkQ2hhaW47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1vdmVUb1Byb2Nlc3NlZENoYWluKGlkUHJlZml4Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkQ2hhaW4gPSB0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZVN1Y2Nlc3NDaGFpbih0aGlzLCBpZFByZWZpeCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5ldmVudGJyaWRnZUJyb2tlcikge1xuICAgICAgcHJvY2Vzc2VkQ2hhaW4ubmV4dChcbiAgICAgICAgdGhpcy5wcm9wcy5ldmVudGJyaWRnZUJyb2tlci5zZW5kVmlhU2ZuQ2hhaW4oXG4gICAgICAgICAgJ2RvY3VtZW50LXByb2Nlc3NlZC1zdWNjZXNzZnVsJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkb2N1bWVudElkOiBKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJyksXG4gICAgICAgICAgICBjb250ZW50VHlwZTogSnNvblBhdGguc3RyaW5nQXQoJyQuY29udGVudFR5cGUnKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5jb250ZW50JykpLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IEpzb25QYXRoLnN0cmluZ0F0KCckLmNsYXNzaWZpY2F0aW9uUmVzdWx0LmRvY3VtZW50Q2xhc3NpZmljYXRpb24nKSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkQ2hhaW47XG4gIH1cblxuICBwdWJsaWMgbWV0cmljcygpOiBJTWV0cmljW10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBvcHRpb25hbCBwcmVwcm9jZXNzaW5nIHN0ZXAgb2YgdGhlIHdvcmtmbG93LlxuICAgKlxuICAgKiBUaGlzIHN0ZXAgcnVucyBCRUZPUkUgSW5pdCBNZXRhZGF0YSBhbmQgY2FuIGJlIHVzZWQgZm9yOlxuICAgKiAtIERvY3VtZW50IGNodW5raW5nIGZvciBsYXJnZSBmaWxlc1xuICAgKiAtIERvY3VtZW50IHZhbGlkYXRpb25cbiAgICogLSBGb3JtYXQgY29udmVyc2lvblxuICAgKiAtIEFueSBvdGhlciBwcmVwcm9jZXNzaW5nIG5lZWRlZCBiZWZvcmUgY2xhc3NpZmljYXRpb25cbiAgICpcbiAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIGNhbiByZXR1cm4gdW5kZWZpbmVkIHRvIHNraXAgcHJlcHJvY2Vzc2luZyxcbiAgICogbWFpbnRhaW5pbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHdvcmtmbG93cy5cbiAgICpcbiAgICogQHJldHVybnMgU3RlcCBGdW5jdGlvbnMgdGFzayBmb3IgcHJlcHJvY2Vzc2luZywgb3IgdW5kZWZpbmVkIHRvIHNraXAgdGhpcyBzdGVwXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJlcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvb2sgZm9yIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyB0byBhZGQgcHJlcHJvY2Vzc2luZy1zcGVjaWZpYyBtZXRhZGF0YSB0byBEeW5hbW9EQi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBJbml0TWV0YWRhdGEgY3JlYXRpb24gYW5kIGFsbG93cyBzdWJjbGFzc2VzIHRvIGV4dGVuZFxuICAgKiB0aGUgRHluYW1vREIgc2NoZW1hIHdpdGggdGhlaXIgb3duIGZpZWxkcyB3aXRob3V0IHRoZSBiYXNlIGNsYXNzIGtub3dpbmcgdGhlIGRldGFpbHMuXG4gICAqXG4gICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIHRoZSBjb3JlIGRvY3VtZW50IGZpZWxkcyAoRG9jdW1lbnRJZCwgQ29udGVudFR5cGUsIGV0Yy4pLFxuICAgKiBhbmQgc3ViY2xhc3NlcyBjYW4gYWRkIHRoZWlyIG93biBmaWVsZHMgKGUuZy4sIGNodW5raW5nIG1ldGFkYXRhKSBieSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcmV0dXJucyBSZWNvcmQgb2YgYWRkaXRpb25hbCBEeW5hbW9EQiBhdHRyaWJ1dGUgdmFsdWVzIHRvIGluY2x1ZGUgaW4gSW5pdE1ldGFkYXRhXG4gICAqIEBkZWZhdWx0IHt9IChubyBhZGRpdGlvbmFsIG1ldGFkYXRhKVxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdNZXRhZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbW9BdHRyaWJ1dGVWYWx1ZT4ge1xuICAgIC8vIERlZmF1bHQ6IG5vIGFkZGl0aW9uYWwgbWV0YWRhdGFcbiAgICAvLyBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gYWRkIHRoZWlyIG93biBwcmVwcm9jZXNzaW5nLXNwZWNpZmljIGZpZWxkc1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcm9jZXNzaW5nIHdvcmtmbG93IGFmdGVyIHByZXByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uLlxuICAgKlxuICAgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGN1c3RvbWl6ZSB0aGlzIHRvIGhhbmRsZSBwcmVwcm9jZXNzaW5nIHJlc3VsdHMuXG4gICAqIEZvciBleGFtcGxlLCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIHVzZXMgdGhpcyB0byBhZGQgY29uZGl0aW9uYWwgYnJhbmNoaW5nXG4gICAqIGZvciBjaHVua2VkIHZzIG5vbi1jaHVua2VkIGRvY3VtZW50cy5cbiAgICpcbiAgICogSW1wbGVtZW50YXRpb25zIGNhbiBjYWxsIGBjcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpYCB0byByZXVzZSB0aGVcbiAgICogc3RhbmRhcmQgcHJvY2Vzc2luZyBmbG93IChDbGFzc2lmaWNhdGlvbiDihpIgUHJvY2Vzc2luZyDihpIgRW5yaWNobWVudCDihpIgUG9zdFByb2Nlc3NpbmcpLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyBjaGFpbiBmb3IgcHJvY2Vzc2luZyB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKTogSUNoYWluYWJsZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgc3RhbmRhcmQgcHJvY2Vzc2luZyB3b3JrZmxvdyAobm8gcHJlcHJvY2Vzc2luZyBjdXN0b21pemF0aW9uKS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZXhpc3Rpbmcgd29ya2Zsb3c6IENsYXNzaWZpY2F0aW9uIOKGkiBQcm9jZXNzaW5nIOKGkiBFbnJpY2htZW50IOKGkiBQb3N0UHJvY2Vzc2luZ1xuICAgKiBDb25jcmV0ZSBjbGFzc2VzIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHRvIHJldXNlIHRoZSBzdGFuZGFyZCBmbG93IHdoZW4gdGhleSBkb24ndFxuICAgKiBuZWVkIGN1c3RvbSB3b3JrZmxvdyBicmFuY2hpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByZWZpeCBPcHRpb25hbCBwcmVmaXggZm9yIGNvbnN0cnVjdCBJRHMgdG8gZW5zdXJlIHVuaXF1ZW5lc3Mgd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXNcbiAgICogQHJldHVybnMgU3RlcCBGdW5jdGlvbnMgY2hhaW4gZm9yIHN0YW5kYXJkIHByb2Nlc3NpbmdcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdyhpZFByZWZpeD86IHN0cmluZyk6IElDaGFpbmFibGUge1xuICAgIGNvbnN0IGNsYXNzaWZpY2F0aW9uU3RlcCA9IHRoaXMuY2xhc3NpZmljYXRpb25TdGVwKCk7XG4gICAgY29uc3QgcHJvY2Vzc2luZ1N0ZXAgPSB0aGlzLnByb2Nlc3NpbmdTdGVwKCk7XG4gICAgY29uc3QgZW5yaWNobWVudFN0ZXAgPSB0aGlzLmVucmljaG1lbnRTdGVwKCk7XG4gICAgY29uc3QgcG9zdFByb2Nlc3NpbmdTdGVwID0gdGhpcy5wb3N0UHJvY2Vzc2luZ1N0ZXAoKTtcblxuICAgIC8vIEZpbGUgbW92ZW1lbnQgb3BlcmF0aW9uc1xuICAgIGNvbnN0IG1vdmVUb0ZhaWxlZCA9IHRoaXMuY3JlYXRlTW92ZVRvRmFpbGVkQ2hhaW4oaWRQcmVmaXgpO1xuICAgIGNvbnN0IG1vdmVUb1Byb2Nlc3NlZCA9IHRoaXMuY3JlYXRlTW92ZVRvUHJvY2Vzc2VkQ2hhaW4oaWRQcmVmaXgpO1xuXG4gICAgY29uc3QgcHJlZml4ID0gaWRQcmVmaXggPyBgJHtpZFByZWZpeH0tYCA6ICcnO1xuXG4gICAgY29uc3QgcHJvY2Vzc2luZ0NoYWluID0gcHJvY2Vzc2luZ1N0ZXBcbiAgICAgIC5hZGRDYXRjaChuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCBgJHtwcmVmaXh9UHJvY2Vzc2luZ0ZhaWxEREJVcGRhdGVgLCB7XG4gICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICBrZXk6IHtcbiAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzJyxcbiAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICc6bmV3U3RhdHVzJzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygncHJvY2Vzc2luZy1mYWlsdXJlJyksXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICB9KS5uZXh0KG1vdmVUb0ZhaWxlZCksIHtcbiAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgIH0pXG4gICAgICAubmV4dChcbiAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgYCR7cHJlZml4fVByb2Nlc3NpbmdTdWNjZXNzVXBkYXRlYCwge1xuICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIFByb2Nlc3NpbmdSZXN1bHQgPSA6cHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwcm9jZXNzaW5nLWNvbXBsZXRlJyksXG4gICAgICAgICAgICAnOnByb2Nlc3NpbmdSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5wcm9jZXNzaW5nUmVzdWx0JykpKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBjb21wbGV0ZSBjaGFpbiBpbmNsdWRpbmcgb3B0aW9uYWwgc3RlcHNcbiAgICBpZiAoZW5yaWNobWVudFN0ZXApIHtcbiAgICAgIGNvbnN0IGVucmljaG1lbnRDaGFpbiA9IGVucmljaG1lbnRTdGVwXG4gICAgICAgIC5hZGRDYXRjaChuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCBgJHtwcmVmaXh9RW5yaWNobWVudEZhaWxEREJVcGRhdGVgLCB7XG4gICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdlbnJpY2htZW50LWZhaWx1cmUnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgIH0pLm5leHQobW92ZVRvRmFpbGVkKSwge1xuICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgIH0pXG4gICAgICAgIC5uZXh0KFxuICAgICAgICAgIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsIGAke3ByZWZpeH1FbnJpY2htZW50U3VjY2Vzc1VwZGF0ZWAsIHtcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cywgRW5yaWNobWVudFJlc3VsdCA9IDplbnJpY2htZW50UmVzdWx0JyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBwb3N0UHJvY2Vzc2luZ1N0ZXAgPyBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdlbnJpY2htZW50LWNvbXBsZXRlJykgOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgICAgICAnOmVucmljaG1lbnRSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5lbnJpY2hlZFJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgcHJvY2Vzc2luZ0NoYWluLm5leHQoZW5yaWNobWVudENoYWluKTtcblxuICAgICAgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgICBjb25zdCBwb3N0UHJvY2Vzc2luZ0NoYWluID0gcG9zdFByb2Nlc3NpbmdTdGVwXG4gICAgICAgICAgLmFkZENhdGNoKG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsIGAke3ByZWZpeH1Qb3N0UHJvY2Vzc2luZ0ZhaWxEREJVcGRhdGVgLCB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ3Bvc3QtcHJvY2Vzc2luZy1mYWlsdXJlJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KS5uZXh0KG1vdmVUb0ZhaWxlZCksIHtcbiAgICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAubmV4dChcbiAgICAgICAgICAgIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsIGAke3ByZWZpeH1Qb3N0UHJvY2Vzc2luZ1N1Y2Nlc3NVcGRhdGVgLCB7XG4gICAgICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzLCBQb3N0UHJvY2Vzc2luZ1Jlc3VsdCA9IDpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NvbXBsZXRlJyksXG4gICAgICAgICAgICAgICAgJzpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLnBvc3RQcm9jZXNzZWRSZXN1bHQnKSkpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICAgICAgfSkubmV4dChtb3ZlVG9Qcm9jZXNzZWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIGVucmljaG1lbnRDaGFpbi5uZXh0KHBvc3RQcm9jZXNzaW5nQ2hhaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5yaWNobWVudENoYWluLm5leHQobW92ZVRvUHJvY2Vzc2VkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgY29uc3QgcG9zdFByb2Nlc3NpbmdDaGFpbiA9IHBvc3RQcm9jZXNzaW5nU3RlcFxuICAgICAgICAuYWRkQ2F0Y2gobmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgYCR7cHJlZml4fVBvc3RQcm9jZXNzaW5nRmFpbEREQlVwZGF0ZTJgLCB7XG4gICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctZmFpbHVyZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSkubmV4dChtb3ZlVG9GYWlsZWQpLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSlcbiAgICAgICAgLm5leHQoXG4gICAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgYCR7cHJlZml4fVBvc3RQcm9jZXNzaW5nU3VjY2Vzc1VwZGF0ZTJgLCB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIFBvc3RQcm9jZXNzaW5nUmVzdWx0ID0gOnBvc3RQcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgICAgICAnOnBvc3RQcm9jZXNzaW5nUmVzdWx0JzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQucG9zdFByb2Nlc3NlZFJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KS5uZXh0KG1vdmVUb1Byb2Nlc3NlZCksXG4gICAgICAgICk7XG4gICAgICBwcm9jZXNzaW5nQ2hhaW4ubmV4dChwb3N0UHJvY2Vzc2luZ0NoYWluKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gb3B0aW9uYWwgc3RlcHMgLSBtYXJrIGFzIGNvbXBsZXRlIGFmdGVyIGV4dHJhY3Rpb25cbiAgICAgIHByb2Nlc3NpbmdDaGFpbi5uZXh0KFxuICAgICAgICBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCBgJHtwcmVmaXh9V29ya2Zsb3dDb21wbGV0ZVVwZGF0ZWAsIHtcbiAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzJyxcbiAgICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NvbXBsZXRlJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICB9KS5uZXh0KG1vdmVUb1Byb2Nlc3NlZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzaWZpY2F0aW9uQ2hhaW4gPSBjbGFzc2lmaWNhdGlvblN0ZXBcbiAgICAgIC5hZGRDYXRjaChuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCBgJHtwcmVmaXh9Q2xhc3NpZmljYXRpb25GYWlsRERCVXBkYXRlYCwge1xuICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAga2V5OiB7XG4gICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NsYXNzaWZpY2F0aW9uLWZhaWx1cmUnKSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgIH0pLm5leHQobW92ZVRvRmFpbGVkKSwge1xuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSlcbiAgICAgIC5uZXh0KFxuICAgICAgICBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCBgJHtwcmVmaXh9Q2xhc3NpZmljYXRpb25TdWNjZXNzVXBkYXRlYCwge1xuICAgICAgICAgIHRhYmxlOiB0aGlzLmRvY3VtZW50UHJvY2Vzc2luZ1RhYmxlLFxuICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIENsYXNzaWZpY2F0aW9uUmVzdWx0ID0gOmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NsYXNzaWZpY2F0aW9uLWNvbXBsZXRlJyksXG4gICAgICAgICAgICAnOmNsYXNzaWZpY2F0aW9uUmVzdWx0JzogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnKSkpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAubmV4dChwcm9jZXNzaW5nQ2hhaW4pO1xuXG4gICAgcmV0dXJuIGNsYXNzaWZpY2F0aW9uQ2hhaW47XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcCBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqICoqQ1JJVElDQUwqKjogTXVzdCBzZXQgYG91dHB1dFBhdGhgIHRvIHByZXNlcnZlIHdvcmtmbG93IHN0YXRlIGZvciBzdWJzZXF1ZW50IHN0ZXBzLlxuICAgKiBUaGUgY2xhc3NpZmljYXRpb24gcmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgYXQgYCQuY2xhc3NpZmljYXRpb25SZXN1bHRgIGZvciBEeW5hbW9EQiBzdG9yYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyB0YXNrIGZvciBkb2N1bWVudCBjbGFzc2lmaWNhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZTtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgZG9jdW1lbnQgcHJvY2Vzc2luZyBzdGVwIG9mIHRoZSB3b3JrZmxvdy5cbiAgICpcbiAgICogKipDUklUSUNBTCoqOiBNdXN0IHNldCBgb3V0cHV0UGF0aGAgdG8gcHJlc2VydmUgd29ya2Zsb3cgc3RhdGUgZm9yIHN1YnNlcXVlbnQgc3RlcHMuXG4gICAqIFRoZSBleHRyYWN0aW9uIHJlc3VsdCBzaG91bGQgYmUgYXZhaWxhYmxlIGF0IGAkLnByb2Nlc3NpbmdSZXN1bHRgIGZvciBEeW5hbW9EQiBzdG9yYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyB0YXNrIGZvciBkb2N1bWVudCBleHRyYWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG9wdGlvbmFsIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcCBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqICoqQ1JJVElDQUwqKjogSWYgaW1wbGVtZW50ZWQsIG11c3Qgc2V0IGBvdXRwdXRQYXRoYCB0byBwcmVzZXJ2ZSB3b3JrZmxvdyBzdGF0ZS5cbiAgICogVGhlIGVucmljaG1lbnQgcmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgYXQgYCQuZW5yaWNoZWRSZXN1bHRgIGZvciBEeW5hbW9EQiBzdG9yYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyB0YXNrIGZvciBkb2N1bWVudCBlbnJpY2htZW50LCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgb3B0aW9uYWwgcG9zdC1wcm9jZXNzaW5nIHN0ZXAgb2YgdGhlIHdvcmtmbG93LlxuICAgKlxuICAgKiAqKkNSSVRJQ0FMKio6IElmIGltcGxlbWVudGVkLCBtdXN0IHNldCBgb3V0cHV0UGF0aGAgdG8gcHJlc2VydmUgd29ya2Zsb3cgc3RhdGUuXG4gICAqIFRoZSBwb3N0LXByb2Nlc3NpbmcgcmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgYXQgYCQucG9zdFByb2Nlc3NlZFJlc3VsdGAgZm9yIER5bmFtb0RCIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIHRhc2sgZm9yIHBvc3QtcHJvY2Vzc2luZywgb3IgdW5kZWZpbmVkIHRvIHNraXAgdGhpcyBzdGVwXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkO1xufVxuIl19