@cdklabs/cdk-appmod-catalog-blueprints 1.16.0 → 1.17.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 (66) hide show
  1. package/.jsii +992 -168
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
  3. package/lib/document-processing/agentic-document-processing.js +1 -1
  4. package/lib/document-processing/base-document-processing.js +1 -1
  5. package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
  6. package/lib/document-processing/bedrock-document-processing.js +10 -6
  7. package/lib/document-processing/default-document-processing-config.js +1 -1
  8. package/lib/document-processing/index.d.ts +2 -0
  9. package/lib/document-processing/index.js +3 -1
  10. package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
  11. package/lib/document-processing/localstack-agentic-document-processing.js +66 -0
  12. package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
  13. package/lib/document-processing/localstack-bedrock-document-processing.js +38 -0
  14. package/lib/document-processing/resources/cleanup/handler.py +16 -1
  15. package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
  16. package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
  17. package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
  18. package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
  19. package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
  20. package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
  21. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +78 -0
  22. package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
  23. package/lib/document-processing/tests/localstack-document-processing.test.js +116 -0
  24. package/lib/framework/agents/base-agent.js +1 -1
  25. package/lib/framework/agents/batch-agent.d.ts +1 -0
  26. package/lib/framework/agents/batch-agent.js +7 -4
  27. package/lib/framework/agents/default-agent-config.js +1 -1
  28. package/lib/framework/agents/index.d.ts +1 -0
  29. package/lib/framework/agents/index.js +2 -1
  30. package/lib/framework/agents/interactive-agent.js +88 -11
  31. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +1 -1
  32. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +1 -1
  33. package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
  34. package/lib/framework/agents/localstack-batch-agent.js +33 -0
  35. package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
  36. package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
  37. package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
  38. package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
  39. package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
  40. package/lib/framework/bedrock/bedrock.d.ts +9 -0
  41. package/lib/framework/bedrock/bedrock.js +20 -10
  42. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  43. package/lib/framework/foundation/access-log.js +1 -1
  44. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  45. package/lib/framework/foundation/network.d.ts +1 -1
  46. package/lib/framework/foundation/network.js +8 -3
  47. package/lib/framework/index.d.ts +1 -0
  48. package/lib/framework/index.js +2 -1
  49. package/lib/framework/localstack/index.d.ts +1 -0
  50. package/lib/framework/localstack/index.js +18 -0
  51. package/lib/framework/localstack/localstack-config.d.ts +79 -0
  52. package/lib/framework/localstack/localstack-config.js +49 -0
  53. package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
  54. package/lib/framework/tests/localstack-batch-agent.test.js +67 -0
  55. package/lib/tsconfig.tsbuildinfo +1 -1
  56. package/lib/utilities/data-loader.js +1 -1
  57. package/lib/utilities/lambda-iam-utils.js +1 -1
  58. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  59. package/lib/utilities/observability/cloudwatch-transaction-search.js +1 -1
  60. package/lib/utilities/observability/default-observability-config.js +1 -1
  61. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  62. package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
  63. package/lib/utilities/observability/powertools-config.js +1 -1
  64. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  65. package/lib/webapp/frontend-construct.js +1 -1
  66. package/package.json +1 -1
@@ -73,11 +73,12 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
73
73
  this._enrichmentStepCounter = 0;
74
74
  /** Counter for generating unique post-processing step IDs */
75
75
  this._postProcessingStepCounter = 0;
76
+ const internalProps = props;
76
77
  // Validate chunking configuration if provided
77
78
  if (props.enableChunking && props.chunkingConfig) {
78
79
  this.validateChunkingConfig(props.chunkingConfig);
79
80
  }
80
- if (props.network) {
81
+ if (props.network && !internalProps._skipBedrockVpcEndpoints) {
81
82
  props.network.createServiceEndpoint('vpce-bedrock', aws_ec2_1.InterfaceVpcEndpointAwsService.BEDROCK);
82
83
  props.network.createServiceEndpoint('vpce-bedrock-runtime', aws_ec2_1.InterfaceVpcEndpointAwsService.BEDROCK_RUNTIME);
83
84
  }
@@ -186,7 +187,7 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
186
187
  functionName: generatedLogPermissions.uniqueFunctionName,
187
188
  architecture: aws_lambda_1.Architecture.X86_64,
188
189
  runtime: framework_1.DefaultRuntimes.PYTHON,
189
- entry: path.join(__dirname, 'resources/default-bedrock-invoke'),
190
+ entry: this.resolveBedrockInvokeEntry(),
190
191
  role,
191
192
  memorySize: 512,
192
193
  timeout: this.bedrockDocumentProcessingProps.stepTimeouts || aws_cdk_lib_1.Duration.minutes(5),
@@ -252,7 +253,7 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
252
253
  functionName: generatedLogPermissions.uniqueFunctionName,
253
254
  runtime: framework_1.DefaultRuntimes.PYTHON,
254
255
  architecture: aws_lambda_1.Architecture.X86_64,
255
- entry: path.join(__dirname, 'resources/default-bedrock-invoke'),
256
+ entry: this.resolveBedrockInvokeEntry(),
256
257
  role,
257
258
  memorySize: 512,
258
259
  timeout: this.bedrockDocumentProcessingProps.stepTimeouts || aws_cdk_lib_1.Duration.minutes(5),
@@ -303,6 +304,9 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
303
304
  },
304
305
  });
305
306
  }
307
+ resolveBedrockInvokeEntry() {
308
+ return path.join(__dirname, 'resources/default-bedrock-invoke');
309
+ }
306
310
  /**
307
311
  * Implements the optional document enrichment step.
308
312
  *
@@ -677,7 +681,7 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
677
681
  functionName: generatedLogPermissions.uniqueFunctionName,
678
682
  architecture: aws_lambda_1.Architecture.X86_64,
679
683
  runtime: framework_1.DefaultRuntimes.PYTHON,
680
- entry: path.join(__dirname, 'resources/default-bedrock-invoke'),
684
+ entry: this.resolveBedrockInvokeEntry(),
681
685
  role,
682
686
  memorySize: 1024,
683
687
  timeout: this.bedrockDocumentProcessingProps.stepTimeouts || aws_cdk_lib_1.Duration.minutes(5),
@@ -846,7 +850,7 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
846
850
  }
847
851
  exports.BedrockDocumentProcessing = BedrockDocumentProcessing;
848
852
  _a = JSII_RTTI_SYMBOL_1;
849
- BedrockDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockDocumentProcessing", version: "1.16.0" };
853
+ BedrockDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockDocumentProcessing", version: "1.17.0" };
850
854
  BedrockDocumentProcessing.DEFAULT_CLASSIFICATION_PROMPT = `
851
855
  Analyze the document below, and classify the type of document it is (eg. INVOICE, IDENTITY_DOCUMENT, RECEIPT, etc). The result should be in JSON and should follow the following structure (only respond in JSON with the following structure and do not use markdown to indicate the json, just output plain old json with nothing else):
852
856
 
@@ -898,4 +902,4 @@ BedrockDocumentProcessing.DEFAULT_AGGREGATION_PROMPT = `
898
902
  The chunk results to aggregate are as follows:
899
903
 
900
904
  `;
901
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2QkFBNkI7QUFDN0IsOEVBQWtFO0FBQ2xFLDZDQUE4QztBQUM5QyxpREFBcUU7QUFDckUsaURBQTZFO0FBQzdFLHVEQUFnRTtBQUNoRSxxRUFBOEc7QUFDOUcsaUZBQTJHO0FBRTNHLHlFQUE2SDtBQUU3SCw0Q0FBMkQ7QUFDM0Qsa0RBQTRFO0FBQzVFLDRDQUE4QztBQUM5QyxvRkFBZ0Y7QUFvSGhGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEseUJBQTBCLFNBQVEsaURBQXNCO0lBK0VuRTs7Ozs7Ozs7Ozs7T0FXRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUE3QjFCLDREQUE0RDtRQUNwRCwrQkFBMEIsR0FBRyxDQUFDLENBQUM7UUFDdkMsd0RBQXdEO1FBQ2hELDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUduQyx5REFBeUQ7UUFDakQsNEJBQXVCLEdBQUcsQ0FBQyxDQUFDO1FBR3BDLHdEQUF3RDtRQUNoRCwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFDbkMsNkRBQTZEO1FBQ3JELCtCQUEwQixHQUFHLENBQUMsQ0FBQztRQWtCckMsOENBQThDO1FBQzlDLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsSUFB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QUUsU0FBUyxDQUFDLENBQUM7UUFFNUUsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7QUFuK0JILDhEQW8rQkM7OztBQW4rQjJCLHVEQUE2QixHQUFHOzs7Ozs7Ozs7R0FTekQsQUFUc0QsQ0FTckQ7QUFFd0IsbURBQXlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCckQsQUFsQmtELENBa0JqRDtBQUV3QixvREFBMEIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJ0RCxBQXJCbUQsQ0FxQmxEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUHl0aG9uRnVuY3Rpb24gfSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhLXB5dGhvbi1hbHBoYSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IFJvbGUsIFNlcnZpY2VQcmluY2lwYWwsIFBvbGljeURvY3VtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBGdW5jdGlvbiwgQXJjaGl0ZWN0dXJlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJQ2hhaW5hYmxlLCBDaG9pY2UsIENvbmRpdGlvbiwgTWFwLCBKc29uUGF0aCwgVGFza0lucHV0LCBQYXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0IHsgRHluYW1vQXR0cmlidXRlVmFsdWUsIER5bmFtb1VwZGF0ZUl0ZW0sIExhbWJkYUludm9rZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZURvY3VtZW50UHJvY2Vzc2luZywgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLCBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB9IGZyb20gJy4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmltcG9ydCB7IENodW5raW5nQ29uZmlnIH0gZnJvbSAnLi9jaHVua2luZy1jb25maWcnO1xuaW1wb3J0IHsgRGVmYXVsdFJ1bnRpbWVzLCBJbnZva2VUeXBlIH0gZnJvbSAnLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEJlZHJvY2tNb2RlbFByb3BzLCBCZWRyb2NrTW9kZWxVdGlscyB9IGZyb20gJy4uL2ZyYW1ld29yay9iZWRyb2NrJztcbmltcG9ydCB7IExhbWJkYUlhbVV0aWxzIH0gZnJvbSAnLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IFBvd2VydG9vbHNDb25maWcgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JzZXJ2YWJpbGl0eS9wb3dlcnRvb2xzLWNvbmZpZyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdC5cbiAqIEV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHdpdGggQmVkcm9jay1zcGVjaWZpYyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgZm9yIGRvY3VtZW50IGNsYXNzaWZpY2F0aW9uIHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBjbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbD86IEJlZHJvY2tNb2RlbFByb3BzO1xuXG4gIC8qKlxuICAgKiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgZm9yIGRvY3VtZW50IGV4dHJhY3Rpb24gc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NpbmdCZWRyb2NrTW9kZWw/OiBCZWRyb2NrTW9kZWxQcm9wcztcbiAgLyoqXG4gICAqIEN1c3RvbSBwcm9tcHQgdGVtcGxhdGUgZm9yIGRvY3VtZW50IGNsYXNzaWZpY2F0aW9uLlxuICAgKiBNdXN0IGluY2x1ZGUgcGxhY2Vob2xkZXIgZm9yIGRvY3VtZW50IGNvbnRlbnQuXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfQ0xBU1NJRklDQVRJT05fUFJPTVBUXG4gICAqL1xuICByZWFkb25seSBjbGFzc2lmaWNhdGlvblByb21wdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBwcm9tcHQgdGVtcGxhdGUgZm9yIGRvY3VtZW50IGV4dHJhY3Rpb24uXG4gICAqIE11c3QgaW5jbHVkZSBwbGFjZWhvbGRlciBmb3IgZG9jdW1lbnQgY29udGVudCBhbmQgY2xhc3NpZmljYXRpb24gcmVzdWx0LlxuICAgKiBAZGVmYXVsdCBERUZBVUxUX0VYVFJBQ1RJT05fUFJPTVBUXG4gICAqL1xuICByZWFkb25seSBwcm9jZXNzaW5nUHJvbXB0Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgTGFtYmRhIGZ1bmN0aW9uIGZvciBkb2N1bWVudCBlbnJpY2htZW50IHN0ZXAuXG4gICAqIElmIHByb3ZpZGVkLCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgZXh0cmFjdGlvbiB3aXRoIHdvcmtmbG93IHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5yaWNobWVudExhbWJkYUZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKlxuICAgKiBPcHRpb25hbCBMYW1iZGEgZnVuY3Rpb24gZm9yIHBvc3QtcHJvY2Vzc2luZyBzdGVwLlxuICAgKiBJZiBwcm92aWRlZCwgd2lsbCBiZSBpbnZva2VkIGFmdGVyIGVucmljaG1lbnQgd2l0aCB3b3JrZmxvdyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvc3RQcm9jZXNzaW5nTGFtYmRhRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGluZGl2aWR1YWwgU3RlcCBGdW5jdGlvbnMgdGFza3MgKGNsYXNzaWZpY2F0aW9uLCBleHRyYWN0aW9uLCBldGMuKS5cbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcyg1KVxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcFRpbWVvdXRzPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcm9tcHQgdGVtcGxhdGUgZm9yIGFnZ3JlZ2F0aW5nIHJlc3VsdHMgZnJvbSBtdWx0aXBsZSBjaHVua3MuXG4gICAqIFVzZWQgd2hlbiBjaHVua2luZyBpcyBlbmFibGVkIHRvIG1lcmdlIHByb2Nlc3NpbmcgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3NcbiAgICogaW50byBhIHNpbmdsZSBjb2hlcmVudCByZXN1bHQuXG4gICAqXG4gICAqIFRoZSBwcm9tcHQgcmVjZWl2ZXMgdGhlIGNvbmNhdGVuYXRlZCBwcm9jZXNzaW5nIHJlc3VsdHMgZnJvbSBhbGwgY2h1bmtzXG4gICAqIGFuZCBzaG91bGQgaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvIHN5bnRoZXNpemUgdGhlbSBpbnRvIGEgdW5pZmllZCBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfQUdHUkVHQVRJT05fUFJPTVBUXG4gICAqL1xuICByZWFkb25seSBhZ2dyZWdhdGlvblByb21wdD86IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlIFBERiBjaHVua2luZyBmb3IgbGFyZ2UgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIGRvY3VtZW50cyBleGNlZWRpbmcgY29uZmlndXJlZCB0aHJlc2hvbGRzIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICAgKiBzcGxpdCBpbnRvIGNodW5rcywgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIG9yIHNlcXVlbnRpYWxseSwgYW5kIHJlc3VsdHMgYWdncmVnYXRlZC5cbiAgICpcbiAgICogVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3I6XG4gICAqIC0gUHJvY2Vzc2luZyBsYXJnZSBQREZzICg+MTAwIHBhZ2VzKVxuICAgKiAtIEhhbmRsaW5nIGRvY3VtZW50cyB0aGF0IGV4Y2VlZCBCZWRyb2NrIHRva2VuIGxpbWl0cyAofjIwMEsgdG9rZW5zKVxuICAgKiAtIEltcHJvdmluZyBwcm9jZXNzaW5nIHJlbGlhYmlsaXR5IGZvciBjb21wbGV4IGRvY3VtZW50c1xuICAgKiAtIFByb2Nlc3NpbmcgZG9jdW1lbnRzIHdpdGggdmFyaWFibGUgY29udGVudCBkZW5zaXR5XG4gICAqXG4gICAqIFRoZSBjaHVua2luZyB3b3JrZmxvdzpcbiAgICogMS4gQW5hbHl6ZXMgUERGIHRvIGRldGVybWluZSBwYWdlIGNvdW50IGFuZCBlc3RpbWF0ZSB0b2tlbiBjb3VudFxuICAgKiAyLiBEZWNpZGVzIGlmIGNodW5raW5nIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmVkIHRocmVzaG9sZHNcbiAgICogMy4gSWYgY2h1bmtpbmcgaXMgbmVlZGVkLCBzcGxpdHMgUERGIGludG8gY2h1bmtzIGFuZCB1cGxvYWRzIHRvIFMzXG4gICAqIDQuIFByb2Nlc3NlcyBlYWNoIGNodW5rIHRocm91Z2ggY2xhc3NpZmljYXRpb24gYW5kIGV4dHJhY3Rpb25cbiAgICogNS4gQWdncmVnYXRlcyByZXN1bHRzIHVzaW5nIG1ham9yaXR5IHZvdGluZyBmb3IgY2xhc3NpZmljYXRpb25cbiAgICogNi4gRGVkdXBsaWNhdGVzIGVudGl0aWVzIGFjcm9zcyBjaHVua3NcbiAgICogNy4gQ2xlYW5zIHVwIHRlbXBvcmFyeSBjaHVuayBmaWxlcyBmcm9tIFMzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVDaHVua2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIFBERiBjaHVua2luZyBiZWhhdmlvci5cbiAgICpcbiAgICogT25seSBhcHBsaWVzIHdoZW4gYGVuYWJsZUNodW5raW5nYCBpcyB0cnVlLiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZjpcbiAgICogLSAqKkNodW5raW5nIHN0cmF0ZWd5Kio6IEhvdyBkb2N1bWVudHMgYXJlIHNwbGl0IChmaXhlZC1wYWdlcywgdG9rZW4tYmFzZWQsIG9yIGh5YnJpZClcbiAgICogLSAqKlRocmVzaG9sZHMqKjogV2hlbiB0byB0cmlnZ2VyIGNodW5raW5nIGJhc2VkIG9uIHBhZ2UgY291bnQgb3IgdG9rZW4gY291bnRcbiAgICogLSAqKkNodW5rIHNpemUgYW5kIG92ZXJsYXAqKjogQ29udHJvbCBjaHVuayBib3VuZGFyaWVzIGFuZCBjb250ZXh0IHByZXNlcnZhdGlvblxuICAgKiAtICoqUHJvY2Vzc2luZyBtb2RlKio6IFBhcmFsbGVsIChmYXN0ZXIpIG9yIHNlcXVlbnRpYWwgKGNvc3Qtb3B0aW1pemVkKVxuICAgKiAtICoqQWdncmVnYXRpb24gc3RyYXRlZ3kqKjogSG93IHRvIGNvbWJpbmUgcmVzdWx0cyBmcm9tIG11bHRpcGxlIGNodW5rc1xuICAgKlxuICAgKiAjIyBEZWZhdWx0IENvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogSWYgbm90IHByb3ZpZGVkLCB1c2VzIHNlbnNpYmxlIGRlZmF1bHRzIG9wdGltaXplZCBmb3IgbW9zdCB1c2UgY2FzZXM6XG4gICAqIC0gU3RyYXRlZ3k6IGAnaHlicmlkJ2AgKHJlY29tbWVuZGVkIC0gYmFsYW5jZXMgdG9rZW4gYW5kIHBhZ2UgbGltaXRzKVxuICAgKiAtIFBhZ2UgdGhyZXNob2xkOiAxMDAgcGFnZXNcbiAgICogLSBUb2tlbiB0aHJlc2hvbGQ6IDE1MCwwMDAgdG9rZW5zXG4gICAqIC0gUHJvY2Vzc2luZyBtb2RlOiBgJ3BhcmFsbGVsJ2BcbiAgICogLSBNYXggY29uY3VycmVuY3k6IDEwXG4gICAqIC0gQWdncmVnYXRpb24gc3RyYXRlZ3k6IGAnbWFqb3JpdHktdm90ZSdgXG4gICAqXG4gICAqICMjIFN0cmF0ZWd5IENvbXBhcmlzb25cbiAgICpcbiAgICogfCBTdHJhdGVneSB8IEJlc3QgRm9yIHwgUHJvcyB8IENvbnMgfFxuICAgKiB8LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gICAqIHwgYGh5YnJpZGAgfCBNb3N0IGRvY3VtZW50cyB8IEJhbGFuY2VzIHRva2VuL3BhZ2UgbGltaXRzIHwgU2xpZ2h0bHkgbW9yZSBjb21wbGV4IHxcbiAgICogfCBgdG9rZW4tYmFzZWRgIHwgVmFyaWFibGUgZGVuc2l0eSB8IFJlc3BlY3RzIG1vZGVsIGxpbWl0cyB8IFNsb3dlciBhbmFseXNpcyB8XG4gICAqIHwgYGZpeGVkLXBhZ2VzYCB8IFVuaWZvcm0gZGVuc2l0eSB8IFNpbXBsZSwgZmFzdCB8IE1heSBleGNlZWQgdG9rZW4gbGltaXRzIHxcbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkICh1c2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVuIGVuYWJsZUNodW5raW5nIGlzIHRydWUpXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIENodW5raW5nQ29uZmlnfSBmb3IgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBjaHVua2luZ0NvbmZpZz86IENodW5raW5nQ29uZmlnO1xufVxuXG4vKipcbiAqIERvY3VtZW50IHByb2Nlc3Npbmcgd29ya2Zsb3cgcG93ZXJlZCBieSBBbWF6b24gQmVkcm9jayBmb3VuZGF0aW9uIG1vZGVscy5cbiAqXG4gKiBFeHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3NpbmcgdG8gcHJvdmlkZSBBSS1wb3dlcmVkIGRvY3VtZW50IGNsYXNzaWZpY2F0aW9uIGFuZCBleHRyYWN0aW9uXG4gKiB1c2luZyBBbWF6b24gQmVkcm9jayBmb3VuZGF0aW9uIG1vZGVscy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZmZlcnM6XG4gKlxuICogIyMgS2V5IEZlYXR1cmVzXG4gKiAtICoqQUktUG93ZXJlZCBDbGFzc2lmaWNhdGlvbioqOiBVc2VzIENsYXVkZSAzLjcgU29ubmV0IChjb25maWd1cmFibGUpIHRvIGNsYXNzaWZ5IGRvY3VtZW50IHR5cGVzXG4gKiAtICoqSW50ZWxsaWdlbnQgRXh0cmFjdGlvbioqOiBFeHRyYWN0cyBzdHJ1Y3R1cmVkIGRhdGEgZnJvbSBkb2N1bWVudHMgdXNpbmcgZm91bmRhdGlvbiBtb2RlbHNcbiAqIC0gKipDcm9zcy1SZWdpb24gSW5mZXJlbmNlKio6IE9wdGlvbmFsIHN1cHBvcnQgZm9yIGltcHJvdmVkIGF2YWlsYWJpbGl0eSB2aWEgaW5mZXJlbmNlIHByb2ZpbGVzXG4gKiAtICoqRmxleGlibGUgUHJvY2Vzc2luZyoqOiBPcHRpb25hbCBlbnJpY2htZW50IGFuZCBwb3N0LXByb2Nlc3NpbmcgTGFtYmRhIGZ1bmN0aW9uc1xuICogLSAqKkNvc3QgT3B0aW1pemVkKio6IENvbmZpZ3VyYWJsZSB0aW1lb3V0cyBhbmQgbW9kZWwgc2VsZWN0aW9uIGZvciBjb3N0IGNvbnRyb2xcbiAqXG4gKiAjIyBQcm9jZXNzaW5nIFdvcmtmbG93XG4gKiBTMyBVcGxvYWQg4oaSIENsYXNzaWZpY2F0aW9uIChCZWRyb2NrKSDihpIgRXh0cmFjdGlvbiAoQmVkcm9jaykg4oaSIFtFbnJpY2htZW50XSDihpIgW1Bvc3QtUHJvY2Vzc2luZ10g4oaSIFJlc3VsdHNcbiAqXG4gKiAjIyBEZWZhdWx0IE1vZGVsc1xuICogLSBDbGFzc2lmaWNhdGlvbjogQ2xhdWRlIDMuNyBTb25uZXQgKGFudGhyb3BpYy5jbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOS12MTowKVxuICogLSBFeHRyYWN0aW9uOiBDbGF1ZGUgMy43IFNvbm5ldCAoYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjApXG4gKlxuICogIyMgUHJvbXB0IFRlbXBsYXRlc1xuICogVGhlIGNvbnN0cnVjdCB1c2VzIGRlZmF1bHQgcHJvbXB0cyB0aGF0IGNhbiBiZSBjdXN0b21pemVkOlxuICogLSAqKkNsYXNzaWZpY2F0aW9uKio6IEFuYWx5emVzIGRvY3VtZW50IGFuZCByZXR1cm5zIEpTT04gd2l0aCBkb2N1bWVudENsYXNzaWZpY2F0aW9uIGZpZWxkXG4gKiAtICoqRXh0cmFjdGlvbioqOiBVc2VzIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCB0byBleHRyYWN0IGVudGl0aWVzIGluIHN0cnVjdHVyZWQgSlNPTiBmb3JtYXRcbiAqXG4gKiAjIyBDcm9zcy1SZWdpb24gSW5mZXJlbmNlXG4gKiBXaGVuIGVuYWJsZWQsIHVzZXMgQmVkcm9jayBpbmZlcmVuY2UgcHJvZmlsZXMgZm9yIGltcHJvdmVkIGF2YWlsYWJpbGl0eTpcbiAqIC0gVVMgcHJlZml4OiBSb3V0ZXMgdG8gVVMtYmFzZWQgcmVnaW9ucyBmb3IgbG93ZXIgbGF0ZW5jeVxuICogLSBFVSBwcmVmaXg6IFJvdXRlcyB0byBFVS1iYXNlZCByZWdpb25zIGZvciBkYXRhIHJlc2lkZW5jeSBjb21wbGlhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFQgPSBgXG4gIEFuYWx5emUgdGhlIGRvY3VtZW50IGJlbG93LCBhbmQgY2xhc3NpZnkgdGhlIHR5cGUgb2YgZG9jdW1lbnQgaXQgaXMgKGVnLiBJTlZPSUNFLCBJREVOVElUWV9ET0NVTUVOVCwgUkVDRUlQVCwgZXRjKS4gVGhlIHJlc3VsdCBzaG91bGQgYmUgaW4gSlNPTiBhbmQgc2hvdWxkIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAob25seSByZXNwb25kIGluIEpTT04gd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBhbmQgZG8gbm90IHVzZSBtYXJrZG93biB0byBpbmRpY2F0ZSB0aGUganNvbiwganVzdCBvdXRwdXQgcGxhaW4gb2xkIGpzb24gd2l0aCBub3RoaW5nIGVsc2UpOlxuXG4gIHtcbiAgICAgIGRvY3VtZW50Q2xhc3NpZmljYXRpb246IDxDTEFTU0lGSUNBVElPTj5cbiAgfVxuXG4gIEF0dGFjaGVkIGRvY3VtZW50IGlzIGFzIGZvbGxvd3M6XG5cbiAgYDtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUFJPQ0VTU0lOR19QUk9NUFQgPSBgXG4gIFRoZSBkb2N1bWVudCBiZWxvdyBoYXMgYmVlbiBjbGFzc2lmaWVkIGFzIFtBQ1RVQUxfQ0xBU1NJRklDQVRJT05dLiBFeHRyYWN0IGltcG9ydGFudCBlbnRpdGllcyBmcm9tIHRoZSBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgSlNPTiBmb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBiZWxvdyAob25seSByZXNwb25kIGluIEpTT04gd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBhbmQgZG8gbm90IHVzZSBtYXJrZG93biB0byBpbmRpY2F0ZSB0aGUganNvbiwganVzdCBvdXRwdXQgcGxhaW4gb2xkIGpzb24gd2l0aCBub3RoaW5nIGVsc2UpOlxuXG4gIHtcbiAgICAgIGRvY3VtZW50Q2xhc3NpZmljYXRpb246IDxDTEFTU0lGSUNBVElPTj4sXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgZW50aXRpZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiA8VFlQRSBPRiBFTlRJVFk+XG4gICAgICAgICAgICAgICAgdmFsdWU6IDxWQUxVRSBPRiBFTlRJVFk+XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uXG4gICAgICAgIF1cbiAgICAgIH1cbiAgfVxuXG4gIEF0dGFjaGVkIGRvY3VtZW50IGlzIGFzIGZvbGxvd3M6XG5cbiAgYDtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQUdHUkVHQVRJT05fUFJPTVBUID0gYFxuICBZb3UgYXJlIGdpdmVuIHRoZSBwcm9jZXNzaW5nIHJlc3VsdHMgZnJvbSBtdWx0aXBsZSBjaHVua3Mgb2YgYSBsYXJnZSBkb2N1bWVudCB0aGF0IHdhcyBzcGxpdCBmb3IgcHJvY2Vzc2luZy5cbiAgWW91ciB0YXNrIGlzIHRvIHN5bnRoZXNpemUgdGhlc2UgY2h1bmsgcmVzdWx0cyBpbnRvIGEgc2luZ2xlLCBjb2hlcmVudCBmaW5hbCByZXN1bHQuXG5cbiAgSW5zdHJ1Y3Rpb25zOlxuICAxLiBSZXZpZXcgYWxsIHRoZSBjaHVuayByZXN1bHRzIHByb3ZpZGVkIGJlbG93XG4gIDIuIE1lcmdlIGFuZCBkZWR1cGxpY2F0ZSBhbnkgb3ZlcmxhcHBpbmcgaW5mb3JtYXRpb24gKGNodW5rcyBtYXkgaGF2ZSBvdmVybGFwcGluZyBwYWdlcylcbiAgMy4gU3ludGhlc2l6ZSB0aGUgaW5mb3JtYXRpb24gaW50byBhIHVuaWZpZWQsIGNvaGVyZW50IHJlc3VsdFxuICA0LiBNYWludGFpbiB0aGUgc2FtZSBvdXRwdXQgZm9ybWF0IGFzIHRoZSBpbmRpdmlkdWFsIGNodW5rIHJlc3VsdHNcbiAgNS4gSWYgdGhlIGNodW5rcyBjb250YWluIHN1bW1hcmllcywgY3JlYXRlIGEgY29tcHJlaGVuc2l2ZSBzdW1tYXJ5IHRoYXQgY292ZXJzIGFsbCBzZWN0aW9uc1xuICA2LiBJZiB0aGUgY2h1bmtzIGNvbnRhaW4gZW50aXRpZXMsIGRlZHVwbGljYXRlIGFuZCBjb25zb2xpZGF0ZSB0aGVtXG4gIDcuIFByZXNlcnZlIGltcG9ydGFudCBkZXRhaWxzIGZyb20gZWFjaCBjaHVuayB3aGlsZSBhdm9pZGluZyByZWR1bmRhbmN5XG5cbiAgUmV0dXJuIHRoZSByZXN1bHQgYXMgSlNPTiAob25seSByZXNwb25kIGluIEpTT04gd2l0aG91dCBtYXJrZG93biBmb3JtYXR0aW5nKTpcblxuICB7XG4gICAgICBcInJlc3VsdFwiOiA8U1lOVEhFU0laRURfUkVTVUxUPlxuICB9XG5cbiAgVGhlIGNodW5rIHJlc3VsdHMgdG8gYWdncmVnYXRlIGFyZSBhcyBmb2xsb3dzOlxuXG4gIGA7XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBzcGVjaWZpYyB0byBCZWRyb2NrIGRvY3VtZW50IHByb2Nlc3NpbmcgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wczogQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzO1xuICAvKiogVGhlIFN0ZXAgRnVuY3Rpb25zIHN0YXRlIG1hY2hpbmUgdGhhdCBvcmNoZXN0cmF0ZXMgdGhlIGRvY3VtZW50IHByb2Nlc3Npbmcgd29ya2Zsb3cgKi9cbiAgcmVhZG9ubHkgc3RhdGVNYWNoaW5lO1xuICAvKiogQ2FjaGVkIGNsYXNzaWZpY2F0aW9uIExhbWJkYSBmdW5jdGlvbiB0byBhdm9pZCBkdXBsaWNhdGUgcmVzb3VyY2UgY3JlYXRpb24gKi9cbiAgcHJpdmF0ZSBfY2xhc3NpZmljYXRpb25GdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKiogQ2FjaGVkIHByb2Nlc3NpbmcgTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXNvdXJjZSBjcmVhdGlvbiAqL1xuICBwcml2YXRlIF9wcm9jZXNzaW5nRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgLyoqIENvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGNsYXNzaWZpY2F0aW9uIHN0ZXAgSURzICovXG4gIHByaXZhdGUgX2NsYXNzaWZpY2F0aW9uU3RlcENvdW50ZXIgPSAwO1xuICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgcHJvY2Vzc2luZyBzdGVwIElEcyAqL1xuICBwcml2YXRlIF9wcm9jZXNzaW5nU3RlcENvdW50ZXIgPSAwO1xuICAvKiogQ2FjaGVkIGFnZ3JlZ2F0aW9uIExhbWJkYSBmdW5jdGlvbiB0byBhdm9pZCBkdXBsaWNhdGUgcmVzb3VyY2UgY3JlYXRpb24gKi9cbiAgcHJpdmF0ZSBfYWdncmVnYXRpb25GdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgYWdncmVnYXRpb24gc3RlcCBJRHMgKi9cbiAgcHJpdmF0ZSBfYWdncmVnYXRpb25TdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDYWNoZWQgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24gdG8gYXZvaWQgZHVwbGljYXRlIHJlc291cmNlIGNyZWF0aW9uICovXG4gIHByaXZhdGUgX2NsZWFudXBGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgZW5yaWNobWVudCBzdGVwIElEcyAqL1xuICBwcml2YXRlIF9lbnJpY2htZW50U3RlcENvdW50ZXIgPSAwO1xuICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgcG9zdC1wcm9jZXNzaW5nIHN0ZXAgSURzICovXG4gIHByaXZhdGUgX3Bvc3RQcm9jZXNzaW5nU3RlcENvdW50ZXIgPSAwO1xuXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEluaXRpYWxpemVzIHRoZSBCZWRyb2NrLXBvd2VyZWQgZG9jdW1lbnQgcHJvY2Vzc2luZyBwaXBlbGluZSB3aXRoIEFJIGNsYXNzaWZpY2F0aW9uXG4gICAqIGFuZCBleHRyYWN0aW9uIGNhcGFiaWxpdGllcy4gQ3JlYXRlcyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggYXBwcm9wcmlhdGUgSUFNIHJvbGVzXG4gICAqIGZvciBCZWRyb2NrIG1vZGVsIGludm9jYXRpb24gYW5kIFMzIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgLSBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS5cbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgQmVkcm9jayBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY2h1bmtpbmcgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjaHVua2luZyBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLmVuYWJsZUNodW5raW5nICYmIHByb3BzLmNodW5raW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ2h1bmtpbmdDb25maWcocHJvcHMuY2h1bmtpbmdDb25maWcpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5uZXR3b3JrKSB7XG4gICAgICBwcm9wcy5uZXR3b3JrLmNyZWF0ZVNlcnZpY2VFbmRwb2ludCgndnBjZS1iZWRyb2NrJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkJFRFJPQ0spO1xuICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2UtYmVkcm9jay1ydW50aW1lJywgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkJFRFJPQ0tfUlVOVElNRSk7XG4gICAgfVxuXG4gICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlTWFjaGluZSA9IHRoaXMuaGFuZGxlU3RhdGVNYWNoaW5lQ3JlYXRpb24oJ2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZy13b3JrZmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgY2h1bmtpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBFbnN1cmVzIHRoYXQ6XG4gICAqIC0gQ2h1bmsgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMFxuICAgKiAtIE92ZXJsYXAgaXMgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gY2h1bmsgc2l6ZVxuICAgKiAtIFRocmVzaG9sZHMgYXJlIGdyZWF0ZXIgdGhhbiAwXG4gICAqIC0gTWF4IGNvbmN1cnJlbmN5IGlzIGdyZWF0ZXIgdGhhbiAwXG4gICAqIC0gTWluIHN1Y2Nlc3MgdGhyZXNob2xkIGlzIGJldHdlZW4gMCBhbmQgMVxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNodW5raW5nIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiBhbnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNodW5raW5nQ29uZmlnKGNvbmZpZzogQ2h1bmtpbmdDb25maWcpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBjaHVuayBzaXplIChmb3IgZml4ZWQtcGFnZXMgc3RyYXRlZ3kpXG4gICAgaWYgKGNvbmZpZy5jaHVua1NpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbmZpZy5jaHVua1NpemUgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IGNodW5rU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgb3ZlcmxhcCBwYWdlcyAoZm9yIGZpeGVkLXBhZ2VzIHN0cmF0ZWd5KVxuICAgIGlmIChjb25maWcub3ZlcmxhcFBhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb25maWcub3ZlcmxhcFBhZ2VzIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG92ZXJsYXBQYWdlcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgZWZmZWN0aXZlQ2h1bmtTaXplID0gY29uZmlnLmNodW5rU2l6ZSB8fCA1MDsgLy8gZGVmYXVsdCBjaHVuayBzaXplXG4gICAgICBpZiAoY29uZmlnLm92ZXJsYXBQYWdlcyA+PSBlZmZlY3RpdmVDaHVua1NpemUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBvdmVybGFwUGFnZXMgbXVzdCBiZSBsZXNzIHRoYW4gY2h1bmtTaXplJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcGFnZSB0aHJlc2hvbGRcbiAgICBpZiAoY29uZmlnLnBhZ2VUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiBjb25maWcucGFnZVRocmVzaG9sZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IHBhZ2VUaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRva2VuIHRocmVzaG9sZFxuICAgIGlmIChjb25maWcudG9rZW5UaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiBjb25maWcudG9rZW5UaHJlc2hvbGQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiB0b2tlblRocmVzaG9sZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWF4IHRva2VucyBwZXIgY2h1bmsgKGZvciB0b2tlbi1iYXNlZCBzdHJhdGVneSlcbiAgICBpZiAoY29uZmlnLm1heFRva2Vuc1BlckNodW5rICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLm1heFRva2Vuc1BlckNodW5rIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogbWF4VG9rZW5zUGVyQ2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJsYXAgdG9rZW5zIChmb3IgdG9rZW4tYmFzZWQgYW5kIGh5YnJpZCBzdHJhdGVnaWVzKVxuICAgIGlmIChjb25maWcub3ZlcmxhcFRva2VucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uZmlnLm92ZXJsYXBUb2tlbnMgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogb3ZlcmxhcFRva2VucyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgZWZmZWN0aXZlTWF4VG9rZW5zID0gY29uZmlnLm1heFRva2Vuc1BlckNodW5rIHx8IDEwMDAwMDsgLy8gZGVmYXVsdCBtYXggdG9rZW5zXG4gICAgICBpZiAoY29uZmlnLm92ZXJsYXBUb2tlbnMgPj0gZWZmZWN0aXZlTWF4VG9rZW5zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogb3ZlcmxhcFRva2VucyBtdXN0IGJlIGxlc3MgdGhhbiBtYXhUb2tlbnNQZXJDaHVuaycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1heCBwYWdlcyBwZXIgY2h1bmsgKGZvciBoeWJyaWQgc3RyYXRlZ3kpXG4gICAgaWYgKGNvbmZpZy5tYXhQYWdlc1BlckNodW5rICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLm1heFBhZ2VzUGVyQ2h1bmsgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBtYXhQYWdlc1BlckNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0YXJnZXQgdG9rZW5zIHBlciBjaHVuayAoZm9yIGh5YnJpZCBzdHJhdGVneSlcbiAgICBpZiAoY29uZmlnLnRhcmdldFRva2Vuc1BlckNodW5rICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLnRhcmdldFRva2Vuc1BlckNodW5rIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogdGFyZ2V0VG9rZW5zUGVyQ2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1heCBjb25jdXJyZW5jeVxuICAgIGlmIChjb25maWcubWF4Q29uY3VycmVuY3kgIT09IHVuZGVmaW5lZCAmJiBjb25maWcubWF4Q29uY3VycmVuY3kgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBtYXhDb25jdXJyZW5jeSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWluIHN1Y2Nlc3MgdGhyZXNob2xkXG4gICAgaWYgKGNvbmZpZy5taW5TdWNjZXNzVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb25maWcubWluU3VjY2Vzc1RocmVzaG9sZCA8IDAgfHwgY29uZmlnLm1pblN1Y2Nlc3NUaHJlc2hvbGQgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogbWluU3VjY2Vzc1RocmVzaG9sZCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBkb2N1bWVudCBjbGFzc2lmaWNhdGlvbiBzdGVwIHVzaW5nIEFtYXpvbiBCZWRyb2NrLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgY29uZmlndXJlZCBCZWRyb2NrIG1vZGVsIHRvIGNsYXNzaWZ5XG4gICAqIHRoZSBkb2N1bWVudCB0eXBlLiBUaGUgZnVuY3Rpb24gcmVhZHMgdGhlIGRvY3VtZW50IGZyb20gUzMgYW5kIHNlbmRzIGl0IHRvXG4gICAqIEJlZHJvY2sgd2l0aCB0aGUgY2xhc3NpZmljYXRpb24gcHJvbXB0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0byBhdm9pZCBjcmVhdGluZyBkdXBsaWNhdGUgcmVzb3VyY2VzLFxuICAgKiBidXQgY3JlYXRlcyBhIG5ldyBMYW1iZGFJbnZva2UgdGFzayBlYWNoIHRpbWUgdG8gYWxsb3cgcHJvcGVyIHN0YXRlIGNoYWluaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjbGFzc2lmaWNhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiBvbmx5IG9uY2VcbiAgICBpZiAoIXRoaXMuX2NsYXNzaWZpY2F0aW9uRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IHByb21wdCA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNsYXNzaWZpY2F0aW9uUHJvbXB0IHx8IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcuREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFQ7XG4gICAgICBjb25zdCBhZGp1c3RlZE1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLmdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soJ0NsYXNzaWZpY2F0aW9uTGFtYmRhUm9sZScsIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2xhc3NpZmljYXRpb24nLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KHJvbGUpO1xuXG4gICAgICB0aGlzLl9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uID0gbmV3IFB5dGhvbkZ1bmN0aW9uKHRoaXMsICdCZWRyb2NrQ2xhc3NpZmljYXRpb25GdW5jdGlvbicsIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgICAgcnVudGltZTogRGVmYXVsdFJ1bnRpbWVzLlBZVEhPTixcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpLFxuICAgICAgICByb2xlLFxuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIE1PREVMX0lEOiBhZGp1c3RlZE1vZGVsSWQsXG4gICAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgICAgSU5WT0tFX1RZUEU6IEludm9rZVR5cGUuQ0xBU1NJRklDQVRJT04sXG4gICAgICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fY2xhc3NpZmljYXRpb25GdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGNyZWF0ZSBhIG5ldyBMYW1iZGFJbnZva2UgdGFzayB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmdcbiAgICBjb25zdCBzdGVwSWQgPSBgQ2xhc3NpZmljYXRpb25TdGVwLSR7dGhpcy5fY2xhc3NpZmljYXRpb25TdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX2NsYXNzaWZpY2F0aW9uU3RlcENvdW50ZXIrKztcblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsIHN0ZXBJZCwge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuX2NsYXNzaWZpY2F0aW9uRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcsXG4gICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAnZG9jdW1lbnRDbGFzc2lmaWNhdGlvbi4kJzogJyQuUGF5bG9hZC5kb2N1bWVudENsYXNzaWZpY2F0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgZG9jdW1lbnQgZXh0cmFjdGlvbiBzdGVwIHVzaW5nIEFtYXpvbiBCZWRyb2NrLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgY29uZmlndXJlZCBCZWRyb2NrIG1vZGVsIHRvIGV4dHJhY3RcbiAgICogc3RydWN0dXJlZCBkYXRhIGZyb20gdGhlIGRvY3VtZW50LiBVc2VzIHRoZSBjbGFzc2lmaWNhdGlvbiByZXN1bHQgZnJvbSB0aGVcbiAgICogcHJldmlvdXMgc3RlcCB0byBwcm92aWRlIGNvbnRleHQgZm9yIG1vcmUgYWNjdXJhdGUgZXh0cmFjdGlvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIHJlc291cmNlcyxcbiAgICogYnV0IGNyZWF0ZXMgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgZWFjaCB0aW1lIHRvIGFsbG93IHByb3BlciBzdGF0ZSBjaGFpbmluZy5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICAvLyBDcmVhdGUgTGFtYmRhIGZ1bmN0aW9uIG9ubHkgb25jZVxuICAgIGlmICghdGhpcy5fcHJvY2Vzc2luZ0Z1bmN0aW9uKSB7XG4gICAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nUHJvbXB0IHx8IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcuREVGQVVMVF9QUk9DRVNTSU5HX1BST01QVDtcbiAgICAgIGNvbnN0IGFkanVzdGVkTW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ0JlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCByb2xlID0gdGhpcy5nZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKCdQcm9jZXNzaW5nTGFtYmRhUm9sZScsIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnByb2Nlc3NpbmdCZWRyb2NrTW9kZWwpO1xuICAgICAgY29uc3QgeyByZWdpb24sIGFjY291bnQgfSA9IFN0YWNrLm9mKHRoaXMpO1xuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICAgIGFjY291bnQsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2JlZHJvY2staWRwLXByb2Nlc3NpbmcnLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NpbmdGdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQmVkcm9ja0V4dHJhY3Rpb25GdW5jdGlvbicsIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpLFxuICAgICAgICByb2xlLFxuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIE1PREVMX0lEOiBhZGp1c3RlZE1vZGVsSWQsXG4gICAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgICAgSU5WT0tFX1RZUEU6IEludm9rZVR5cGUuUFJPQ0VTU0lORyxcbiAgICAgICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICAgICAgICB0aGlzLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgIHRoaXMubWV0cmljU2VydmljZU5hbWUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHZwYzogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29ya1xuICAgICAgICAgID8gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yay52cGNcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgdnBjU3VibmV0czogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29ya1xuICAgICAgICAgID8gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yay5hcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbigpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMucG9saWN5U3RhdGVtZW50cykge1xuICAgICAgICB0aGlzLl9wcm9jZXNzaW5nRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmspIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZ0Z1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGNyZWF0ZSBhIG5ldyBMYW1iZGFJbnZva2UgdGFzayB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmdcbiAgICBjb25zdCBzdGVwSWQgPSBgUHJvY2Vzc2luZ1N0ZXAtJHt0aGlzLl9wcm9jZXNzaW5nU3RlcENvdW50ZXJ9YDtcbiAgICB0aGlzLl9wcm9jZXNzaW5nU3RlcENvdW50ZXIrKztcblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsIHN0ZXBJZCwge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuX3Byb2Nlc3NpbmdGdW5jdGlvbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2Nlc3NpbmdSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ2RvY3VtZW50Q2xhc3NpZmljYXRpb24uJCc6ICckLlBheWxvYWQuZG9jdW1lbnRDbGFzc2lmaWNhdGlvbicsXG4gICAgICAgICdyZXN1bHQuJCc6ICckLlBheWxvYWQucmVzdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVMYW1iZGFSb2xlRm9yQmVkcm9jayhpZDogc3RyaW5nLCBtb2RlbD86IEJlZHJvY2tNb2RlbFByb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBSb2xlKHRoaXMsIGlkLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgQmVkcm9ja0ludm9rZVBvbGljeTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAvLyBTMyByZWFkLW9ubHkgYWNjZXNzIGZvciBkb2N1bWVudCByZXRyaWV2YWwgLSBsZWFzdCBwcml2aWxlZ2VcbiAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoKSxcbiAgICAgICAgICAgIEJlZHJvY2tNb2RlbFV0aWxzLmdlbmVyYXRlTW9kZWxJQU1QZXJtaXNzaW9ucyh0aGlzLCBtb2RlbCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcC5cbiAgICpcbiAgICogSWYgYW4gZW5yaWNobWVudCBMYW1iZGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gdGhlIHByb3BzLCBjcmVhdGVzIGEgTGFtYmRhSW52b2tlXG4gICAqIHRhc2sgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgb24gdGhlIGV4dHJhY3RlZCBkYXRhLiBUaGlzIHN0ZXAgaXMgdXNlZnVsXG4gICAqIGZvciBkYXRhIHZhbGlkYXRpb24sIHRyYW5zZm9ybWF0aW9uLCBvciBpbnRlZ3JhdGlvbiB3aXRoIGV4dGVybmFsIHN5c3RlbXMuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciBlbnJpY2htZW50LCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcElkID0gYEVucmljaG1lbnRTdGVwLSR7dGhpcy5fZW5yaWNobWVudFN0ZXBDb3VudGVyfWA7XG4gICAgdGhpcy5fZW5yaWNobWVudFN0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgICBvdXRwdXRQYXRoOiAnJCcsXG4gICAgICBwYXlsb2FkUmVzcG9uc2VPbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIHBvc3QtcHJvY2Vzc2luZyBzdGVwLlxuICAgKlxuICAgKiBJZiBhIHBvc3QtcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gdGhlIHByb3BzLCBjcmVhdGVzIGEgTGFtYmRhSW52b2tlXG4gICAqIHRhc2sgdG8gcGVyZm9ybSBmaW5hbCBwcm9jZXNzaW5nIG9uIHRoZSB3b3JrZmxvdyByZXN1bHRzLiBUaGlzIHN0ZXAgaXMgdXNlZnVsIGZvclxuICAgKiBkYXRhIGZvcm1hdHRpbmcsIG5vdGlmaWNhdGlvbnMsIG9yIGludGVncmF0aW9uIHdpdGggZG93bnN0cmVhbSBzeXN0ZW1zLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgcG9zdC1wcm9jZXNzaW5nLCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwSWQgPSBgUG9zdFByb2Nlc3NpbmdTdGVwLSR7dGhpcy5fcG9zdFByb2Nlc3NpbmdTdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX3Bvc3RQcm9jZXNzaW5nU3RlcENvdW50ZXIrKztcblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsIHN0ZXBJZCwge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnBvc3RQcm9jZXNzaW5nTGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wb3N0UHJvY2Vzc2VkUmVzdWx0JyxcbiAgICAgIG91dHB1dFBhdGg6ICckJyxcbiAgICAgIHBheWxvYWRSZXNwb25zZU9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBwcmVwcm9jZXNzaW5nIHN0ZXAgZm9yIFBERiBjaHVua2luZy5cbiAgICpcbiAgICogV2hlbiBjaHVua2luZyBpcyBlbmFibGVkLCBjcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgYW5hbHl6ZXMgUERGcyBhbmRcbiAgICogc3BsaXRzIGxhcmdlIGRvY3VtZW50cyBpbnRvIG1hbmFnZWFibGUgY2h1bmtzLiBUaGUgZnVuY3Rpb246XG4gICAqIDEuIEFuYWx5emVzIHRoZSBQREYgdG8gZGV0ZXJtaW5lIHBhZ2UgY291bnQgYW5kIHRva2VuIGVzdGltYXRlc1xuICAgKiAyLiBEZWNpZGVzIGlmIGNodW5raW5nIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmVkIHRocmVzaG9sZHNcbiAgICogMy4gSWYgY2h1bmtpbmcgaXMgbmVlZGVkLCBzcGxpdHMgdGhlIFBERiBhbmQgdXBsb2FkcyBjaHVua3MgdG8gUzNcbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgZm9yIFBERiBhbmFseXNpcyBhbmQgY2h1bmtpbmcsIG9yIHVuZGVmaW5lZCBpZiBjaHVua2luZyBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBPbmx5IGVuYWJsZSBjaHVua2luZyBpZiBleHBsaWNpdGx5IGNvbmZpZ3VyZWRcbiAgICBpZiAoIXRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZUNodW5raW5nKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBjaHVua2luZ0NvbmZpZyA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNodW5raW5nQ29uZmlnIHx8IHt9O1xuXG4gICAgLy8gQ3JlYXRlIElBTSByb2xlIGZvciBjaHVua2luZyBMYW1iZGEgd2l0aCBsZWFzdCBwcml2aWxlZ2UgcGVybWlzc2lvbnNcbiAgICAvLyBDaHVua2luZyBMYW1iZGEgbmVlZHM6IEdldE9iamVjdCAocmVhZCByYXcgUERGcyksIFB1dE9iamVjdCAod3JpdGUgY2h1bmtzKVxuICAgIGNvbnN0IHJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnQ2h1bmtpbmdMYW1iZGFSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIENodW5raW5nUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2h1bmtpbmcnLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAvLyBDcmVhdGUgUERGIEFuYWx5c2lzICYgQ2h1bmtpbmcgTGFtYmRhXG4gICAgY29uc3QgY2h1bmtpbmdMYW1iZGEgPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ1BERkNodW5raW5nRnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL3BkZi1jaHVua2luZycpLFxuICAgICAgaW5kZXg6ICdoYW5kbGVyLnB5JyxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICByb2xlLFxuICAgICAgbWVtb3J5U2l6ZTogMjA0OCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQ0hVTktJTkdfU1RSQVRFR1k6IGNodW5raW5nQ29uZmlnLnN0cmF0ZWd5IHx8ICdoeWJyaWQnLFxuICAgICAgICBQQUdFX1RIUkVTSE9MRDogU3RyaW5nKGNodW5raW5nQ29uZmlnLnBhZ2VUaHJlc2hvbGQgfHwgMTAwKSxcbiAgICAgICAgVE9LRU5fVEhSRVNIT0xEOiBTdHJpbmcoY2h1bmtpbmdDb25maWcudG9rZW5UaHJlc2hvbGQgfHwgMTUwMDAwKSxcbiAgICAgICAgQ0hVTktfU0laRTogU3RyaW5nKGNodW5raW5nQ29uZmlnLmNodW5rU2l6ZSB8fCA1MCksXG4gICAgICAgIE9WRVJMQVBfUEFHRVM6IFN0cmluZyhjaHVua2luZ0NvbmZpZy5vdmVybGFwUGFnZXMgfHwgNSksXG4gICAgICAgIE1BWF9UT0tFTlNfUEVSX0NIVU5LOiBTdHJpbmcoY2h1bmtpbmdDb25maWcubWF4VG9rZW5zUGVyQ2h1bmsgfHwgMTAwMDAwKSxcbiAgICAgICAgT1ZFUkxBUF9UT0tFTlM6IFN0cmluZyhjaHVua2luZ0NvbmZpZy5vdmVybGFwVG9rZW5zIHx8IDUwMDApLFxuICAgICAgICBUQVJHRVRfVE9LRU5TX1BFUl9DSFVOSzogU3RyaW5nKGNodW5raW5nQ29uZmlnLnRhcmdldFRva2Vuc1BlckNodW5rIHx8IDgwMDAwKSxcbiAgICAgICAgTUFYX1BBR0VTX1BFUl9DSFVOSzogU3RyaW5nKGNodW5raW5nQ29uZmlnLm1heFBhZ2VzUGVyQ2h1bmsgfHwgOTkpLFxuICAgICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIHRoaXMubWV0cmljU2VydmljZU5hbWUsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICBjaHVua2luZ0xhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBjaHVua2luZ0xhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdQREZBbmFseXNpc0FuZENodW5raW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IGNodW5raW5nTGFtYmRhLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2h1bmtpbmdSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3JlcXVpcmVzQ2h1bmtpbmcuJCc6ICckLlBheWxvYWQucmVxdWlyZXNDaHVua2luZycsXG4gICAgICAgICd0b2tlbkFuYWx5c2lzLiQnOiAnJC5QYXlsb2FkLnRva2VuQW5hbHlzaXMnLFxuICAgICAgICAnc3RyYXRlZ3kuJCc6ICckLlBheWxvYWQuc3RyYXRlZ3knLFxuICAgICAgICAnY2h1bmtzLiQnOiAnJC5QYXlsb2FkLmNodW5rcycsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFkZGl0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGZvciBjaHVua2luZyB0byBiZSBzdG9yZWQgaW4gRHluYW1vREIuXG4gICAqXG4gICAqIFdoZW4gY2h1bmtpbmcgaXMgZW5hYmxlZCwgYWRkcyBmaWVsZHMgZm9yOlxuICAgKiAtIENodW5raW5nRW5hYmxlZDogc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2xlYW4gZmxhZ1xuICAgKiAtIENodW5raW5nU3RyYXRlZ3k6IHN0cmF0ZWd5IHVzZWQgKGZpeGVkLXBhZ2VzLCB0b2tlbi1iYXNlZCwgaHlicmlkKVxuICAgKiAtIFRva2VuQW5hbHlzaXM6IEpTT04gc3RyaW5nIHdpdGggdG9rZW4gYW5hbHlzaXMgcmVzdWx0c1xuICAgKiAtIENodW5rTWV0YWRhdGE6IEpTT04gc3RyaW5nIGFycmF5IHdpdGggY2h1bmsgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQHJldHVybnMgUmVjb3JkIG9mIER5bmFtb0RCIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGNodW5raW5nIG1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVDaHVua2luZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBDaHVua2luZ0VuYWJsZWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoXG4gICAgICAgIEpzb25QYXRoLnN0cmluZ0F0KCdTdGF0ZXMuRm9ybWF0KFxcJ3t9XFwnLCAkLmNodW5raW5nUmVzdWx0LnJlcXVpcmVzQ2h1bmtpbmcpJyksXG4gICAgICApLFxuICAgICAgQ2h1bmtpbmdTdHJhdGVneTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhcbiAgICAgICAgSnNvblBhdGguc3RyaW5nQXQoJyQuY2h1bmtpbmdSZXN1bHQuc3RyYXRlZ3knKSxcbiAgICAgICksXG4gICAgICBUb2tlbkFuYWx5c2lzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2h1bmtpbmdSZXN1bHQudG9rZW5BbmFseXNpcycpKSxcbiAgICAgICksXG4gICAgICBDaHVua01ldGFkYXRhOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzJykpLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByb2Nlc3Npbmcgd29ya2Zsb3cgd2l0aCBjb25kaXRpb25hbCBicmFuY2hpbmcgZm9yIGNodW5rZWQgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBXaGVuIGNodW5raW5nIGlzIGVuYWJsZWQsIGNyZWF0ZXMgYSBDaG9pY2UgU3RhdGUgdGhhdDpcbiAgICogLSBSb3V0ZXMgdG8gY2h1bmtlZCBwcm9jZXNzaW5nIGZsb3cgaWYgZG9jdW1lbnQgd2FzIGNodW5rZWRcbiAgICogLSBSb3V0ZXMgdG8gc3RhbmRhcmQgcHJvY2Vzc2luZyBmbG93IGlmIGRvY3VtZW50IHdhcyBub3QgY2h1bmtlZFxuICAgKlxuICAgKiBXaGVuIGNodW5raW5nIGlzIGRpc2FibGVkLCByZXR1cm5zIHRoZSBzdGFuZGFyZCBwcm9jZXNzaW5nIHdvcmtmbG93LlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyBjaGFpbiBmb3IgcHJvY2Vzc2luZyB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKTogSUNoYWluYWJsZSB7XG4gICAgLy8gSWYgY2h1bmtpbmcgaXMgbm90IGVuYWJsZWQsIHVzZSBzdGFuZGFyZCB3b3JrZmxvd1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlQ2h1bmtpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENob2ljZSBTdGF0ZSB0byBjaGVjayBpZiBjaHVua2luZyB3YXMgYXBwbGllZFxuICAgIGNvbnN0IGNob2ljZVN0YXRlID0gbmV3IENob2ljZSh0aGlzLCAnQ2hlY2tJZkNodW5rZWQnKTtcblxuICAgIGNob2ljZVN0YXRlXG4gICAgICAud2hlbihcbiAgICAgICAgQ29uZGl0aW9uLmJvb2xlYW5FcXVhbHMoJyQuY2h1bmtpbmdSZXN1bHQucmVxdWlyZXNDaHVua2luZycsIHRydWUpLFxuICAgICAgICB0aGlzLmNyZWF0ZUNodW5rZWRQcm9jZXNzaW5nRmxvdygpLFxuICAgICAgKVxuICAgICAgLm90aGVyd2lzZShcbiAgICAgICAgLy8gUGFzcyAnU3RhbmRhcmQnIHByZWZpeCB0byBhdm9pZCBjb25zdHJ1Y3QgSUQgY29sbGlzaW9ucyB3aXRoIGNodW5rZWQgZmxvd1xuICAgICAgICB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCdTdGFuZGFyZCcpLFxuICAgICAgKTtcblxuICAgIHJldHVybiBjaG9pY2VTdGF0ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGNodW5rZWQgcHJvY2Vzc2luZyBmbG93IGZvciBsYXJnZSBkb2N1bWVudHMuXG4gICAqXG4gICAqIFRoaXMgZmxvdzpcbiAgICogMS4gVXNlcyBhIE1hcCBTdGF0ZSB0byBwcm9jZXNzIGVhY2ggY2h1bmsgaW4gcGFyYWxsZWwgKG9yIHNlcXVlbnRpYWxseSlcbiAgICogMi4gRWFjaCBjaHVuayBnb2VzIHRocm91Z2ggY2xhc3NpZmljYXRpb24gYW5kIHByb2Nlc3NpbmdcbiAgICogMy4gUmVzdWx0cyBhcmUgYWdncmVnYXRlZCB1c2luZyB0aGUgYWdncmVnYXRpb24gTGFtYmRhXG4gICAqIDQuIER5bmFtb0RCIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWdncmVnYXRlZCByZXN1bHRcbiAgICogNS4gVGVtcG9yYXJ5IGNodW5rcyBhcmUgY2xlYW5lZCB1cCBmcm9tIFMzXG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIGNoYWluIGZvciBjaHVua2VkIGRvY3VtZW50IHByb2Nlc3NpbmdcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2h1bmtlZFByb2Nlc3NpbmdGbG93KCk6IElDaGFpbmFibGUge1xuICAgIGNvbnN0IGNodW5raW5nQ29uZmlnID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuY2h1bmtpbmdDb25maWcgfHwge307XG4gICAgY29uc3QgbWF4Q29uY3VycmVuY3kgPSBjaHVua2luZ0NvbmZpZy5wcm9jZXNzaW5nTW9kZSA9PT0gJ3NlcXVlbnRpYWwnXG4gICAgICA/IDFcbiAgICAgIDogKGNodW5raW5nQ29uZmlnLm1heENvbmN1cnJlbmN5IHx8IDEwKTtcblxuICAgIC8vIENyZWF0ZSBNYXAgU3RhdGUgZm9yIHByb2Nlc3NpbmcgY2h1bmtzXG4gICAgY29uc3QgbWFwU3RhdGUgPSBuZXcgTWFwKHRoaXMsICdQcm9jZXNzQ2h1bmtzJywge1xuICAgICAgaXRlbXNQYXRoOiAnJC5jaHVua2luZ1Jlc3VsdC5jaHVua3MnLFxuICAgICAgbWF4Q29uY3VycmVuY3ksXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICdkb2N1bWVudElkLiQnOiAnJC5kb2N1bWVudElkJyxcbiAgICAgICAgJ2NodW5rLiQnOiAnJCQuTWFwLkl0ZW0uVmFsdWUnLFxuICAgICAgICAnY2h1bmtJbmRleC4kJzogJyQkLk1hcC5JdGVtLkluZGV4JyxcbiAgICAgICAgJ3RvdGFsQ2h1bmtzLiQnOiAnU3RhdGVzLkFycmF5TGVuZ3RoKCQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzKScsXG4gICAgICAgIC8vIE92ZXJyaWRlIGNvbnRlbnQgdG8gcG9pbnQgdG8gdGhlIGNodW5rIFBERiwgbm90IHRoZSBvcmlnaW5hbCBkb2N1bWVudFxuICAgICAgICAnY29udGVudCc6IHtcbiAgICAgICAgICAnbG9jYXRpb24nOiAnczMnLFxuICAgICAgICAgICdidWNrZXQuJCc6ICckJC5NYXAuSXRlbS5WYWx1ZS5idWNrZXQnLFxuICAgICAgICAgICdrZXkuJCc6ICckJC5NYXAuSXRlbS5WYWx1ZS5rZXknLFxuICAgICAgICAgICdmaWxlbmFtZS4kJzogJyQuY29udGVudC5maWxlbmFtZScsXG4gICAgICAgIH0sXG4gICAgICAgICdjb250ZW50VHlwZS4kJzogJyQuY29udGVudFR5cGUnLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNodW5rUmVzdWx0cycsXG4gICAgfSk7XG5cbiAgICAvLyBEZWZpbmUgcGVyLWNodW5rIHByb2Nlc3Npbmc6IGNsYXNzaWZpY2F0aW9uIOKGkiBwcm9jZXNzaW5nXG4gICAgY29uc3QgY2h1bmtDbGFzc2lmaWNhdGlvbiA9IHRoaXMuY2xhc3NpZmljYXRpb25TdGVwKCk7XG4gICAgY29uc3QgY2h1bmtQcm9jZXNzaW5nID0gdGhpcy5wcm9jZXNzaW5nU3RlcCgpO1xuXG4gICAgbWFwU3RhdGUuaXRlbVByb2Nlc3NvcihcbiAgICAgIGNodW5rQ2xhc3NpZmljYXRpb24ubmV4dChjaHVua1Byb2Nlc3NpbmcpLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYWdncmVnYXRpb24gc3RlcCAoTGFtYmRhIGludm9rZSBvbmx5LCBub3JtYWxpemF0aW9uIGFkZGVkIHNlcGFyYXRlbHkpXG4gICAgY29uc3QgYWdncmVnYXRpb25MYW1iZGFTdGVwID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGlvblN0ZXAoKTtcblxuICAgIC8vIEFkZCBhIFBhc3Mgc3RhdGUgdG8gbm9ybWFsaXplIHRoZSBhZ2dyZWdhdGVkIHJlc3VsdCBmb3IgZG93bnN0cmVhbSBjb21wYXRpYmlsaXR5XG4gICAgLy8gVGhpcyBjb3BpZXMgYWdncmVnYXRlZFJlc3VsdCB0byBwcm9jZXNzaW5nUmVzdWx0IHNvIGVucmljaG1lbnQvcG9zdC1wcm9jZXNzaW5nXG4gICAgLy8gc2VlIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGNodW5raW5nIHdhcyB1c2VkXG4gICAgY29uc3Qgbm9ybWFsaXplU3RhdGUgPSBuZXcgUGFzcyh0aGlzLCAnTm9ybWFsaXplQWdncmVnYXRlZFJlc3VsdCcsIHtcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgJ2RvY3VtZW50SWQuJCc6ICckLmRvY3VtZW50SWQnLFxuICAgICAgICAnY29udGVudFR5cGUuJCc6ICckLmNvbnRlbnRUeXBlJyxcbiAgICAgICAgJ2NvbnRlbnQuJCc6ICckLmNvbnRlbnQnLFxuICAgICAgICAnY2h1bmtpbmdSZXN1bHQuJCc6ICckLmNodW5raW5nUmVzdWx0JyxcbiAgICAgICAgJ2NodW5rUmVzdWx0cy4kJzogJyQuY2h1bmtSZXN1bHRzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0ZWRSZXN1bHQuJCc6ICckLmFnZ3JlZ2F0ZWRSZXN1bHQnLFxuICAgICAgICAvLyBDb3B5IGFnZ3JlZ2F0ZWQgcmVzdWx0IHRvIHByb2Nlc3NpbmdSZXN1bHQgZm9yIGRvd25zdHJlYW0gY29tcGF0aWJpbGl0eVxuICAgICAgICAncHJvY2Vzc2luZ1Jlc3VsdCc6IHtcbiAgICAgICAgICAncmVzdWx0LiQnOiAnJC5hZ2dyZWdhdGVkUmVzdWx0LnJlc3VsdCcsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEFsc28gc2V0IGNsYXNzaWZpY2F0aW9uUmVzdWx0IGZyb20gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgY2h1bmsgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICdjbGFzc2lmaWNhdGlvblJlc3VsdC4kJzogJyQuY2h1bmtSZXN1bHRzWzBdLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgRHluYW1vREIgdXBkYXRlIHN0ZXAgZm9yIGFnZ3JlZ2F0ZWQgcmVzdWx0XG4gICAgY29uc3QgdXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXAgPSB0aGlzLmNyZWF0ZVVwZGF0ZUFnZ3JlZ2F0ZWRSZXN1bHRTdGVwKCk7XG5cbiAgICAvLyBDcmVhdGUgY2xlYW51cCBzdGVwXG4gICAgY29uc3QgY2xlYW51cFN0ZXAgPSB0aGlzLmNyZWF0ZUNsZWFudXBTdGVwKCk7XG5cbiAgICAvLyBDcmVhdGUgbW92ZSB0byBwcm9jZXNzZWQgY2hhaW4gd2l0aCAnQ2h1bmtlZCcgcHJlZml4IHRvIGF2b2lkIElEIGNvbGxpc2lvbnNcbiAgICBjb25zdCBtb3ZlVG9Qcm9jZXNzZWQgPSB0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZVN1Y2Nlc3NDaGFpbih0aGlzLCAnQ2h1bmtlZCcpO1xuXG4gICAgLy8gQ3JlYXRlIGVycm9yIGhhbmRsZXIgZm9yIGFnZ3JlZ2F0aW9uIGZhaWx1cmVzXG4gICAgY29uc3QgYWdncmVnYXRpb25FcnJvckhhbmRsZXIgPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyKCk7XG5cbiAgICAvLyBHZXQgb3B0aW9uYWwgZW5yaWNobWVudCBhbmQgcG9zdC1wcm9jZXNzaW5nIHN0ZXBzXG4gICAgY29uc3QgZW5yaWNobWVudFN0ZXAgPSB0aGlzLmVucmljaG1lbnRTdGVwKCk7XG4gICAgY29uc3QgcG9zdFByb2Nlc3NpbmdTdGVwID0gdGhpcy5wb3N0UHJvY2Vzc2luZ1N0ZXAoKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBmaW5hbCBjaGFpbiBhZnRlciBhZ2dyZWdhdGlvblxuICAgIC8vIENoYWluOiBNYXAgU3RhdGUg4oaSIEFnZ3JlZ2F0aW9uIOKGkiBEeW5hbW9EQiBVcGRhdGUg4oaSIFtFbnJpY2htZW50XSDihpIgW1Bvc3RQcm9jZXNzaW5nXSDihpIgQ2xlYW51cCDihpIgTW92ZSB0byBQcm9jZXNzZWRcbiAgICBsZXQgZmluYWxDaGFpbjogSUNoYWluYWJsZSA9IGNsZWFudXBTdGVwXG4gICAgICAuYWRkUmV0cnkoe1xuICAgICAgICBlcnJvcnM6IFsnTGFtYmRhLlNlcnZpY2VFeGNlcHRpb24nLCAnTGFtYmRhLlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiddLFxuICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXG4gICAgICAgIGJhY2tvZmZSYXRlOiAyLFxuICAgICAgfSlcbiAgICAgIC5uZXh0KG1vdmVUb1Byb2Nlc3NlZCk7XG5cbiAgICAvLyBBZGQgcG9zdC1wcm9jZXNzaW5nIGlmIHByb3ZpZGVkIChpbnNlcnQgYmVmb3JlIGNsZWFudXApXG4gICAgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgY29uc3QgcG9zdFByb2Nlc3NpbmdFcnJvckhhbmRsZXIgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZFBvc3RQcm9jZXNzaW5nRmFpbEREQlVwZGF0ZScsIHtcbiAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgIGtleToge1xuICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctZmFpbHVyZScpLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSkubmV4dCh0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMsICdDaHVua2VkUG9zdFByb2MnKSk7XG5cbiAgICAgIGZpbmFsQ2hhaW4gPSBwb3N0UHJvY2Vzc2luZ1N0ZXBcbiAgICAgICAgLmFkZENhdGNoKHBvc3RQcm9jZXNzaW5nRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSlcbiAgICAgICAgLm5leHQoXG4gICAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ0NodW5rZWRQb3N0UHJvY2Vzc2luZ1N1Y2Nlc3NVcGRhdGUnLCB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIFBvc3RQcm9jZXNzaW5nUmVzdWx0ID0gOnBvc3RQcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctY29tcGxldGUnKSxcbiAgICAgICAgICAgICAgJzpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLnBvc3RQcm9jZXNzZWRSZXN1bHQnKSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgICAgfSkubmV4dChmaW5hbENoYWluKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZW5yaWNobWVudCBpZiBwcm92aWRlZCAoaW5zZXJ0IGJlZm9yZSBwb3N0LXByb2Nlc3Npbmcgb3IgY2xlYW51cClcbiAgICBpZiAoZW5yaWNobWVudFN0ZXApIHtcbiAgICAgIGNvbnN0IGVucmljaG1lbnRFcnJvckhhbmRsZXIgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZEVucmljaG1lbnRGYWlsRERCVXBkYXRlJywge1xuICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAga2V5OiB7XG4gICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2VucmljaG1lbnQtZmFpbHVyZScpLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSkubmV4dCh0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMsICdDaHVua2VkRW5yaWNoJykpO1xuXG4gICAgICBmaW5hbENoYWluID0gZW5yaWNobWVudFN0ZXBcbiAgICAgICAgLmFkZENhdGNoKGVucmljaG1lbnRFcnJvckhhbmRsZXIsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICB9KVxuICAgICAgICAubmV4dChcbiAgICAgICAgICBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZEVucmljaG1lbnRTdWNjZXNzVXBkYXRlJywge1xuICAgICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzLCBFbnJpY2htZW50UmVzdWx0ID0gOmVucmljaG1lbnRSZXN1bHQnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IHBvc3RQcm9jZXNzaW5nU3RlcFxuICAgICAgICAgICAgICAgID8gRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygnZW5yaWNobWVudC1jb21wbGV0ZScpXG4gICAgICAgICAgICAgICAgOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgICAgICAnOmVucmljaG1lbnRSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5lbnJpY2hlZFJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KS5uZXh0KGZpbmFsQ2hhaW4pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENoYWluOiBNYXAgU3RhdGUg4oaSIEFnZ3JlZ2F0aW9uIOKGkiBOb3JtYWxpemUg4oaSIER5bmFtb0RCIFVwZGF0ZSDihpIgW0VucmljaG1lbnRdIOKGkiBbUG9zdFByb2Nlc3NpbmddIOKGkiBDbGVhbnVwIOKGkiBNb3ZlIHRvIFByb2Nlc3NlZFxuICAgIHJldHVybiBtYXBTdGF0ZVxuICAgICAgLmFkZENhdGNoKGFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgIHJlc3VsdFBhdGg6ICckLmVycm9yJyxcbiAgICAgIH0pXG4gICAgICAubmV4dChcbiAgICAgICAgYWdncmVnYXRpb25MYW1iZGFTdGVwXG4gICAgICAgICAgLmFkZENhdGNoKGFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgICAgICByZXN1bHRQYXRoOiAnJC5lcnJvcicsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYWRkUmV0cnkoe1xuICAgICAgICAgICAgZXJyb3JzOiBbJ0xhbWJkYS5TZXJ2aWNlRXhjZXB0aW9uJywgJ0xhbWJkYS5Ub29NYW55UmVxdWVzdHNFeGNlcHRpb24nXSxcbiAgICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXG4gICAgICAgICAgICBiYWNrb2ZmUmF0ZTogMixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5uZXh0KFxuICAgICAgICAgICAgbm9ybWFsaXplU3RhdGUubmV4dChcbiAgICAgICAgICAgICAgdXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXBcbiAgICAgICAgICAgICAgICAuYWRkUmV0cnkoe1xuICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbJ0R5bmFtb0RCLlByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkRXhjZXB0aW9uJ10sXG4gICAgICAgICAgICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygxKSxcbiAgICAgICAgICAgICAgICAgIG1heEF0dGVtcHRzOiAzLFxuICAgICAgICAgICAgICAgICAgYmFja29mZlJhdGU6IDIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAubmV4dChmaW5hbENoYWluKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYWdncmVnYXRpb24gc3RlcCBmb3IgY29tYmluaW5nIGNodW5rIHJlc3VsdHMgdXNpbmcgQmVkcm9jay5cbiAgICpcbiAgICogVXNlcyB0aGUgc2FtZSBCZWRyb2NrIGludm9rZSBMYW1iZGEgcGF0dGVybiBhcyB0aGUgcHJvY2Vzc2luZyBzdGVwIGJ1dCB3aXRoXG4gICAqIGEgZGlmZmVyZW50IHByb21wdCBkZXNpZ25lZCBmb3IgYWdncmVnYXRpbmcgbXVsdGlwbGUgY2h1bmsgcmVzdWx0cy5cbiAgICogVGhlIGNodW5rIHByb2Nlc3NpbmcgcmVzdWx0cyBhcmUgcGFzc2VkIGFzIHRleHQgZGF0YSB0byB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciByZXN1bHQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRpb25TdGVwKCk6IExhbWJkYUludm9rZSB7XG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiBvbmx5IG9uY2UgKHJldXNlcyBiZWRyb2NrLWludm9rZSBwYXR0ZXJuKVxuICAgIGlmICghdGhpcy5fYWdncmVnYXRpb25GdW5jdGlvbikge1xuICAgICAgY29uc3QgcHJvbXB0ID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuYWdncmVnYXRpb25Qcm9tcHQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX0FHR1JFR0FUSU9OX1BST01QVDtcbiAgICAgIGNvbnN0IGFkanVzdGVkTW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ0JlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCByb2xlID0gdGhpcy5nZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKCdBZ2dyZWdhdGlvbkxhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgICBhY2NvdW50LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdiZWRyb2NrLWlkcC1hZ2dyZWdhdGlvbicsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ0JlZHJvY2tBZ2dyZWdhdGlvbkZ1bmN0aW9uJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgICBlbnRyeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9kZWZhdWx0LWJlZHJvY2staW52b2tlJyksXG4gICAgICAgIHJvbGUsXG4gICAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIE1PREVMX0lEOiBhZGp1c3RlZE1vZGVsSWQsXG4gICAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgICAgSU5WT0tFX1RZUEU6IEludm9rZVR5cGUuQUdHUkVHQVRJT04sXG4gICAgICAgICAgSU5WT0tFX01BWF9UT0tFTlM6ICc2NDAwMCcsIC8vIEFnZ3JlZ2F0aW9uIG1heSBuZWVkIG1vcmUgdG9rZW5zIGZvciBtZXJnZWQgb3V0cHV0XG4gICAgICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fYWdncmVnYXRpb25GdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9hZ2dyZWdhdGlvbkZ1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGNyZWF0ZSBhIG5ldyBMYW1iZGFJbnZva2UgdGFzayB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmdcbiAgICBjb25zdCBzdGVwSWQgPSBgQWdncmVnYXRpb25TdGVwLSR7dGhpcy5fYWdncmVnYXRpb25TdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uU3RlcENvdW50ZXIrKztcblxuICAgIC8vIFBhc3MgY2h1bmsgcmVzdWx0cyBhcyBkYXRhIGNvbnRlbnQgLSB0aGUgTGFtYmRhIHdpbGwgZm9ybWF0IHRoZW0gZm9yIEJlZHJvY2tcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9hZ2dyZWdhdGlvbkZ1bmN0aW9uLFxuICAgICAgcGF5bG9hZDogVGFza0lucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAnZG9jdW1lbnRJZC4kJzogJyQuZG9jdW1lbnRJZCcsXG4gICAgICAgICdjb250ZW50VHlwZSc6ICdkYXRhJyxcbiAgICAgICAgJ2NvbnRlbnQnOiB7XG4gICAgICAgICAgLy8gUGFzcyB0aGUgY2h1bmsgcmVzdWx0cyBhcyBKU09OIHN0cmluZyBmb3IgdGhlIExhbWJkYSB0byBwcm9jZXNzXG4gICAgICAgICAgJ2RhdGEuJCc6ICdTdGF0ZXMuSnNvblRvU3RyaW5nKCQuY2h1bmtSZXN1bHRzKScsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIC8vIFN0b3JlIGluIGJvdGggYWdncmVnYXRlZFJlc3VsdCBBTkQgcHJvY2Vzc2luZ1Jlc3VsdCBmb3IgY29uc2lzdGVuY3kgd2l0aCBub24tY2h1bmtlZCBmbG93XG4gICAgICAvLyBUaGlzIGFsbG93cyBlbnJpY2htZW50L3Bvc3QtcHJvY2Vzc2luZyBzdGVwcyB0byB1c2UgJC5wcm9jZXNzaW5nUmVzdWx0IHJlZ2FyZGxlc3Mgb2YgY2h1bmtpbmdcbiAgICAgIHJlc3VsdFBhdGg6ICckLmFnZ3JlZ2F0ZWRSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3Jlc3VsdC4kJzogJyQuUGF5bG9hZC5yZXN1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBEeW5hbW9EQiB1cGRhdGUgc3RlcCBmb3Igc3RvcmluZyBhZ2dyZWdhdGVkIHJlc3VsdHMuXG4gICAqXG4gICAqIFVwZGF0ZXMgdGhlIGRvY3VtZW50IHJlY29yZCB3aXRoOlxuICAgKiAtIEFnZ3JlZ2F0ZWRSZXN1bHQ6IEpTT04gc3RyaW5nIHdpdGggY2xhc3NpZmljYXRpb24sIGVudGl0aWVzLCBhbmQgc3VtbWFyeVxuICAgKiAtIFdvcmtmbG93U3RhdHVzOiAnY29tcGxldGUnXG4gICAqXG4gICAqIEByZXR1cm5zIER5bmFtb1VwZGF0ZUl0ZW0gdGFzayBmb3Igc3RvcmluZyBhZ2dyZWdhdGVkIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXAoKTogRHluYW1vVXBkYXRlSXRlbSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdTdG9yZUFnZ3JlZ2F0ZWRSZXN1bHQnLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGtleToge1xuICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICB9LFxuICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBBZ2dyZWdhdGVkUmVzdWx0ID0gOnJlc3VsdCwgV29ya2Zsb3dTdGF0dXMgPSA6c3RhdHVzJyxcbiAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgJzpyZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICAgIEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5hZ2dyZWdhdGVkUmVzdWx0JykpLFxuICAgICAgICApLFxuICAgICAgICAnOnN0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NvbXBsZXRlJyksXG4gICAgICB9LFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBjbGVhbnVwIExhbWJkYSBzdGVwIGZvciByZW1vdmluZyB0ZW1wb3JhcnkgY2h1bmsgZmlsZXMuXG4gICAqXG4gICAqIFRoZSBjbGVhbnVwIExhbWJkYTpcbiAgICogLSBEZWxldGVzIGFsbCBjaHVuayBmaWxlcyBmcm9tIFMzIGNodW5rcy8gcHJlZml4XG4gICAqIC0gVXNlcyBiYXRjaCBkZWxldGUgZm9yIGVmZmljaWVuY3kgKHVwIHRvIDEwMDAgb2JqZWN0cyBwZXIgcmVxdWVzdClcbiAgICogLSBMb2dzIGVycm9ycyBidXQgZG9lc24ndCBmYWlsIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgY2h1bmsgY2xlYW51cFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwU3RlcCgpOiBMYW1iZGFJbnZva2Uge1xuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb24gb25seSBvbmNlXG4gICAgaWYgKCF0aGlzLl9jbGVhbnVwRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3Qgcm9sZSA9IG5ldyBSb2xlKHRoaXMsICdDbGVhbnVwTGFtYmRhUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICBDbGVhbnVwUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICAvLyBTMyBhY2Nlc3MgZm9yIGRlbGV0aW5nIGNodW5rcyBvbmx5IC0gbGVhc3QgcHJpdmlsZWdlXG4gICAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoWydzMzpEZWxldGVPYmplY3QnXSwgdHJ1ZSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2xlYW51cCcsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAgIHRoaXMuX2NsZWFudXBGdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQ2xlYW51cEZ1bmN0aW9uJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvY2xlYW51cCcpLFxuICAgICAgICBpbmRleDogJ2hhbmRsZXIucHknLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgdnBjOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB2cGNTdWJuZXRzOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXBGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9jbGVhbnVwRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnQ2xlYW51cENodW5rcycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9jbGVhbnVwRnVuY3Rpb24sXG4gICAgICBwYXlsb2FkOiBUYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICdkb2N1bWVudElkLiQnOiAnJC5kb2N1bWVudElkJyxcbiAgICAgICAgJ2NodW5rcy4kJzogJyQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzJyxcbiAgICAgIH0pLFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBoYW5kbGVyIGZvciBhZ2dyZWdhdGlvbiBmYWlsdXJlcy5cbiAgICpcbiAgICogV2hlbiBhZ2dyZWdhdGlvbiBmYWlsczpcbiAgICogLSBVcGRhdGVzIER5bmFtb0RCIHdpdGggJ2FnZ3JlZ2F0aW9uLWZhaWx1cmUnIHN0YXR1c1xuICAgKiAtIE1vdmVzIGRvY3VtZW50IHRvIGZhaWxlZC8gcHJlZml4XG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIGNoYWluIGZvciBoYW5kbGluZyBhZ2dyZWdhdGlvbiBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRpb25FcnJvckhhbmRsZXIoKTogSUNoYWluYWJsZSB7XG4gICAgY29uc3QgdXBkYXRlRmFpbHVyZVN0YXR1cyA9IG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdBZ2dyZWdhdGlvbkZhaWxEREJVcGRhdGUnLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGtleToge1xuICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICB9LFxuICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2FnZ3JlZ2F0aW9uLWZhaWx1cmUnKSxcbiAgICAgIH0sXG4gICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgIH0pO1xuXG4gICAgLy8gVXNlICdDaHVua2VkJyBwcmVmaXggdG8gYXZvaWQgSUQgY29sbGlzaW9ucyB3aXRoIHN0YW5kYXJkIHdvcmtmbG93XG4gICAgY29uc3QgbW92ZVRvRmFpbGVkID0gdGhpcy5pbmdyZXNzQWRhcHRlci5jcmVhdGVGYWlsZWRDaGFpbih0aGlzLCAnQ2h1bmtlZCcpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZUZhaWx1cmVTdGF0dXMubmV4dChtb3ZlVG9GYWlsZWQpO1xuICB9XG59XG4iXX0=
905
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2QkFBNkI7QUFDN0IsOEVBQWtFO0FBQ2xFLDZDQUE4QztBQUM5QyxpREFBcUU7QUFDckUsaURBQTZFO0FBQzdFLHVEQUFnRTtBQUNoRSxxRUFBOEc7QUFDOUcsaUZBQTJHO0FBRTNHLHlFQUE2SDtBQUU3SCw0Q0FBMkQ7QUFDM0Qsa0RBQTRFO0FBQzVFLDRDQUE4QztBQUM5QyxvRkFBZ0Y7QUF3SGhGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEseUJBQTBCLFNBQVEsaURBQXNCO0lBK0VuRTs7Ozs7Ozs7Ozs7T0FXRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUE3QjFCLDREQUE0RDtRQUNwRCwrQkFBMEIsR0FBRyxDQUFDLENBQUM7UUFDdkMsd0RBQXdEO1FBQ2hELDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUduQyx5REFBeUQ7UUFDakQsNEJBQXVCLEdBQUcsQ0FBQyxDQUFDO1FBR3BDLHdEQUF3RDtRQUNoRCwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFDbkMsNkRBQTZEO1FBQ3JELCtCQUEwQixHQUFHLENBQUMsQ0FBQztRQWlCckMsTUFBTSxhQUFhLEdBQUcsS0FBK0MsQ0FBQztRQUV0RSw4Q0FBOEM7UUFDOUMsSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLGNB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QUMsQ0FBQztRQUVILHFFQUFxRTtRQUNyRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUU1RSxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDOztBQXgrQkgsOERBeStCQzs7O0FBeCtCMkIsdURBQTZCLEdBQUc7Ozs7Ozs7OztHQVN6RCxBQVRzRCxDQVNyRDtBQUV3QixtREFBeUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JyRCxBQWxCa0QsQ0FrQmpEO0FBRXdCLG9EQUEwQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQnRELEFBckJtRCxDQXFCbEQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQeXRob25GdW5jdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUm9sZSwgU2VydmljZVByaW5jaXBhbCwgUG9saWN5RG9jdW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEZ1bmN0aW9uLCBBcmNoaXRlY3R1cmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IElDaGFpbmFibGUsIENob2ljZSwgQ29uZGl0aW9uLCBNYXAsIEpzb25QYXRoLCBUYXNrSW5wdXQsIFBhc3MgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBEeW5hbW9BdHRyaWJ1dGVWYWx1ZSwgRHluYW1vVXBkYXRlSXRlbSwgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nLCBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgQ2h1bmtpbmdDb25maWcgfSBmcm9tICcuL2NodW5raW5nLWNvbmZpZyc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMsIEludm9rZVR5cGUgfSBmcm9tICcuLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgQmVkcm9ja01vZGVsUHJvcHMsIEJlZHJvY2tNb2RlbFV0aWxzIH0gZnJvbSAnLi4vZnJhbWV3b3JrL2JlZHJvY2snO1xuaW1wb3J0IHsgTGFtYmRhSWFtVXRpbHMgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L3Bvd2VydG9vbHMtY29uZmlnJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0LlxuICogRXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgd2l0aCBCZWRyb2NrLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHtcbiAgLyoqXG4gICAqIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsPzogQmVkcm9ja01vZGVsUHJvcHM7XG5cbiAgLyoqXG4gICAqIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvbiBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2luZ0JlZHJvY2tNb2RlbD86IEJlZHJvY2tNb2RlbFByb3BzO1xuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24uXG4gICAqIE11c3QgaW5jbHVkZSBwbGFjZWhvbGRlciBmb3IgZG9jdW1lbnQgY29udGVudC5cbiAgICogQGRlZmF1bHQgREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpY2F0aW9uUHJvbXB0Pzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvbi5cbiAgICogTXVzdCBpbmNsdWRlIHBsYWNlaG9sZGVyIGZvciBkb2N1bWVudCBjb250ZW50IGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQuXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfRVhUUkFDVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NpbmdQcm9tcHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBMYW1iZGEgZnVuY3Rpb24gZm9yIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcC5cbiAgICogSWYgcHJvdmlkZWQsIHdpbGwgYmUgaW52b2tlZCBhZnRlciBleHRyYWN0aW9uIHdpdGggd29ya2Zsb3cgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBlbnJpY2htZW50TGFtYmRhRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiBmb3IgcG9zdC1wcm9jZXNzaW5nIHN0ZXAuXG4gICAqIElmIHByb3ZpZGVkLCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgZW5yaWNobWVudCB3aXRoIHdvcmtmbG93IHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKipcbiAgICogVGltZW91dCBmb3IgaW5kaXZpZHVhbCBTdGVwIEZ1bmN0aW9ucyB0YXNrcyAoY2xhc3NpZmljYXRpb24sIGV4dHJhY3Rpb24sIGV0Yy4pLlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDUpXG4gICAqL1xuICByZWFkb25seSBzdGVwVGltZW91dHM/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgYWdncmVnYXRpbmcgcmVzdWx0cyBmcm9tIG11bHRpcGxlIGNodW5rcy5cbiAgICogVXNlZCB3aGVuIGNodW5raW5nIGlzIGVuYWJsZWQgdG8gbWVyZ2UgcHJvY2Vzc2luZyByZXN1bHRzIGZyb20gYWxsIGNodW5rc1xuICAgKiBpbnRvIGEgc2luZ2xlIGNvaGVyZW50IHJlc3VsdC5cbiAgICpcbiAgICogVGhlIHByb21wdCByZWNlaXZlcyB0aGUgY29uY2F0ZW5hdGVkIHByb2Nlc3NpbmcgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3NcbiAgICogYW5kIHNob3VsZCBpbnN0cnVjdCB0aGUgbW9kZWwgdG8gc3ludGhlc2l6ZSB0aGVtIGludG8gYSB1bmlmaWVkIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgREVGQVVMVF9BR0dSRUdBVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uUHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgUERGIGNodW5raW5nIGZvciBsYXJnZSBkb2N1bWVudHMuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgZG9jdW1lbnRzIGV4Y2VlZGluZyBjb25maWd1cmVkIHRocmVzaG9sZHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIHNwbGl0IGludG8gY2h1bmtzLCBwcm9jZXNzZWQgaW4gcGFyYWxsZWwgb3Igc2VxdWVudGlhbGx5LCBhbmQgcmVzdWx0cyBhZ2dyZWdhdGVkLlxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcjpcbiAgICogLSBQcm9jZXNzaW5nIGxhcmdlIFBERnMgKD4xMDAgcGFnZXMpXG4gICAqIC0gSGFuZGxpbmcgZG9jdW1lbnRzIHRoYXQgZXhjZWVkIEJlZHJvY2sgdG9rZW4gbGltaXRzICh+MjAwSyB0b2tlbnMpXG4gICAqIC0gSW1wcm92aW5nIHByb2Nlc3NpbmcgcmVsaWFiaWxpdHkgZm9yIGNvbXBsZXggZG9jdW1lbnRzXG4gICAqIC0gUHJvY2Vzc2luZyBkb2N1bWVudHMgd2l0aCB2YXJpYWJsZSBjb250ZW50IGRlbnNpdHlcbiAgICpcbiAgICogVGhlIGNodW5raW5nIHdvcmtmbG93OlxuICAgKiAxLiBBbmFseXplcyBQREYgdG8gZGV0ZXJtaW5lIHBhZ2UgY291bnQgYW5kIGVzdGltYXRlIHRva2VuIGNvdW50XG4gICAqIDIuIERlY2lkZXMgaWYgY2h1bmtpbmcgaXMgbmVlZGVkIGJhc2VkIG9uIGNvbmZpZ3VyZWQgdGhyZXNob2xkc1xuICAgKiAzLiBJZiBjaHVua2luZyBpcyBuZWVkZWQsIHNwbGl0cyBQREYgaW50byBjaHVua3MgYW5kIHVwbG9hZHMgdG8gUzNcbiAgICogNC4gUHJvY2Vzc2VzIGVhY2ggY2h1bmsgdGhyb3VnaCBjbGFzc2lmaWNhdGlvbiBhbmQgZXh0cmFjdGlvblxuICAgKiA1LiBBZ2dyZWdhdGVzIHJlc3VsdHMgdXNpbmcgbWFqb3JpdHkgdm90aW5nIGZvciBjbGFzc2lmaWNhdGlvblxuICAgKiA2LiBEZWR1cGxpY2F0ZXMgZW50aXRpZXMgYWNyb3NzIGNodW5rc1xuICAgKiA3LiBDbGVhbnMgdXAgdGVtcG9yYXJ5IGNodW5rIGZpbGVzIGZyb20gUzNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNodW5raW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgUERGIGNodW5raW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiBgZW5hYmxlQ2h1bmtpbmdgIGlzIHRydWUuIEFsbG93cyBjdXN0b21pemF0aW9uIG9mOlxuICAgKiAtICoqQ2h1bmtpbmcgc3RyYXRlZ3kqKjogSG93IGRvY3VtZW50cyBhcmUgc3BsaXQgKGZpeGVkLXBhZ2VzLCB0b2tlbi1iYXNlZCwgb3IgaHlicmlkKVxuICAgKiAtICoqVGhyZXNob2xkcyoqOiBXaGVuIHRvIHRyaWdnZXIgY2h1bmtpbmcgYmFzZWQgb24gcGFnZSBjb3VudCBvciB0b2tlbiBjb3VudFxuICAgKiAtICoqQ2h1bmsgc2l6ZSBhbmQgb3ZlcmxhcCoqOiBDb250cm9sIGNodW5rIGJvdW5kYXJpZXMgYW5kIGNvbnRleHQgcHJlc2VydmF0aW9uXG4gICAqIC0gKipQcm9jZXNzaW5nIG1vZGUqKjogUGFyYWxsZWwgKGZhc3Rlcikgb3Igc2VxdWVudGlhbCAoY29zdC1vcHRpbWl6ZWQpXG4gICAqIC0gKipBZ2dyZWdhdGlvbiBzdHJhdGVneSoqOiBIb3cgdG8gY29tYmluZSByZXN1bHRzIGZyb20gbXVsdGlwbGUgY2h1bmtzXG4gICAqXG4gICAqICMjIERlZmF1bHQgQ29uZmlndXJhdGlvblxuICAgKlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgc2Vuc2libGUgZGVmYXVsdHMgb3B0aW1pemVkIGZvciBtb3N0IHVzZSBjYXNlczpcbiAgICogLSBTdHJhdGVneTogYCdoeWJyaWQnYCAocmVjb21tZW5kZWQgLSBiYWxhbmNlcyB0b2tlbiBhbmQgcGFnZSBsaW1pdHMpXG4gICAqIC0gUGFnZSB0aHJlc2hvbGQ6IDEwMCBwYWdlc1xuICAgKiAtIFRva2VuIHRocmVzaG9sZDogMTUwLDAwMCB0b2tlbnNcbiAgICogLSBQcm9jZXNzaW5nIG1vZGU6IGAncGFyYWxsZWwnYFxuICAgKiAtIE1heCBjb25jdXJyZW5jeTogMTBcbiAgICogLSBBZ2dyZWdhdGlvbiBzdHJhdGVneTogYCdtYWpvcml0eS12b3RlJ2BcbiAgICpcbiAgICogIyMgU3RyYXRlZ3kgQ29tcGFyaXNvblxuICAgKlxuICAgKiB8IFN0cmF0ZWd5IHwgQmVzdCBGb3IgfCBQcm9zIHwgQ29ucyB8XG4gICAqIHwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLXxcbiAgICogfCBgaHlicmlkYCB8IE1vc3QgZG9jdW1lbnRzIHwgQmFsYW5jZXMgdG9rZW4vcGFnZSBsaW1pdHMgfCBTbGlnaHRseSBtb3JlIGNvbXBsZXggfFxuICAgKiB8IGB0b2tlbi1iYXNlZGAgfCBWYXJpYWJsZSBkZW5zaXR5IHwgUmVzcGVjdHMgbW9kZWwgbGltaXRzIHwgU2xvd2VyIGFuYWx5c2lzIHxcbiAgICogfCBgZml4ZWQtcGFnZXNgIHwgVW5pZm9ybSBkZW5zaXR5IHwgU2ltcGxlLCBmYXN0IHwgTWF5IGV4Y2VlZCB0b2tlbiBsaW1pdHMgfFxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgKHVzZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZW4gZW5hYmxlQ2h1bmtpbmcgaXMgdHJ1ZSlcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgQ2h1bmtpbmdDb25maWd9IGZvciBkZXRhaWxlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGNodW5raW5nQ29uZmlnPzogQ2h1bmtpbmdDb25maWc7XG59XG5cbmludGVyZmFjZSBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nSW50ZXJuYWxQcm9wcyBleHRlbmRzIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyB7XG4gIHJlYWRvbmx5IF9za2lwQmVkcm9ja1ZwY0VuZHBvaW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvdyBwb3dlcmVkIGJ5IEFtYXpvbiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzLlxuICpcbiAqIEV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB0byBwcm92aWRlIEFJLXBvd2VyZWQgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gYW5kIGV4dHJhY3Rpb25cbiAqIHVzaW5nIEFtYXpvbiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzLiBUaGlzIGltcGxlbWVudGF0aW9uIG9mZmVyczpcbiAqXG4gKiAjIyBLZXkgRmVhdHVyZXNcbiAqIC0gKipBSS1Qb3dlcmVkIENsYXNzaWZpY2F0aW9uKio6IFVzZXMgQ2xhdWRlIDMuNyBTb25uZXQgKGNvbmZpZ3VyYWJsZSkgdG8gY2xhc3NpZnkgZG9jdW1lbnQgdHlwZXNcbiAqIC0gKipJbnRlbGxpZ2VudCBFeHRyYWN0aW9uKio6IEV4dHJhY3RzIHN0cnVjdHVyZWQgZGF0YSBmcm9tIGRvY3VtZW50cyB1c2luZyBmb3VuZGF0aW9uIG1vZGVsc1xuICogLSAqKkNyb3NzLVJlZ2lvbiBJbmZlcmVuY2UqKjogT3B0aW9uYWwgc3VwcG9ydCBmb3IgaW1wcm92ZWQgYXZhaWxhYmlsaXR5IHZpYSBpbmZlcmVuY2UgcHJvZmlsZXNcbiAqIC0gKipGbGV4aWJsZSBQcm9jZXNzaW5nKio6IE9wdGlvbmFsIGVucmljaG1lbnQgYW5kIHBvc3QtcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb25zXG4gKiAtICoqQ29zdCBPcHRpbWl6ZWQqKjogQ29uZmlndXJhYmxlIHRpbWVvdXRzIGFuZCBtb2RlbCBzZWxlY3Rpb24gZm9yIGNvc3QgY29udHJvbFxuICpcbiAqICMjIFByb2Nlc3NpbmcgV29ya2Zsb3dcbiAqIFMzIFVwbG9hZCDihpIgQ2xhc3NpZmljYXRpb24gKEJlZHJvY2spIOKGkiBFeHRyYWN0aW9uIChCZWRyb2NrKSDihpIgW0VucmljaG1lbnRdIOKGkiBbUG9zdC1Qcm9jZXNzaW5nXSDihpIgUmVzdWx0c1xuICpcbiAqICMjIERlZmF1bHQgTW9kZWxzXG4gKiAtIENsYXNzaWZpY2F0aW9uOiBDbGF1ZGUgMy43IFNvbm5ldCAoYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjApXG4gKiAtIEV4dHJhY3Rpb246IENsYXVkZSAzLjcgU29ubmV0IChhbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MClcbiAqXG4gKiAjIyBQcm9tcHQgVGVtcGxhdGVzXG4gKiBUaGUgY29uc3RydWN0IHVzZXMgZGVmYXVsdCBwcm9tcHRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQ6XG4gKiAtICoqQ2xhc3NpZmljYXRpb24qKjogQW5hbHl6ZXMgZG9jdW1lbnQgYW5kIHJldHVybnMgSlNPTiB3aXRoIGRvY3VtZW50Q2xhc3NpZmljYXRpb24gZmllbGRcbiAqIC0gKipFeHRyYWN0aW9uKio6IFVzZXMgY2xhc3NpZmljYXRpb24gcmVzdWx0IHRvIGV4dHJhY3QgZW50aXRpZXMgaW4gc3RydWN0dXJlZCBKU09OIGZvcm1hdFxuICpcbiAqICMjIENyb3NzLVJlZ2lvbiBJbmZlcmVuY2VcbiAqIFdoZW4gZW5hYmxlZCwgdXNlcyBCZWRyb2NrIGluZmVyZW5jZSBwcm9maWxlcyBmb3IgaW1wcm92ZWQgYXZhaWxhYmlsaXR5OlxuICogLSBVUyBwcmVmaXg6IFJvdXRlcyB0byBVUy1iYXNlZCByZWdpb25zIGZvciBsb3dlciBsYXRlbmN5XG4gKiAtIEVVIHByZWZpeDogUm91dGVzIHRvIEVVLWJhc2VkIHJlZ2lvbnMgZm9yIGRhdGEgcmVzaWRlbmN5IGNvbXBsaWFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NMQVNTSUZJQ0FUSU9OX1BST01QVCA9IGBcbiAgQW5hbHl6ZSB0aGUgZG9jdW1lbnQgYmVsb3csIGFuZCBjbGFzc2lmeSB0aGUgdHlwZSBvZiBkb2N1bWVudCBpdCBpcyAoZWcuIElOVk9JQ0UsIElERU5USVRZX0RPQ1VNRU5ULCBSRUNFSVBULCBldGMpLiBUaGUgcmVzdWx0IHNob3VsZCBiZSBpbiBKU09OIGFuZCBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIChvbmx5IHJlc3BvbmQgaW4gSlNPTiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFuZCBkbyBub3QgdXNlIG1hcmtkb3duIHRvIGluZGljYXRlIHRoZSBqc29uLCBqdXN0IG91dHB1dCBwbGFpbiBvbGQganNvbiB3aXRoIG5vdGhpbmcgZWxzZSk6XG5cbiAge1xuICAgICAgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogPENMQVNTSUZJQ0FUSU9OPlxuICB9XG5cbiAgQXR0YWNoZWQgZG9jdW1lbnQgaXMgYXMgZm9sbG93czpcblxuICBgO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9QUk9DRVNTSU5HX1BST01QVCA9IGBcbiAgVGhlIGRvY3VtZW50IGJlbG93IGhhcyBiZWVuIGNsYXNzaWZpZWQgYXMgW0FDVFVBTF9DTEFTU0lGSUNBVElPTl0uIEV4dHJhY3QgaW1wb3J0YW50IGVudGl0aWVzIGZyb20gdGhlIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBKU09OIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIGJlbG93IChvbmx5IHJlc3BvbmQgaW4gSlNPTiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFuZCBkbyBub3QgdXNlIG1hcmtkb3duIHRvIGluZGljYXRlIHRoZSBqc29uLCBqdXN0IG91dHB1dCBwbGFpbiBvbGQganNvbiB3aXRoIG5vdGhpbmcgZWxzZSk6XG5cbiAge1xuICAgICAgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogPENMQVNTSUZJQ0FUSU9OPixcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBlbnRpdGllczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IDxUWVBFIE9GIEVOVElUWT5cbiAgICAgICAgICAgICAgICB2YWx1ZTogPFZBTFVFIE9GIEVOVElUWT5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5cbiAgICAgICAgXVxuICAgICAgfVxuICB9XG5cbiAgQXR0YWNoZWQgZG9jdW1lbnQgaXMgYXMgZm9sbG93czpcblxuICBgO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BR0dSRUdBVElPTl9QUk9NUFQgPSBgXG4gIFlvdSBhcmUgZ2l2ZW4gdGhlIHByb2Nlc3NpbmcgcmVzdWx0cyBmcm9tIG11bHRpcGxlIGNodW5rcyBvZiBhIGxhcmdlIGRvY3VtZW50IHRoYXQgd2FzIHNwbGl0IGZvciBwcm9jZXNzaW5nLlxuICBZb3VyIHRhc2sgaXMgdG8gc3ludGhlc2l6ZSB0aGVzZSBjaHVuayByZXN1bHRzIGludG8gYSBzaW5nbGUsIGNvaGVyZW50IGZpbmFsIHJlc3VsdC5cblxuICBJbnN0cnVjdGlvbnM6XG4gIDEuIFJldmlldyBhbGwgdGhlIGNodW5rIHJlc3VsdHMgcHJvdmlkZWQgYmVsb3dcbiAgMi4gTWVyZ2UgYW5kIGRlZHVwbGljYXRlIGFueSBvdmVybGFwcGluZyBpbmZvcm1hdGlvbiAoY2h1bmtzIG1heSBoYXZlIG92ZXJsYXBwaW5nIHBhZ2VzKVxuICAzLiBTeW50aGVzaXplIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgdW5pZmllZCwgY29oZXJlbnQgcmVzdWx0XG4gIDQuIE1haW50YWluIHRoZSBzYW1lIG91dHB1dCBmb3JtYXQgYXMgdGhlIGluZGl2aWR1YWwgY2h1bmsgcmVzdWx0c1xuICA1LiBJZiB0aGUgY2h1bmtzIGNvbnRhaW4gc3VtbWFyaWVzLCBjcmVhdGUgYSBjb21wcmVoZW5zaXZlIHN1bW1hcnkgdGhhdCBjb3ZlcnMgYWxsIHNlY3Rpb25zXG4gIDYuIElmIHRoZSBjaHVua3MgY29udGFpbiBlbnRpdGllcywgZGVkdXBsaWNhdGUgYW5kIGNvbnNvbGlkYXRlIHRoZW1cbiAgNy4gUHJlc2VydmUgaW1wb3J0YW50IGRldGFpbHMgZnJvbSBlYWNoIGNodW5rIHdoaWxlIGF2b2lkaW5nIHJlZHVuZGFuY3lcblxuICBSZXR1cm4gdGhlIHJlc3VsdCBhcyBKU09OIChvbmx5IHJlc3BvbmQgaW4gSlNPTiB3aXRob3V0IG1hcmtkb3duIGZvcm1hdHRpbmcpOlxuXG4gIHtcbiAgICAgIFwicmVzdWx0XCI6IDxTWU5USEVTSVpFRF9SRVNVTFQ+XG4gIH1cblxuICBUaGUgY2h1bmsgcmVzdWx0cyB0byBhZ2dyZWdhdGUgYXJlIGFzIGZvbGxvd3M6XG5cbiAgYDtcblxuICAvKiogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIEJlZHJvY2sgZG9jdW1lbnQgcHJvY2Vzc2luZyAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzOiBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHM7XG4gIC8qKiBUaGUgU3RlcCBGdW5jdGlvbnMgc3RhdGUgbWFjaGluZSB0aGF0IG9yY2hlc3RyYXRlcyB0aGUgZG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvdyAqL1xuICByZWFkb25seSBzdGF0ZU1hY2hpbmU7XG4gIC8qKiBDYWNoZWQgY2xhc3NpZmljYXRpb24gTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXNvdXJjZSBjcmVhdGlvbiAqL1xuICBwcml2YXRlIF9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKiBDYWNoZWQgcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb24gdG8gYXZvaWQgZHVwbGljYXRlIHJlc291cmNlIGNyZWF0aW9uICovXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgY2xhc3NpZmljYXRpb24gc3RlcCBJRHMgKi9cbiAgcHJpdmF0ZSBfY2xhc3NpZmljYXRpb25TdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBwcm9jZXNzaW5nIHN0ZXAgSURzICovXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdTdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDYWNoZWQgYWdncmVnYXRpb24gTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXNvdXJjZSBjcmVhdGlvbiAqL1xuICBwcml2YXRlIF9hZ2dyZWdhdGlvbkZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBhZ2dyZWdhdGlvbiBzdGVwIElEcyAqL1xuICBwcml2YXRlIF9hZ2dyZWdhdGlvblN0ZXBDb3VudGVyID0gMDtcbiAgLyoqIENhY2hlZCBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbiB0byBhdm9pZCBkdXBsaWNhdGUgcmVzb3VyY2UgY3JlYXRpb24gKi9cbiAgcHJpdmF0ZSBfY2xlYW51cEZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBlbnJpY2htZW50IHN0ZXAgSURzICovXG4gIHByaXZhdGUgX2VucmljaG1lbnRTdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBwb3N0LXByb2Nlc3Npbmcgc3RlcCBJRHMgKi9cbiAgcHJpdmF0ZSBfcG9zdFByb2Nlc3NpbmdTdGVwQ291bnRlciA9IDA7XG5cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdC5cbiAgICpcbiAgICogSW5pdGlhbGl6ZXMgdGhlIEJlZHJvY2stcG93ZXJlZCBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lIHdpdGggQUkgY2xhc3NpZmljYXRpb25cbiAgICogYW5kIGV4dHJhY3Rpb24gY2FwYWJpbGl0aWVzLiBDcmVhdGVzIExhbWJkYSBmdW5jdGlvbnMgd2l0aCBhcHByb3ByaWF0ZSBJQU0gcm9sZXNcbiAgICogZm9yIEJlZHJvY2sgbW9kZWwgaW52b2NhdGlvbiBhbmQgUzMgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBCZWRyb2NrIGRvY3VtZW50IHByb2Nlc3NpbmcgcGlwZWxpbmVcbiAgICogQHRocm93cyBFcnJvciBpZiBjaHVua2luZyBjb25maWd1cmF0aW9uIGlzIGludmFsaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICBjb25zdCBpbnRlcm5hbFByb3BzID0gcHJvcHMgYXMgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ0ludGVybmFsUHJvcHM7XG5cbiAgICAvLyBWYWxpZGF0ZSBjaHVua2luZyBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLmVuYWJsZUNodW5raW5nICYmIHByb3BzLmNodW5raW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ2h1bmtpbmdDb25maWcocHJvcHMuY2h1bmtpbmdDb25maWcpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5uZXR3b3JrICYmICFpbnRlcm5hbFByb3BzLl9za2lwQmVkcm9ja1ZwY0VuZHBvaW50cykge1xuICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2UtYmVkcm9jaycsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5CRURST0NLKTtcbiAgICAgIHByb3BzLm5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCd2cGNlLWJlZHJvY2stcnVudGltZScsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5CRURST0NLX1JVTlRJTUUpO1xuICAgIH1cblxuICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzID0gcHJvcHM7XG4gICAgdGhpcy5zdGF0ZU1hY2hpbmUgPSB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCdiZWRyb2NrLWRvY3VtZW50LXByb2Nlc3Npbmctd29ya2Zsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGNodW5raW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cbiAgICpcbiAgICogRW5zdXJlcyB0aGF0OlxuICAgKiAtIENodW5rIHNpemUgaXMgZ3JlYXRlciB0aGFuIDBcbiAgICogLSBPdmVybGFwIGlzIG5vbi1uZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIGNodW5rIHNpemVcbiAgICogLSBUaHJlc2hvbGRzIGFyZSBncmVhdGVyIHRoYW4gMFxuICAgKiAtIE1heCBjb25jdXJyZW5jeSBpcyBncmVhdGVyIHRoYW4gMFxuICAgKiAtIE1pbiBzdWNjZXNzIHRocmVzaG9sZCBpcyBiZXR3ZWVuIDAgYW5kIDFcbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBjaHVua2luZyBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDaHVua2luZ0NvbmZpZyhjb25maWc6IENodW5raW5nQ29uZmlnKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgY2h1bmsgc2l6ZSAoZm9yIGZpeGVkLXBhZ2VzIHN0cmF0ZWd5KVxuICAgIGlmIChjb25maWcuY2h1bmtTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb25maWcuY2h1bmtTaXplIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBjaHVua1NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJsYXAgcGFnZXMgKGZvciBmaXhlZC1wYWdlcyBzdHJhdGVneSlcbiAgICBpZiAoY29uZmlnLm92ZXJsYXBQYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uZmlnLm92ZXJsYXBQYWdlcyA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBvdmVybGFwUGFnZXMgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUNodW5rU2l6ZSA9IGNvbmZpZy5jaHVua1NpemUgfHwgNTA7IC8vIGRlZmF1bHQgY2h1bmsgc2l6ZVxuICAgICAgaWYgKGNvbmZpZy5vdmVybGFwUGFnZXMgPj0gZWZmZWN0aXZlQ2h1bmtTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogb3ZlcmxhcFBhZ2VzIG11c3QgYmUgbGVzcyB0aGFuIGNodW5rU2l6ZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBhZ2UgdGhyZXNob2xkXG4gICAgaWYgKGNvbmZpZy5wYWdlVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLnBhZ2VUaHJlc2hvbGQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBwYWdlVGhyZXNob2xkIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0b2tlbiB0aHJlc2hvbGRcbiAgICBpZiAoY29uZmlnLnRva2VuVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLnRva2VuVGhyZXNob2xkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogdG9rZW5UaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1heCB0b2tlbnMgcGVyIGNodW5rIChmb3IgdG9rZW4tYmFzZWQgc3RyYXRlZ3kpXG4gICAgaWYgKGNvbmZpZy5tYXhUb2tlbnNQZXJDaHVuayAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5tYXhUb2tlbnNQZXJDaHVuayA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG1heFRva2Vuc1BlckNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvdmVybGFwIHRva2VucyAoZm9yIHRva2VuLWJhc2VkIGFuZCBoeWJyaWQgc3RyYXRlZ2llcylcbiAgICBpZiAoY29uZmlnLm92ZXJsYXBUb2tlbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbmZpZy5vdmVybGFwVG9rZW5zIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG92ZXJsYXBUb2tlbnMgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU1heFRva2VucyA9IGNvbmZpZy5tYXhUb2tlbnNQZXJDaHVuayB8fCAxMDAwMDA7IC8vIGRlZmF1bHQgbWF4IHRva2Vuc1xuICAgICAgaWYgKGNvbmZpZy5vdmVybGFwVG9rZW5zID49IGVmZmVjdGl2ZU1heFRva2Vucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG92ZXJsYXBUb2tlbnMgbXVzdCBiZSBsZXNzIHRoYW4gbWF4VG9rZW5zUGVyQ2h1bmsnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXggcGFnZXMgcGVyIGNodW5rIChmb3IgaHlicmlkIHN0cmF0ZWd5KVxuICAgIGlmIChjb25maWcubWF4UGFnZXNQZXJDaHVuayAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5tYXhQYWdlc1BlckNodW5rIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogbWF4UGFnZXNQZXJDaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGFyZ2V0IHRva2VucyBwZXIgY2h1bmsgKGZvciBoeWJyaWQgc3RyYXRlZ3kpXG4gICAgaWYgKGNvbmZpZy50YXJnZXRUb2tlbnNQZXJDaHVuayAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy50YXJnZXRUb2tlbnNQZXJDaHVuayA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IHRhcmdldFRva2Vuc1BlckNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXggY29uY3VycmVuY3lcbiAgICBpZiAoY29uZmlnLm1heENvbmN1cnJlbmN5ICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLm1heENvbmN1cnJlbmN5IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogbWF4Q29uY3VycmVuY3kgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1pbiBzdWNjZXNzIHRocmVzaG9sZFxuICAgIGlmIChjb25maWcubWluU3VjY2Vzc1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uZmlnLm1pblN1Y2Nlc3NUaHJlc2hvbGQgPCAwIHx8IGNvbmZpZy5taW5TdWNjZXNzVGhyZXNob2xkID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG1pblN1Y2Nlc3NUaHJlc2hvbGQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcCB1c2luZyBBbWF6b24gQmVkcm9jay5cbiAgICpcbiAgICogQ3JlYXRlcyBhIExhbWJkYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIGNvbmZpZ3VyZWQgQmVkcm9jayBtb2RlbCB0byBjbGFzc2lmeVxuICAgKiB0aGUgZG9jdW1lbnQgdHlwZS4gVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBkb2N1bWVudCBmcm9tIFMzIGFuZCBzZW5kcyBpdCB0b1xuICAgKiBCZWRyb2NrIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIHByb21wdC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIHJlc291cmNlcyxcbiAgICogYnV0IGNyZWF0ZXMgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgZWFjaCB0aW1lIHRvIGFsbG93IHByb3BlciBzdGF0ZSBjaGFpbmluZy5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb24gb25seSBvbmNlXG4gICAgaWYgKCF0aGlzLl9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5jbGFzc2lmaWNhdGlvblByb21wdCB8fCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLkRFRkFVTFRfQ0xBU1NJRklDQVRJT05fUFJPTVBUO1xuICAgICAgY29uc3QgYWRqdXN0ZWRNb2RlbElkID0gQmVkcm9ja01vZGVsVXRpbHMuZGVyaXZlQWN0dWFsTW9kZWxJZCh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5jbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCByb2xlID0gdGhpcy5nZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKCdDbGFzc2lmaWNhdGlvbkxhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5jbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICAgIGFjY291bnQsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2JlZHJvY2staWRwLWNsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcblxuICAgICAgdGhpcy5fY2xhc3NpZmljYXRpb25GdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQmVkcm9ja0NsYXNzaWZpY2F0aW9uRnVuY3Rpb24nLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMudW5pcXVlRnVuY3Rpb25OYW1lLFxuICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICAgIGVudHJ5OiB0aGlzLnJlc29sdmVCZWRyb2NrSW52b2tlRW50cnkoKSxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5zdGVwVGltZW91dHMgfHwgRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBNT0RFTF9JRDogYWRqdXN0ZWRNb2RlbElkLFxuICAgICAgICAgIFBST01QVDogcHJvbXB0LFxuICAgICAgICAgIElOVk9LRV9UWVBFOiBJbnZva2VUeXBlLkNMQVNTSUZJQ0FUSU9OLFxuICAgICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgdnBjOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB2cGNTdWJuZXRzOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2NsYXNzaWZpY2F0aW9uRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmspIHtcbiAgICAgICAgdGhpcy5fY2xhc3NpZmljYXRpb25GdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyBjcmVhdGUgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgdG8gYWxsb3cgcHJvcGVyIHN0YXRlIGNoYWluaW5nXG4gICAgY29uc3Qgc3RlcElkID0gYENsYXNzaWZpY2F0aW9uU3RlcC0ke3RoaXMuX2NsYXNzaWZpY2F0aW9uU3RlcENvdW50ZXJ9YDtcbiAgICB0aGlzLl9jbGFzc2lmaWNhdGlvblN0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ2RvY3VtZW50Q2xhc3NpZmljYXRpb24uJCc6ICckLlBheWxvYWQuZG9jdW1lbnRDbGFzc2lmaWNhdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIGRvY3VtZW50IGV4dHJhY3Rpb24gc3RlcCB1c2luZyBBbWF6b24gQmVkcm9jay5cbiAgICpcbiAgICogQ3JlYXRlcyBhIExhbWJkYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIGNvbmZpZ3VyZWQgQmVkcm9jayBtb2RlbCB0byBleHRyYWN0XG4gICAqIHN0cnVjdHVyZWQgZGF0YSBmcm9tIHRoZSBkb2N1bWVudC4gVXNlcyB0aGUgY2xhc3NpZmljYXRpb24gcmVzdWx0IGZyb20gdGhlXG4gICAqIHByZXZpb3VzIHN0ZXAgdG8gcHJvdmlkZSBjb250ZXh0IGZvciBtb3JlIGFjY3VyYXRlIGV4dHJhY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nIGR1cGxpY2F0ZSByZXNvdXJjZXMsXG4gICAqIGJ1dCBjcmVhdGVzIGEgbmV3IExhbWJkYUludm9rZSB0YXNrIGVhY2ggdGltZSB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGV4dHJhY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiBvbmx5IG9uY2VcbiAgICBpZiAoIXRoaXMuX3Byb2Nlc3NpbmdGdW5jdGlvbikge1xuICAgICAgY29uc3QgcHJvbXB0ID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ1Byb21wdCB8fCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLkRFRkFVTFRfUFJPQ0VTU0lOR19QUk9NUFQ7XG4gICAgICBjb25zdCBhZGp1c3RlZE1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnByb2Nlc3NpbmdCZWRyb2NrTW9kZWwpO1xuICAgICAgY29uc3Qgcm9sZSA9IHRoaXMuZ2VuZXJhdGVMYW1iZGFSb2xlRm9yQmVkcm9jaygnUHJvY2Vzc2luZ0xhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgICBhY2NvdW50LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdiZWRyb2NrLWlkcC1wcm9jZXNzaW5nJyxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG4gICAgICB0aGlzLl9wcm9jZXNzaW5nRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ0JlZHJvY2tFeHRyYWN0aW9uRnVuY3Rpb24nLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMudW5pcXVlRnVuY3Rpb25OYW1lLFxuICAgICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICAgIGVudHJ5OiB0aGlzLnJlc29sdmVCZWRyb2NrSW52b2tlRW50cnkoKSxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5zdGVwVGltZW91dHMgfHwgRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBNT0RFTF9JRDogYWRqdXN0ZWRNb2RlbElkLFxuICAgICAgICAgIFBST01QVDogcHJvbXB0LFxuICAgICAgICAgIElOVk9LRV9UWVBFOiBJbnZva2VUeXBlLlBST0NFU1NJTkcsXG4gICAgICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZ0Z1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyBjcmVhdGUgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgdG8gYWxsb3cgcHJvcGVyIHN0YXRlIGNoYWluaW5nXG4gICAgY29uc3Qgc3RlcElkID0gYFByb2Nlc3NpbmdTdGVwLSR7dGhpcy5fcHJvY2Vzc2luZ1N0ZXBDb3VudGVyfWA7XG4gICAgdGhpcy5fcHJvY2Vzc2luZ1N0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9wcm9jZXNzaW5nRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICdkb2N1bWVudENsYXNzaWZpY2F0aW9uLiQnOiAnJC5QYXlsb2FkLmRvY3VtZW50Q2xhc3NpZmljYXRpb24nLFxuICAgICAgICAncmVzdWx0LiQnOiAnJC5QYXlsb2FkLnJlc3VsdCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soaWQ6IHN0cmluZywgbW9kZWw/OiBCZWRyb2NrTW9kZWxQcm9wcykge1xuICAgIHJldHVybiBuZXcgUm9sZSh0aGlzLCBpZCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIEJlZHJvY2tJbnZva2VQb2xpY3k6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgLy8gUzMgcmVhZC1vbmx5IGFjY2VzcyBmb3IgZG9jdW1lbnQgcmV0cmlldmFsIC0gbGVhc3QgcHJpdmlsZWdlXG4gICAgICAgICAgICAuLi50aGlzLmluZ3Jlc3NBZGFwdGVyLmdlbmVyYXRlQWRhcHRlcklBTVBvbGljaWVzKCksXG4gICAgICAgICAgICBCZWRyb2NrTW9kZWxVdGlscy5nZW5lcmF0ZU1vZGVsSUFNUGVybWlzc2lvbnModGhpcywgbW9kZWwpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQmVkcm9ja0ludm9rZUVudHJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcC5cbiAgICpcbiAgICogSWYgYW4gZW5yaWNobWVudCBMYW1iZGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gdGhlIHByb3BzLCBjcmVhdGVzIGEgTGFtYmRhSW52b2tlXG4gICAqIHRhc2sgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgb24gdGhlIGV4dHJhY3RlZCBkYXRhLiBUaGlzIHN0ZXAgaXMgdXNlZnVsXG4gICAqIGZvciBkYXRhIHZhbGlkYXRpb24sIHRyYW5zZm9ybWF0aW9uLCBvciBpbnRlZ3JhdGlvbiB3aXRoIGV4dGVybmFsIHN5c3RlbXMuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciBlbnJpY2htZW50LCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcElkID0gYEVucmljaG1lbnRTdGVwLSR7dGhpcy5fZW5yaWNobWVudFN0ZXBDb3VudGVyfWA7XG4gICAgdGhpcy5fZW5yaWNobWVudFN0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgICBvdXRwdXRQYXRoOiAnJCcsXG4gICAgICBwYXlsb2FkUmVzcG9uc2VPbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIHBvc3QtcHJvY2Vzc2luZyBzdGVwLlxuICAgKlxuICAgKiBJZiBhIHBvc3QtcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gdGhlIHByb3BzLCBjcmVhdGVzIGEgTGFtYmRhSW52b2tlXG4gICAqIHRhc2sgdG8gcGVyZm9ybSBmaW5hbCBwcm9jZXNzaW5nIG9uIHRoZSB3b3JrZmxvdyByZXN1bHRzLiBUaGlzIHN0ZXAgaXMgdXNlZnVsIGZvclxuICAgKiBkYXRhIGZvcm1hdHRpbmcsIG5vdGlmaWNhdGlvbnMsIG9yIGludGVncmF0aW9uIHdpdGggZG93bnN0cmVhbSBzeXN0ZW1zLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgcG9zdC1wcm9jZXNzaW5nLCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwSWQgPSBgUG9zdFByb2Nlc3NpbmdTdGVwLSR7dGhpcy5fcG9zdFByb2Nlc3NpbmdTdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX3Bvc3RQcm9jZXNzaW5nU3RlcENvdW50ZXIrKztcblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsIHN0ZXBJZCwge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnBvc3RQcm9jZXNzaW5nTGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wb3N0UHJvY2Vzc2VkUmVzdWx0JyxcbiAgICAgIG91dHB1dFBhdGg6ICckJyxcbiAgICAgIHBheWxvYWRSZXNwb25zZU9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBwcmVwcm9jZXNzaW5nIHN0ZXAgZm9yIFBERiBjaHVua2luZy5cbiAgICpcbiAgICogV2hlbiBjaHVua2luZyBpcyBlbmFibGVkLCBjcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgYW5hbHl6ZXMgUERGcyBhbmRcbiAgICogc3BsaXRzIGxhcmdlIGRvY3VtZW50cyBpbnRvIG1hbmFnZWFibGUgY2h1bmtzLiBUaGUgZnVuY3Rpb246XG4gICAqIDEuIEFuYWx5emVzIHRoZSBQREYgdG8gZGV0ZXJtaW5lIHBhZ2UgY291bnQgYW5kIHRva2VuIGVzdGltYXRlc1xuICAgKiAyLiBEZWNpZGVzIGlmIGNodW5raW5nIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmVkIHRocmVzaG9sZHNcbiAgICogMy4gSWYgY2h1bmtpbmcgaXMgbmVlZGVkLCBzcGxpdHMgdGhlIFBERiBhbmQgdXBsb2FkcyBjaHVua3MgdG8gUzNcbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgZm9yIFBERiBhbmFseXNpcyBhbmQgY2h1bmtpbmcsIG9yIHVuZGVmaW5lZCBpZiBjaHVua2luZyBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBPbmx5IGVuYWJsZSBjaHVua2luZyBpZiBleHBsaWNpdGx5IGNvbmZpZ3VyZWRcbiAgICBpZiAoIXRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZUNodW5raW5nKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBjaHVua2luZ0NvbmZpZyA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNodW5raW5nQ29uZmlnIHx8IHt9O1xuXG4gICAgLy8gQ3JlYXRlIElBTSByb2xlIGZvciBjaHVua2luZyBMYW1iZGEgd2l0aCBsZWFzdCBwcml2aWxlZ2UgcGVybWlzc2lvbnNcbiAgICAvLyBDaHVua2luZyBMYW1iZGEgbmVlZHM6IEdldE9iamVjdCAocmVhZCByYXcgUERGcyksIFB1dE9iamVjdCAod3JpdGUgY2h1bmtzKVxuICAgIGNvbnN0IHJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnQ2h1bmtpbmdMYW1iZGFSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIENodW5raW5nUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2h1bmtpbmcnLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAvLyBDcmVhdGUgUERGIEFuYWx5c2lzICYgQ2h1bmtpbmcgTGFtYmRhXG4gICAgY29uc3QgY2h1bmtpbmdMYW1iZGEgPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ1BERkNodW5raW5nRnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL3BkZi1jaHVua2luZycpLFxuICAgICAgaW5kZXg6ICdoYW5kbGVyLnB5JyxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICByb2xlLFxuICAgICAgbWVtb3J5U2l6ZTogMjA0OCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQ0hVTktJTkdfU1RSQVRFR1k6IGNodW5raW5nQ29uZmlnLnN0cmF0ZWd5IHx8ICdoeWJyaWQnLFxuICAgICAgICBQQUdFX1RIUkVTSE9MRDogU3RyaW5nKGNodW5raW5nQ29uZmlnLnBhZ2VUaHJlc2hvbGQgfHwgMTAwKSxcbiAgICAgICAgVE9LRU5fVEhSRVNIT0xEOiBTdHJpbmcoY2h1bmtpbmdDb25maWcudG9rZW5UaHJlc2hvbGQgfHwgMTUwMDAwKSxcbiAgICAgICAgQ0hVTktfU0laRTogU3RyaW5nKGNodW5raW5nQ29uZmlnLmNodW5rU2l6ZSB8fCA1MCksXG4gICAgICAgIE9WRVJMQVBfUEFHRVM6IFN0cmluZyhjaHVua2luZ0NvbmZpZy5vdmVybGFwUGFnZXMgfHwgNSksXG4gICAgICAgIE1BWF9UT0tFTlNfUEVSX0NIVU5LOiBTdHJpbmcoY2h1bmtpbmdDb25maWcubWF4VG9rZW5zUGVyQ2h1bmsgfHwgMTAwMDAwKSxcbiAgICAgICAgT1ZFUkxBUF9UT0tFTlM6IFN0cmluZyhjaHVua2luZ0NvbmZpZy5vdmVybGFwVG9rZW5zIHx8IDUwMDApLFxuICAgICAgICBUQVJHRVRfVE9LRU5TX1BFUl9DSFVOSzogU3RyaW5nKGNodW5raW5nQ29uZmlnLnRhcmdldFRva2Vuc1BlckNodW5rIHx8IDgwMDAwKSxcbiAgICAgICAgTUFYX1BBR0VTX1BFUl9DSFVOSzogU3RyaW5nKGNodW5raW5nQ29uZmlnLm1heFBhZ2VzUGVyQ2h1bmsgfHwgOTkpLFxuICAgICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIHRoaXMubWV0cmljU2VydmljZU5hbWUsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICBjaHVua2luZ0xhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBjaHVua2luZ0xhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdQREZBbmFseXNpc0FuZENodW5raW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IGNodW5raW5nTGFtYmRhLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2h1bmtpbmdSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3JlcXVpcmVzQ2h1bmtpbmcuJCc6ICckLlBheWxvYWQucmVxdWlyZXNDaHVua2luZycsXG4gICAgICAgICd0b2tlbkFuYWx5c2lzLiQnOiAnJC5QYXlsb2FkLnRva2VuQW5hbHlzaXMnLFxuICAgICAgICAnc3RyYXRlZ3kuJCc6ICckLlBheWxvYWQuc3RyYXRlZ3knLFxuICAgICAgICAnY2h1bmtzLiQnOiAnJC5QYXlsb2FkLmNodW5rcycsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFkZGl0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGZvciBjaHVua2luZyB0byBiZSBzdG9yZWQgaW4gRHluYW1vREIuXG4gICAqXG4gICAqIFdoZW4gY2h1bmtpbmcgaXMgZW5hYmxlZCwgYWRkcyBmaWVsZHMgZm9yOlxuICAgKiAtIENodW5raW5nRW5hYmxlZDogc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2xlYW4gZmxhZ1xuICAgKiAtIENodW5raW5nU3RyYXRlZ3k6IHN0cmF0ZWd5IHVzZWQgKGZpeGVkLXBhZ2VzLCB0b2tlbi1iYXNlZCwgaHlicmlkKVxuICAgKiAtIFRva2VuQW5hbHlzaXM6IEpTT04gc3RyaW5nIHdpdGggdG9rZW4gYW5hbHlzaXMgcmVzdWx0c1xuICAgKiAtIENodW5rTWV0YWRhdGE6IEpTT04gc3RyaW5nIGFycmF5IHdpdGggY2h1bmsgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQHJldHVybnMgUmVjb3JkIG9mIER5bmFtb0RCIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGNodW5raW5nIG1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVDaHVua2luZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBDaHVua2luZ0VuYWJsZWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoXG4gICAgICAgIEpzb25QYXRoLnN0cmluZ0F0KCdTdGF0ZXMuRm9ybWF0KFxcJ3t9XFwnLCAkLmNodW5raW5nUmVzdWx0LnJlcXVpcmVzQ2h1bmtpbmcpJyksXG4gICAgICApLFxuICAgICAgQ2h1bmtpbmdTdHJhdGVneTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhcbiAgICAgICAgSnNvblBhdGguc3RyaW5nQXQoJyQuY2h1bmtpbmdSZXN1bHQuc3RyYXRlZ3knKSxcbiAgICAgICksXG4gICAgICBUb2tlbkFuYWx5c2lzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2h1bmtpbmdSZXN1bHQudG9rZW5BbmFseXNpcycpKSxcbiAgICAgICksXG4gICAgICBDaHVua01ldGFkYXRhOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzJykpLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByb2Nlc3Npbmcgd29ya2Zsb3cgd2l0aCBjb25kaXRpb25hbCBicmFuY2hpbmcgZm9yIGNodW5rZWQgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBXaGVuIGNodW5raW5nIGlzIGVuYWJsZWQsIGNyZWF0ZXMgYSBDaG9pY2UgU3RhdGUgdGhhdDpcbiAgICogLSBSb3V0ZXMgdG8gY2h1bmtlZCBwcm9jZXNzaW5nIGZsb3cgaWYgZG9jdW1lbnQgd2FzIGNodW5rZWRcbiAgICogLSBSb3V0ZXMgdG8gc3RhbmRhcmQgcHJvY2Vzc2luZyBmbG93IGlmIGRvY3VtZW50IHdhcyBub3QgY2h1bmtlZFxuICAgKlxuICAgKiBXaGVuIGNodW5raW5nIGlzIGRpc2FibGVkLCByZXR1cm5zIHRoZSBzdGFuZGFyZCBwcm9jZXNzaW5nIHdvcmtmbG93LlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyBjaGFpbiBmb3IgcHJvY2Vzc2luZyB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKTogSUNoYWluYWJsZSB7XG4gICAgLy8gSWYgY2h1bmtpbmcgaXMgbm90IGVuYWJsZWQsIHVzZSBzdGFuZGFyZCB3b3JrZmxvd1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlQ2h1bmtpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENob2ljZSBTdGF0ZSB0byBjaGVjayBpZiBjaHVua2luZyB3YXMgYXBwbGllZFxuICAgIGNvbnN0IGNob2ljZVN0YXRlID0gbmV3IENob2ljZSh0aGlzLCAnQ2hlY2tJZkNodW5rZWQnKTtcblxuICAgIGNob2ljZVN0YXRlXG4gICAgICAud2hlbihcbiAgICAgICAgQ29uZGl0aW9uLmJvb2xlYW5FcXVhbHMoJyQuY2h1bmtpbmdSZXN1bHQucmVxdWlyZXNDaHVua2luZycsIHRydWUpLFxuICAgICAgICB0aGlzLmNyZWF0ZUNodW5rZWRQcm9jZXNzaW5nRmxvdygpLFxuICAgICAgKVxuICAgICAgLm90aGVyd2lzZShcbiAgICAgICAgLy8gUGFzcyAnU3RhbmRhcmQnIHByZWZpeCB0byBhdm9pZCBjb25zdHJ1Y3QgSUQgY29sbGlzaW9ucyB3aXRoIGNodW5rZWQgZmxvd1xuICAgICAgICB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCdTdGFuZGFyZCcpLFxuICAgICAgKTtcblxuICAgIHJldHVybiBjaG9pY2VTdGF0ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGNodW5rZWQgcHJvY2Vzc2luZyBmbG93IGZvciBsYXJnZSBkb2N1bWVudHMuXG4gICAqXG4gICAqIFRoaXMgZmxvdzpcbiAgICogMS4gVXNlcyBhIE1hcCBTdGF0ZSB0byBwcm9jZXNzIGVhY2ggY2h1bmsgaW4gcGFyYWxsZWwgKG9yIHNlcXVlbnRpYWxseSlcbiAgICogMi4gRWFjaCBjaHVuayBnb2VzIHRocm91Z2ggY2xhc3NpZmljYXRpb24gYW5kIHByb2Nlc3NpbmdcbiAgICogMy4gUmVzdWx0cyBhcmUgYWdncmVnYXRlZCB1c2luZyB0aGUgYWdncmVnYXRpb24gTGFtYmRhXG4gICAqIDQuIER5bmFtb0RCIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWdncmVnYXRlZCByZXN1bHRcbiAgICogNS4gVGVtcG9yYXJ5IGNodW5rcyBhcmUgY2xlYW5lZCB1cCBmcm9tIFMzXG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIGNoYWluIGZvciBjaHVua2VkIGRvY3VtZW50IHByb2Nlc3NpbmdcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2h1bmtlZFByb2Nlc3NpbmdGbG93KCk6IElDaGFpbmFibGUge1xuICAgIGNvbnN0IGNodW5raW5nQ29uZmlnID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuY2h1bmtpbmdDb25maWcgfHwge307XG4gICAgY29uc3QgbWF4Q29uY3VycmVuY3kgPSBjaHVua2luZ0NvbmZpZy5wcm9jZXNzaW5nTW9kZSA9PT0gJ3NlcXVlbnRpYWwnXG4gICAgICA/IDFcbiAgICAgIDogKGNodW5raW5nQ29uZmlnLm1heENvbmN1cnJlbmN5IHx8IDEwKTtcblxuICAgIC8vIENyZWF0ZSBNYXAgU3RhdGUgZm9yIHByb2Nlc3NpbmcgY2h1bmtzXG4gICAgY29uc3QgbWFwU3RhdGUgPSBuZXcgTWFwKHRoaXMsICdQcm9jZXNzQ2h1bmtzJywge1xuICAgICAgaXRlbXNQYXRoOiAnJC5jaHVua2luZ1Jlc3VsdC5jaHVua3MnLFxuICAgICAgbWF4Q29uY3VycmVuY3ksXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICdkb2N1bWVudElkLiQnOiAnJC5kb2N1bWVudElkJyxcbiAgICAgICAgJ2NodW5rLiQnOiAnJCQuTWFwLkl0ZW0uVmFsdWUnLFxuICAgICAgICAnY2h1bmtJbmRleC4kJzogJyQkLk1hcC5JdGVtLkluZGV4JyxcbiAgICAgICAgJ3RvdGFsQ2h1bmtzLiQnOiAnU3RhdGVzLkFycmF5TGVuZ3RoKCQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzKScsXG4gICAgICAgIC8vIE92ZXJyaWRlIGNvbnRlbnQgdG8gcG9pbnQgdG8gdGhlIGNodW5rIFBERiwgbm90IHRoZSBvcmlnaW5hbCBkb2N1bWVudFxuICAgICAgICAnY29udGVudCc6IHtcbiAgICAgICAgICAnbG9jYXRpb24nOiAnczMnLFxuICAgICAgICAgICdidWNrZXQuJCc6ICckJC5NYXAuSXRlbS5WYWx1ZS5idWNrZXQnLFxuICAgICAgICAgICdrZXkuJCc6ICckJC5NYXAuSXRlbS5WYWx1ZS5rZXknLFxuICAgICAgICAgICdmaWxlbmFtZS4kJzogJyQuY29udGVudC5maWxlbmFtZScsXG4gICAgICAgIH0sXG4gICAgICAgICdjb250ZW50VHlwZS4kJzogJyQuY29udGVudFR5cGUnLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNodW5rUmVzdWx0cycsXG4gICAgfSk7XG5cbiAgICAvLyBEZWZpbmUgcGVyLWNodW5rIHByb2Nlc3Npbmc6IGNsYXNzaWZpY2F0aW9uIOKGkiBwcm9jZXNzaW5nXG4gICAgY29uc3QgY2h1bmtDbGFzc2lmaWNhdGlvbiA9IHRoaXMuY2xhc3NpZmljYXRpb25TdGVwKCk7XG4gICAgY29uc3QgY2h1bmtQcm9jZXNzaW5nID0gdGhpcy5wcm9jZXNzaW5nU3RlcCgpO1xuXG4gICAgbWFwU3RhdGUuaXRlbVByb2Nlc3NvcihcbiAgICAgIGNodW5rQ2xhc3NpZmljYXRpb24ubmV4dChjaHVua1Byb2Nlc3NpbmcpLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYWdncmVnYXRpb24gc3RlcCAoTGFtYmRhIGludm9rZSBvbmx5LCBub3JtYWxpemF0aW9uIGFkZGVkIHNlcGFyYXRlbHkpXG4gICAgY29uc3QgYWdncmVnYXRpb25MYW1iZGFTdGVwID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGlvblN0ZXAoKTtcblxuICAgIC8vIEFkZCBhIFBhc3Mgc3RhdGUgdG8gbm9ybWFsaXplIHRoZSBhZ2dyZWdhdGVkIHJlc3VsdCBmb3IgZG93bnN0cmVhbSBjb21wYXRpYmlsaXR5XG4gICAgLy8gVGhpcyBjb3BpZXMgYWdncmVnYXRlZFJlc3VsdCB0byBwcm9jZXNzaW5nUmVzdWx0IHNvIGVucmljaG1lbnQvcG9zdC1wcm9jZXNzaW5nXG4gICAgLy8gc2VlIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGNodW5raW5nIHdhcyB1c2VkXG4gICAgY29uc3Qgbm9ybWFsaXplU3RhdGUgPSBuZXcgUGFzcyh0aGlzLCAnTm9ybWFsaXplQWdncmVnYXRlZFJlc3VsdCcsIHtcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgJ2RvY3VtZW50SWQuJCc6ICckLmRvY3VtZW50SWQnLFxuICAgICAgICAnY29udGVudFR5cGUuJCc6ICckLmNvbnRlbnRUeXBlJyxcbiAgICAgICAgJ2NvbnRlbnQuJCc6ICckLmNvbnRlbnQnLFxuICAgICAgICAnY2h1bmtpbmdSZXN1bHQuJCc6ICckLmNodW5raW5nUmVzdWx0JyxcbiAgICAgICAgJ2NodW5rUmVzdWx0cy4kJzogJyQuY2h1bmtSZXN1bHRzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0ZWRSZXN1bHQuJCc6ICckLmFnZ3JlZ2F0ZWRSZXN1bHQnLFxuICAgICAgICAvLyBDb3B5IGFnZ3JlZ2F0ZWQgcmVzdWx0IHRvIHByb2Nlc3NpbmdSZXN1bHQgZm9yIGRvd25zdHJlYW0gY29tcGF0aWJpbGl0eVxuICAgICAgICAncHJvY2Vzc2luZ1Jlc3VsdCc6IHtcbiAgICAgICAgICAncmVzdWx0LiQnOiAnJC5hZ2dyZWdhdGVkUmVzdWx0LnJlc3VsdCcsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEFsc28gc2V0IGNsYXNzaWZpY2F0aW9uUmVzdWx0IGZyb20gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgY2h1bmsgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICdjbGFzc2lmaWNhdGlvblJlc3VsdC4kJzogJyQuY2h1bmtSZXN1bHRzWzBdLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgRHluYW1vREIgdXBkYXRlIHN0ZXAgZm9yIGFnZ3JlZ2F0ZWQgcmVzdWx0XG4gICAgY29uc3QgdXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXAgPSB0aGlzLmNyZWF0ZVVwZGF0ZUFnZ3JlZ2F0ZWRSZXN1bHRTdGVwKCk7XG5cbiAgICAvLyBDcmVhdGUgY2xlYW51cCBzdGVwXG4gICAgY29uc3QgY2xlYW51cFN0ZXAgPSB0aGlzLmNyZWF0ZUNsZWFudXBTdGVwKCk7XG5cbiAgICAvLyBDcmVhdGUgbW92ZSB0byBwcm9jZXNzZWQgY2hhaW4gd2l0aCAnQ2h1bmtlZCcgcHJlZml4IHRvIGF2b2lkIElEIGNvbGxpc2lvbnNcbiAgICBjb25zdCBtb3ZlVG9Qcm9jZXNzZWQgPSB0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZVN1Y2Nlc3NDaGFpbih0aGlzLCAnQ2h1bmtlZCcpO1xuXG4gICAgLy8gQ3JlYXRlIGVycm9yIGhhbmRsZXIgZm9yIGFnZ3JlZ2F0aW9uIGZhaWx1cmVzXG4gICAgY29uc3QgYWdncmVnYXRpb25FcnJvckhhbmRsZXIgPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyKCk7XG5cbiAgICAvLyBHZXQgb3B0aW9uYWwgZW5yaWNobWVudCBhbmQgcG9zdC1wcm9jZXNzaW5nIHN0ZXBzXG4gICAgY29uc3QgZW5yaWNobWVudFN0ZXAgPSB0aGlzLmVucmljaG1lbnRTdGVwKCk7XG4gICAgY29uc3QgcG9zdFByb2Nlc3NpbmdTdGVwID0gdGhpcy5wb3N0UHJvY2Vzc2luZ1N0ZXAoKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBmaW5hbCBjaGFpbiBhZnRlciBhZ2dyZWdhdGlvblxuICAgIC8vIENoYWluOiBNYXAgU3RhdGUg4oaSIEFnZ3JlZ2F0aW9uIOKGkiBEeW5hbW9EQiBVcGRhdGUg4oaSIFtFbnJpY2htZW50XSDihpIgW1Bvc3RQcm9jZXNzaW5nXSDihpIgQ2xlYW51cCDihpIgTW92ZSB0byBQcm9jZXNzZWRcbiAgICBsZXQgZmluYWxDaGFpbjogSUNoYWluYWJsZSA9IGNsZWFudXBTdGVwXG4gICAgICAuYWRkUmV0cnkoe1xuICAgICAgICBlcnJvcnM6IFsnTGFtYmRhLlNlcnZpY2VFeGNlcHRpb24nLCAnTGFtYmRhLlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiddLFxuICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXG4gICAgICAgIGJhY2tvZmZSYXRlOiAyLFxuICAgICAgfSlcbiAgICAgIC5uZXh0KG1vdmVUb1Byb2Nlc3NlZCk7XG5cbiAgICAvLyBBZGQgcG9zdC1wcm9jZXNzaW5nIGlmIHByb3ZpZGVkIChpbnNlcnQgYmVmb3JlIGNsZWFudXApXG4gICAgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgY29uc3QgcG9zdFByb2Nlc3NpbmdFcnJvckhhbmRsZXIgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZFBvc3RQcm9jZXNzaW5nRmFpbEREQlVwZGF0ZScsIHtcbiAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgIGtleToge1xuICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctZmFpbHVyZScpLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSkubmV4dCh0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMsICdDaHVua2VkUG9zdFByb2MnKSk7XG5cbiAgICAgIGZpbmFsQ2hhaW4gPSBwb3N0UHJvY2Vzc2luZ1N0ZXBcbiAgICAgICAgLmFkZENhdGNoKHBvc3RQcm9jZXNzaW5nRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSlcbiAgICAgICAgLm5leHQoXG4gICAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ0NodW5rZWRQb3N0UHJvY2Vzc2luZ1N1Y2Nlc3NVcGRhdGUnLCB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIFBvc3RQcm9jZXNzaW5nUmVzdWx0ID0gOnBvc3RQcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctY29tcGxldGUnKSxcbiAgICAgICAgICAgICAgJzpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLnBvc3RQcm9jZXNzZWRSZXN1bHQnKSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgICAgfSkubmV4dChmaW5hbENoYWluKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZW5yaWNobWVudCBpZiBwcm92aWRlZCAoaW5zZXJ0IGJlZm9yZSBwb3N0LXByb2Nlc3Npbmcgb3IgY2xlYW51cClcbiAgICBpZiAoZW5yaWNobWVudFN0ZXApIHtcbiAgICAgIGNvbnN0IGVucmljaG1lbnRFcnJvckhhbmRsZXIgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZEVucmljaG1lbnRGYWlsRERCVXBkYXRlJywge1xuICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAga2V5OiB7XG4gICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2VucmljaG1lbnQtZmFpbHVyZScpLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSkubmV4dCh0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMsICdDaHVua2VkRW5yaWNoJykpO1xuXG4gICAgICBmaW5hbENoYWluID0gZW5yaWNobWVudFN0ZXBcbiAgICAgICAgLmFkZENhdGNoKGVucmljaG1lbnRFcnJvckhhbmRsZXIsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICB9KVxuICAgICAgICAubmV4dChcbiAgICAgICAgICBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZEVucmljaG1lbnRTdWNjZXNzVXBkYXRlJywge1xuICAgICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzLCBFbnJpY2htZW50UmVzdWx0ID0gOmVucmljaG1lbnRSZXN1bHQnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IHBvc3RQcm9jZXNzaW5nU3RlcFxuICAgICAgICAgICAgICAgID8gRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygnZW5yaWNobWVudC1jb21wbGV0ZScpXG4gICAgICAgICAgICAgICAgOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgICAgICAnOmVucmljaG1lbnRSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5lbnJpY2hlZFJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KS5uZXh0KGZpbmFsQ2hhaW4pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENoYWluOiBNYXAgU3RhdGUg4oaSIEFnZ3JlZ2F0aW9uIOKGkiBOb3JtYWxpemUg4oaSIER5bmFtb0RCIFVwZGF0ZSDihpIgW0VucmljaG1lbnRdIOKGkiBbUG9zdFByb2Nlc3NpbmddIOKGkiBDbGVhbnVwIOKGkiBNb3ZlIHRvIFByb2Nlc3NlZFxuICAgIHJldHVybiBtYXBTdGF0ZVxuICAgICAgLmFkZENhdGNoKGFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgIHJlc3VsdFBhdGg6ICckLmVycm9yJyxcbiAgICAgIH0pXG4gICAgICAubmV4dChcbiAgICAgICAgYWdncmVnYXRpb25MYW1iZGFTdGVwXG4gICAgICAgICAgLmFkZENhdGNoKGFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgICAgICByZXN1bHRQYXRoOiAnJC5lcnJvcicsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYWRkUmV0cnkoe1xuICAgICAgICAgICAgZXJyb3JzOiBbJ0xhbWJkYS5TZXJ2aWNlRXhjZXB0aW9uJywgJ0xhbWJkYS5Ub29NYW55UmVxdWVzdHNFeGNlcHRpb24nXSxcbiAgICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXG4gICAgICAgICAgICBiYWNrb2ZmUmF0ZTogMixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5uZXh0KFxuICAgICAgICAgICAgbm9ybWFsaXplU3RhdGUubmV4dChcbiAgICAgICAgICAgICAgdXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXBcbiAgICAgICAgICAgICAgICAuYWRkUmV0cnkoe1xuICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbJ0R5bmFtb0RCLlByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkRXhjZXB0aW9uJ10sXG4gICAgICAgICAgICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygxKSxcbiAgICAgICAgICAgICAgICAgIG1heEF0dGVtcHRzOiAzLFxuICAgICAgICAgICAgICAgICAgYmFja29mZlJhdGU6IDIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAubmV4dChmaW5hbENoYWluKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYWdncmVnYXRpb24gc3RlcCBmb3IgY29tYmluaW5nIGNodW5rIHJlc3VsdHMgdXNpbmcgQmVkcm9jay5cbiAgICpcbiAgICogVXNlcyB0aGUgc2FtZSBCZWRyb2NrIGludm9rZSBMYW1iZGEgcGF0dGVybiBhcyB0aGUgcHJvY2Vzc2luZyBzdGVwIGJ1dCB3aXRoXG4gICAqIGEgZGlmZmVyZW50IHByb21wdCBkZXNpZ25lZCBmb3IgYWdncmVnYXRpbmcgbXVsdGlwbGUgY2h1bmsgcmVzdWx0cy5cbiAgICogVGhlIGNodW5rIHByb2Nlc3NpbmcgcmVzdWx0cyBhcmUgcGFzc2VkIGFzIHRleHQgZGF0YSB0byB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciByZXN1bHQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRpb25TdGVwKCk6IExhbWJkYUludm9rZSB7XG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiBvbmx5IG9uY2UgKHJldXNlcyBiZWRyb2NrLWludm9rZSBwYXR0ZXJuKVxuICAgIGlmICghdGhpcy5fYWdncmVnYXRpb25GdW5jdGlvbikge1xuICAgICAgY29uc3QgcHJvbXB0ID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuYWdncmVnYXRpb25Qcm9tcHQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX0FHR1JFR0FUSU9OX1BST01QVDtcbiAgICAgIGNvbnN0IGFkanVzdGVkTW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ0JlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCByb2xlID0gdGhpcy5nZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKCdBZ2dyZWdhdGlvbkxhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgICBhY2NvdW50LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdiZWRyb2NrLWlkcC1hZ2dyZWdhdGlvbicsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ0JlZHJvY2tBZ2dyZWdhdGlvbkZ1bmN0aW9uJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgICBlbnRyeTogdGhpcy5yZXNvbHZlQmVkcm9ja0ludm9rZUVudHJ5KCksXG4gICAgICAgIHJvbGUsXG4gICAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIE1PREVMX0lEOiBhZGp1c3RlZE1vZGVsSWQsXG4gICAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgICAgSU5WT0tFX1RZUEU6IEludm9rZVR5cGUuQUdHUkVHQVRJT04sXG4gICAgICAgICAgSU5WT0tFX01BWF9UT0tFTlM6ICc2NDAwMCcsIC8vIEFnZ3JlZ2F0aW9uIG1heSBuZWVkIG1vcmUgdG9rZW5zIGZvciBtZXJnZWQgb3V0cHV0XG4gICAgICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fYWdncmVnYXRpb25GdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9hZ2dyZWdhdGlvbkZ1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGNyZWF0ZSBhIG5ldyBMYW1iZGFJbnZva2UgdGFzayB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmdcbiAgICBjb25zdCBzdGVwSWQgPSBgQWdncmVnYXRpb25TdGVwLSR7dGhpcy5fYWdncmVnYXRpb25TdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uU3RlcENvdW50ZXIrKztcblxuICAgIC8vIFBhc3MgY2h1bmsgcmVzdWx0cyBhcyBkYXRhIGNvbnRlbnQgLSB0aGUgTGFtYmRhIHdpbGwgZm9ybWF0IHRoZW0gZm9yIEJlZHJvY2tcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9hZ2dyZWdhdGlvbkZ1bmN0aW9uLFxuICAgICAgcGF5bG9hZDogVGFza0lucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAnZG9jdW1lbnRJZC4kJzogJyQuZG9jdW1lbnRJZCcsXG4gICAgICAgICdjb250ZW50VHlwZSc6ICdkYXRhJyxcbiAgICAgICAgJ2NvbnRlbnQnOiB7XG4gICAgICAgICAgLy8gUGFzcyB0aGUgY2h1bmsgcmVzdWx0cyBhcyBKU09OIHN0cmluZyBmb3IgdGhlIExhbWJkYSB0byBwcm9jZXNzXG4gICAgICAgICAgJ2RhdGEuJCc6ICdTdGF0ZXMuSnNvblRvU3RyaW5nKCQuY2h1bmtSZXN1bHRzKScsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIC8vIFN0b3JlIGluIGJvdGggYWdncmVnYXRlZFJlc3VsdCBBTkQgcHJvY2Vzc2luZ1Jlc3VsdCBmb3IgY29uc2lzdGVuY3kgd2l0aCBub24tY2h1bmtlZCBmbG93XG4gICAgICAvLyBUaGlzIGFsbG93cyBlbnJpY2htZW50L3Bvc3QtcHJvY2Vzc2luZyBzdGVwcyB0byB1c2UgJC5wcm9jZXNzaW5nUmVzdWx0IHJlZ2FyZGxlc3Mgb2YgY2h1bmtpbmdcbiAgICAgIHJlc3VsdFBhdGg6ICckLmFnZ3JlZ2F0ZWRSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3Jlc3VsdC4kJzogJyQuUGF5bG9hZC5yZXN1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBEeW5hbW9EQiB1cGRhdGUgc3RlcCBmb3Igc3RvcmluZyBhZ2dyZWdhdGVkIHJlc3VsdHMuXG4gICAqXG4gICAqIFVwZGF0ZXMgdGhlIGRvY3VtZW50IHJlY29yZCB3aXRoOlxuICAgKiAtIEFnZ3JlZ2F0ZWRSZXN1bHQ6IEpTT04gc3RyaW5nIHdpdGggY2xhc3NpZmljYXRpb24sIGVudGl0aWVzLCBhbmQgc3VtbWFyeVxuICAgKiAtIFdvcmtmbG93U3RhdHVzOiAnY29tcGxldGUnXG4gICAqXG4gICAqIEByZXR1cm5zIER5bmFtb1VwZGF0ZUl0ZW0gdGFzayBmb3Igc3RvcmluZyBhZ2dyZWdhdGVkIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXAoKTogRHluYW1vVXBkYXRlSXRlbSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdTdG9yZUFnZ3JlZ2F0ZWRSZXN1bHQnLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGtleToge1xuICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICB9LFxuICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBBZ2dyZWdhdGVkUmVzdWx0ID0gOnJlc3VsdCwgV29ya2Zsb3dTdGF0dXMgPSA6c3RhdHVzJyxcbiAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgJzpyZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICAgIEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5hZ2dyZWdhdGVkUmVzdWx0JykpLFxuICAgICAgICApLFxuICAgICAgICAnOnN0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NvbXBsZXRlJyksXG4gICAgICB9LFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBjbGVhbnVwIExhbWJkYSBzdGVwIGZvciByZW1vdmluZyB0ZW1wb3JhcnkgY2h1bmsgZmlsZXMuXG4gICAqXG4gICAqIFRoZSBjbGVhbnVwIExhbWJkYTpcbiAgICogLSBEZWxldGVzIGFsbCBjaHVuayBmaWxlcyBmcm9tIFMzIGNodW5rcy8gcHJlZml4XG4gICAqIC0gVXNlcyBiYXRjaCBkZWxldGUgZm9yIGVmZmljaWVuY3kgKHVwIHRvIDEwMDAgb2JqZWN0cyBwZXIgcmVxdWVzdClcbiAgICogLSBMb2dzIGVycm9ycyBidXQgZG9lc24ndCBmYWlsIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgY2h1bmsgY2xlYW51cFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwU3RlcCgpOiBMYW1iZGFJbnZva2Uge1xuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb24gb25seSBvbmNlXG4gICAgaWYgKCF0aGlzLl9jbGVhbnVwRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3Qgcm9sZSA9IG5ldyBSb2xlKHRoaXMsICdDbGVhbnVwTGFtYmRhUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICBDbGVhbnVwUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICAvLyBTMyBhY2Nlc3MgZm9yIGRlbGV0aW5nIGNodW5rcyBvbmx5IC0gbGVhc3QgcHJpdmlsZWdlXG4gICAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoWydzMzpEZWxldGVPYmplY3QnXSwgdHJ1ZSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2xlYW51cCcsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAgIHRoaXMuX2NsZWFudXBGdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQ2xlYW51cEZ1bmN0aW9uJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvY2xlYW51cCcpLFxuICAgICAgICBpbmRleDogJ2hhbmRsZXIucHknLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgdnBjOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB2cGNTdWJuZXRzOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXBGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9jbGVhbnVwRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnQ2xlYW51cENodW5rcycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9jbGVhbnVwRnVuY3Rpb24sXG4gICAgICBwYXlsb2FkOiBUYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICdkb2N1bWVudElkLiQnOiAnJC5kb2N1bWVudElkJyxcbiAgICAgICAgJ2NodW5rcy4kJzogJyQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzJyxcbiAgICAgIH0pLFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBoYW5kbGVyIGZvciBhZ2dyZWdhdGlvbiBmYWlsdXJlcy5cbiAgICpcbiAgICogV2hlbiBhZ2dyZWdhdGlvbiBmYWlsczpcbiAgICogLSBVcGRhdGVzIER5bmFtb0RCIHdpdGggJ2FnZ3JlZ2F0aW9uLWZhaWx1cmUnIHN0YXR1c1xuICAgKiAtIE1vdmVzIGRvY3VtZW50IHRvIGZhaWxlZC8gcHJlZml4XG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIGNoYWluIGZvciBoYW5kbGluZyBhZ2dyZWdhdGlvbiBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRpb25FcnJvckhhbmRsZXIoKTogSUNoYWluYWJsZSB7XG4gICAgY29uc3QgdXBkYXRlRmFpbHVyZVN0YXR1cyA9IG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdBZ2dyZWdhdGlvbkZhaWxEREJVcGRhdGUnLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGtleToge1xuICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICB9LFxuICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2FnZ3JlZ2F0aW9uLWZhaWx1cmUnKSxcbiAgICAgIH0sXG4gICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgIH0pO1xuXG4gICAgLy8gVXNlICdDaHVua2VkJyBwcmVmaXggdG8gYXZvaWQgSUQgY29sbGlzaW9ucyB3aXRoIHN0YW5kYXJkIHdvcmtmbG93XG4gICAgY29uc3QgbW92ZVRvRmFpbGVkID0gdGhpcy5pbmdyZXNzQWRhcHRlci5jcmVhdGVGYWlsZWRDaGFpbih0aGlzLCAnQ2h1bmtlZCcpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZUZhaWx1cmVTdGF0dXMubmV4dChtb3ZlVG9GYWlsZWQpO1xuICB9XG59XG4iXX0=
@@ -9,6 +9,6 @@ class DefaultDocumentProcessingConfig {
9
9
  }
10
10
  exports.DefaultDocumentProcessingConfig = DefaultDocumentProcessingConfig;
11
11
  _a = JSII_RTTI_SYMBOL_1;
12
- DefaultDocumentProcessingConfig[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DefaultDocumentProcessingConfig", version: "1.16.0" };
12
+ DefaultDocumentProcessingConfig[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DefaultDocumentProcessingConfig", version: "1.17.0" };
13
13
  DefaultDocumentProcessingConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = 'document-processing';
14
14
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kb2N1bWVudC1wcm9jZXNzaW5nLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3VzZS1jYXNlcy9kb2N1bWVudC1wcm9jZXNzaW5nL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLE1BQWEsK0JBQStCOztBQUE1QywwRUFFQzs7O0FBRHdCLHFFQUFxQyxHQUFHLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdERvY3VtZW50UHJvY2Vzc2luZ0NvbmZpZyB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9PQlNFUlZBQklMSVRZX01FVFJJQ19TVkNfTkFNRSA9ICdkb2N1bWVudC1wcm9jZXNzaW5nJztcbn0iXX0=
@@ -1,6 +1,8 @@
1
1
  export * from './base-document-processing';
2
2
  export * from './bedrock-document-processing';
3
3
  export * from './agentic-document-processing';
4
+ export * from './localstack-bedrock-document-processing';
5
+ export * from './localstack-agentic-document-processing';
4
6
  export * from './adapter';
5
7
  export * from './default-document-processing-config';
6
8
  export * from './chunking-config';
@@ -17,7 +17,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./base-document-processing"), exports);
18
18
  __exportStar(require("./bedrock-document-processing"), exports);
19
19
  __exportStar(require("./agentic-document-processing"), exports);
20
+ __exportStar(require("./localstack-bedrock-document-processing"), exports);
21
+ __exportStar(require("./localstack-agentic-document-processing"), exports);
20
22
  __exportStar(require("./adapter"), exports);
21
23
  __exportStar(require("./default-document-processing-config"), exports);
22
24
  __exportStar(require("./chunking-config"), exports);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTJDO0FBQzNDLGdFQUE4QztBQUM5QyxnRUFBOEM7QUFDOUMsNENBQTBCO0FBQzFCLHVFQUFxRDtBQUNyRCxvREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Jhc2UtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0LWRvY3VtZW50LXByb2Nlc3NpbmctY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY2h1bmtpbmctY29uZmlnJzsiXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTJDO0FBQzNDLGdFQUE4QztBQUM5QyxnRUFBOEM7QUFDOUMsMkVBQXlEO0FBQ3pELDJFQUF5RDtBQUN6RCw0Q0FBMEI7QUFDMUIsdUVBQXFEO0FBQ3JELG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYWxzdGFjay1iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhbHN0YWNrLWFnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0LWRvY3VtZW50LXByb2Nlc3NpbmctY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY2h1bmtpbmctY29uZmlnJztcbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { Construct } from 'constructs';
2
+ import { AgenticDocumentProcessing, AgenticDocumentProcessingProps } from './agentic-document-processing';
3
+ import { DocumentProcessingStepType } from './base-document-processing';
4
+ import { LocalStackEndpointOverrides } from '../framework/localstack';
5
+ export interface LocalStackAgenticDocumentProcessingProps extends AgenticDocumentProcessingProps {
6
+ /**
7
+ * LocalStack endpoint routing configuration for Lambda runtime SDK calls.
8
+ *
9
+ * @default { enabled: true }
10
+ */
11
+ readonly localStack?: LocalStackEndpointOverrides;
12
+ }
13
+ export declare class LocalStackAgenticDocumentProcessing extends AgenticDocumentProcessing {
14
+ private _localStackBatchAgent?;
15
+ private _localStackProcessingStepCounter?;
16
+ constructor(scope: Construct, id: string, props: LocalStackAgenticDocumentProcessingProps);
17
+ protected resolveBedrockInvokeEntry(): string;
18
+ protected processingStep(): DocumentProcessingStepType;
19
+ private applyLocalStackEnvironment;
20
+ }