@cdklabs/cdk-appmod-catalog-blueprints 1.17.0 → 1.17.1

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 (52) hide show
  1. package/.jsii +5 -5
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +39 -5
  3. package/lib/document-processing/agentic-document-processing.js +6 -4
  4. package/lib/document-processing/base-document-processing.js +16 -4
  5. package/lib/document-processing/bedrock-document-processing.js +109 -66
  6. package/lib/document-processing/default-document-processing-config.js +3 -5
  7. package/lib/document-processing/localstack-agentic-document-processing.js +38 -5
  8. package/lib/document-processing/localstack-bedrock-document-processing.js +36 -5
  9. package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
  10. package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
  11. package/lib/document-processing/tests/base-document-processing.test.js +12 -1
  12. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +35 -2
  13. package/lib/document-processing/tests/localstack-document-processing.test.js +35 -2
  14. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
  15. package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
  16. package/lib/framework/agents/base-agent.js +31 -4
  17. package/lib/framework/agents/batch-agent.js +37 -5
  18. package/lib/framework/agents/default-agent-config.js +3 -5
  19. package/lib/framework/agents/interactive-agent.js +115 -23
  20. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
  21. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
  22. package/lib/framework/agents/localstack-batch-agent.js +36 -5
  23. package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
  24. package/lib/framework/bedrock/bedrock.js +2 -4
  25. package/lib/framework/custom-resource/default-runtimes.js +20 -22
  26. package/lib/framework/foundation/access-log.js +50 -7
  27. package/lib/framework/foundation/eventbridge-broker.js +5 -4
  28. package/lib/framework/foundation/network.js +4 -4
  29. package/lib/framework/localstack/localstack-config.js +3 -5
  30. package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
  31. package/lib/framework/tests/batch-agent.test.js +35 -2
  32. package/lib/framework/tests/framework-nag.test.js +35 -2
  33. package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
  34. package/lib/framework/tests/interactive-agent.test.js +35 -2
  35. package/lib/framework/tests/localstack-batch-agent.test.js +35 -2
  36. package/lib/utilities/data-loader.js +50 -5
  37. package/lib/utilities/lambda-iam-utils.js +38 -7
  38. package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
  39. package/lib/utilities/observability/bedrock-observability.js +38 -2
  40. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
  41. package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
  42. package/lib/utilities/observability/default-observability-config.js +6 -8
  43. package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
  44. package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
  45. package/lib/utilities/observability/observability.js +47 -6
  46. package/lib/utilities/observability/powertools-config.js +2 -4
  47. package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
  48. package/lib/webapp/frontend-construct.js +46 -5
  49. package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
  50. package/lib/webapp/tests/frontend-construct.test.js +36 -3
  51. package/package.json +60 -61
  52. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -1,11 +1,43 @@
1
1
  "use strict";
2
- var _a;
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
3
35
  Object.defineProperty(exports, "__esModule", { value: true });
4
36
  exports.BedrockDocumentProcessing = void 0;
5
37
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
38
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
39
  // SPDX-License-Identifier: Apache-2.0
8
- const path = require("path");
40
+ const path = __importStar(require("path"));
9
41
  const aws_lambda_python_alpha_1 = require("@aws-cdk/aws-lambda-python-alpha");
10
42
  const aws_cdk_lib_1 = require("aws-cdk-lib");
11
43
  const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
@@ -49,6 +81,80 @@ const powertools_config_1 = require("../utilities/observability/powertools-confi
49
81
  * - EU prefix: Routes to EU-based regions for data residency compliance
50
82
  */
51
83
  class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentProcessing {
84
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockDocumentProcessing", version: "1.17.1" };
85
+ static DEFAULT_CLASSIFICATION_PROMPT = `
86
+ 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):
87
+
88
+ {
89
+ documentClassification: <CLASSIFICATION>
90
+ }
91
+
92
+ Attached document is as follows:
93
+
94
+ `;
95
+ static DEFAULT_PROCESSING_PROMPT = `
96
+ The document below has been classified as [ACTUAL_CLASSIFICATION]. Extract important entities from the document and return the result as JSON following the structure below (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):
97
+
98
+ {
99
+ documentClassification: <CLASSIFICATION>,
100
+ result: {
101
+ entities: [
102
+ {
103
+ type: <TYPE OF ENTITY>
104
+ value: <VALUE OF ENTITY>
105
+ },
106
+ ...
107
+ ]
108
+ }
109
+ }
110
+
111
+ Attached document is as follows:
112
+
113
+ `;
114
+ static DEFAULT_AGGREGATION_PROMPT = `
115
+ You are given the processing results from multiple chunks of a large document that was split for processing.
116
+ Your task is to synthesize these chunk results into a single, coherent final result.
117
+
118
+ Instructions:
119
+ 1. Review all the chunk results provided below
120
+ 2. Merge and deduplicate any overlapping information (chunks may have overlapping pages)
121
+ 3. Synthesize the information into a unified, coherent result
122
+ 4. Maintain the same output format as the individual chunk results
123
+ 5. If the chunks contain summaries, create a comprehensive summary that covers all sections
124
+ 6. If the chunks contain entities, deduplicate and consolidate them
125
+ 7. Preserve important details from each chunk while avoiding redundancy
126
+
127
+ Return the result as JSON (only respond in JSON without markdown formatting):
128
+
129
+ {
130
+ "result": <SYNTHESIZED_RESULT>
131
+ }
132
+
133
+ The chunk results to aggregate are as follows:
134
+
135
+ `;
136
+ /** Configuration properties specific to Bedrock document processing */
137
+ bedrockDocumentProcessingProps;
138
+ /** The Step Functions state machine that orchestrates the document processing workflow */
139
+ stateMachine;
140
+ /** Cached classification Lambda function to avoid duplicate resource creation */
141
+ _classificationFunction;
142
+ /** Cached processing Lambda function to avoid duplicate resource creation */
143
+ _processingFunction;
144
+ /** Counter for generating unique classification step IDs */
145
+ _classificationStepCounter = 0;
146
+ /** Counter for generating unique processing step IDs */
147
+ _processingStepCounter = 0;
148
+ /** Cached aggregation Lambda function to avoid duplicate resource creation */
149
+ _aggregationFunction;
150
+ /** Counter for generating unique aggregation step IDs */
151
+ _aggregationStepCounter = 0;
152
+ /** Cached cleanup Lambda function to avoid duplicate resource creation */
153
+ _cleanupFunction;
154
+ /** Counter for generating unique enrichment step IDs */
155
+ _enrichmentStepCounter = 0;
156
+ /** Counter for generating unique post-processing step IDs */
157
+ _postProcessingStepCounter = 0;
52
158
  /**
53
159
  * Creates a new BedrockDocumentProcessing construct.
54
160
  *
@@ -63,16 +169,6 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
63
169
  */
64
170
  constructor(scope, id, props) {
65
171
  super(scope, id, props);
66
- /** Counter for generating unique classification step IDs */
67
- this._classificationStepCounter = 0;
68
- /** Counter for generating unique processing step IDs */
69
- this._processingStepCounter = 0;
70
- /** Counter for generating unique aggregation step IDs */
71
- this._aggregationStepCounter = 0;
72
- /** Counter for generating unique enrichment step IDs */
73
- this._enrichmentStepCounter = 0;
74
- /** Counter for generating unique post-processing step IDs */
75
- this._postProcessingStepCounter = 0;
76
172
  const internalProps = props;
77
173
  // Validate chunking configuration if provided
78
174
  if (props.enableChunking && props.chunkingConfig) {
@@ -849,57 +945,4 @@ class BedrockDocumentProcessing extends base_document_processing_1.BaseDocumentP
849
945
  }
850
946
  }
851
947
  exports.BedrockDocumentProcessing = BedrockDocumentProcessing;
852
- _a = JSII_RTTI_SYMBOL_1;
853
- BedrockDocumentProcessing[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockDocumentProcessing", version: "1.17.0" };
854
- BedrockDocumentProcessing.DEFAULT_CLASSIFICATION_PROMPT = `
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):
856
-
857
- {
858
- documentClassification: <CLASSIFICATION>
859
- }
860
-
861
- Attached document is as follows:
862
-
863
- `;
864
- BedrockDocumentProcessing.DEFAULT_PROCESSING_PROMPT = `
865
- The document below has been classified as [ACTUAL_CLASSIFICATION]. Extract important entities from the document and return the result as JSON following the structure below (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):
866
-
867
- {
868
- documentClassification: <CLASSIFICATION>,
869
- result: {
870
- entities: [
871
- {
872
- type: <TYPE OF ENTITY>
873
- value: <VALUE OF ENTITY>
874
- },
875
- ...
876
- ]
877
- }
878
- }
879
-
880
- Attached document is as follows:
881
-
882
- `;
883
- BedrockDocumentProcessing.DEFAULT_AGGREGATION_PROMPT = `
884
- You are given the processing results from multiple chunks of a large document that was split for processing.
885
- Your task is to synthesize these chunk results into a single, coherent final result.
886
-
887
- Instructions:
888
- 1. Review all the chunk results provided below
889
- 2. Merge and deduplicate any overlapping information (chunks may have overlapping pages)
890
- 3. Synthesize the information into a unified, coherent result
891
- 4. Maintain the same output format as the individual chunk results
892
- 5. If the chunks contain summaries, create a comprehensive summary that covers all sections
893
- 6. If the chunks contain entities, deduplicate and consolidate them
894
- 7. Preserve important details from each chunk while avoiding redundancy
895
-
896
- Return the result as JSON (only respond in JSON without markdown formatting):
897
-
898
- {
899
- "result": <SYNTHESIZED_RESULT>
900
- }
901
-
902
- The chunk results to aggregate are as follows:
903
-
904
- `;
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=
948
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLDJDQUE2QjtBQUM3Qiw4RUFBa0U7QUFDbEUsNkNBQThDO0FBQzlDLGlEQUFxRTtBQUNyRSxpREFBNkU7QUFDN0UsdURBQWdFO0FBQ2hFLHFFQUE4RztBQUM5RyxpRkFBMkc7QUFFM0cseUVBQTZIO0FBRTdILDRDQUEyRDtBQUMzRCxrREFBNEU7QUFDNUUsNENBQThDO0FBQzlDLG9GQUFnRjtBQXdIaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBYSx5QkFBMEIsU0FBUSxpREFBc0I7O0lBQ3pELE1BQU0sQ0FBVSw2QkFBNkIsR0FBRzs7Ozs7Ozs7O0dBU3pELENBQUM7SUFFUSxNQUFNLENBQVUseUJBQXlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCckQsQ0FBQztJQUVRLE1BQU0sQ0FBVSwwQkFBMEIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJ0RCxDQUFDO0lBRUYsdUVBQXVFO0lBQ3BELDhCQUE4QixDQUFpQztJQUNsRiwwRkFBMEY7SUFDakYsWUFBWSxDQUFDO0lBQ3RCLGlGQUFpRjtJQUN6RSx1QkFBdUIsQ0FBWTtJQUMzQyw2RUFBNkU7SUFDckUsbUJBQW1CLENBQVk7SUFDdkMsNERBQTREO0lBQ3BELDBCQUEwQixHQUFHLENBQUMsQ0FBQztJQUN2Qyx3REFBd0Q7SUFDaEQsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLDhFQUE4RTtJQUN0RSxvQkFBb0IsQ0FBWTtJQUN4Qyx5REFBeUQ7SUFDakQsdUJBQXVCLEdB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QUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLDZCQUE2QjtRQUNuQyxNQUFNLG1CQUFtQixHQUFHLElBQUksMENBQWdCLENBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFO1lBQ2pGLEtBQUssRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ25DLEdBQUcsRUFBRTtnQkFDSCxVQUFVLEVBQUUsOENBQW9CLENBQUMsVUFBVSxDQUFDLDRCQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQy9FO1lBQ0QsZ0JBQWdCLEVBQUUsaUNBQWlDO1lBQ25ELHlCQUF5QixFQUFFO2dCQUN6QixZQUFZLEVBQUUsOENBQW9CLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDO2FBQ3JFO1lBQ0QsVUFBVSxFQUFFLDRCQUFRLENBQUMsT0FBTztTQUM3QixDQUFDLENBQUM7UUFFSCxxRUFBcUU7UUFDckUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFNUUsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7QUF4K0JILDhEQXkrQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQeXRob25GdW5jdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUm9sZSwgU2VydmljZVByaW5jaXBhbCwgUG9saWN5RG9jdW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEZ1bmN0aW9uLCBBcmNoaXRlY3R1cmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IElDaGFpbmFibGUsIENob2ljZSwgQ29uZGl0aW9uLCBNYXAsIEpzb25QYXRoLCBUYXNrSW5wdXQsIFBhc3MgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBEeW5hbW9BdHRyaWJ1dGVWYWx1ZSwgRHluYW1vVXBkYXRlSXRlbSwgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nLCBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgQ2h1bmtpbmdDb25maWcgfSBmcm9tICcuL2NodW5raW5nLWNvbmZpZyc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMsIEludm9rZVR5cGUgfSBmcm9tICcuLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgQmVkcm9ja01vZGVsUHJvcHMsIEJlZHJvY2tNb2RlbFV0aWxzIH0gZnJvbSAnLi4vZnJhbWV3b3JrL2JlZHJvY2snO1xuaW1wb3J0IHsgTGFtYmRhSWFtVXRpbHMgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5L3Bvd2VydG9vbHMtY29uZmlnJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0LlxuICogRXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgd2l0aCBCZWRyb2NrLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZ1Byb3BzIHtcbiAgLyoqXG4gICAqIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsPzogQmVkcm9ja01vZGVsUHJvcHM7XG5cbiAgLyoqXG4gICAqIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvbiBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2luZ0JlZHJvY2tNb2RlbD86IEJlZHJvY2tNb2RlbFByb3BzO1xuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24uXG4gICAqIE11c3QgaW5jbHVkZSBwbGFjZWhvbGRlciBmb3IgZG9jdW1lbnQgY29udGVudC5cbiAgICogQGRlZmF1bHQgREVGQVVMVF9DTEFTU0lGSUNBVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpY2F0aW9uUHJvbXB0Pzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgZG9jdW1lbnQgZXh0cmFjdGlvbi5cbiAgICogTXVzdCBpbmNsdWRlIHBsYWNlaG9sZGVyIGZvciBkb2N1bWVudCBjb250ZW50IGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQuXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfRVhUUkFDVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NpbmdQcm9tcHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBMYW1iZGEgZnVuY3Rpb24gZm9yIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcC5cbiAgICogSWYgcHJvdmlkZWQsIHdpbGwgYmUgaW52b2tlZCBhZnRlciBleHRyYWN0aW9uIHdpdGggd29ya2Zsb3cgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBlbnJpY2htZW50TGFtYmRhRnVuY3Rpb24/OiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiBmb3IgcG9zdC1wcm9jZXNzaW5nIHN0ZXAuXG4gICAqIElmIHByb3ZpZGVkLCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgZW5yaWNobWVudCB3aXRoIHdvcmtmbG93IHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKipcbiAgICogVGltZW91dCBmb3IgaW5kaXZpZHVhbCBTdGVwIEZ1bmN0aW9ucyB0YXNrcyAoY2xhc3NpZmljYXRpb24sIGV4dHJhY3Rpb24sIGV0Yy4pLlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDUpXG4gICAqL1xuICByZWFkb25seSBzdGVwVGltZW91dHM/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHByb21wdCB0ZW1wbGF0ZSBmb3IgYWdncmVnYXRpbmcgcmVzdWx0cyBmcm9tIG11bHRpcGxlIGNodW5rcy5cbiAgICogVXNlZCB3aGVuIGNodW5raW5nIGlzIGVuYWJsZWQgdG8gbWVyZ2UgcHJvY2Vzc2luZyByZXN1bHRzIGZyb20gYWxsIGNodW5rc1xuICAgKiBpbnRvIGEgc2luZ2xlIGNvaGVyZW50IHJlc3VsdC5cbiAgICpcbiAgICogVGhlIHByb21wdCByZWNlaXZlcyB0aGUgY29uY2F0ZW5hdGVkIHByb2Nlc3NpbmcgcmVzdWx0cyBmcm9tIGFsbCBjaHVua3NcbiAgICogYW5kIHNob3VsZCBpbnN0cnVjdCB0aGUgbW9kZWwgdG8gc3ludGhlc2l6ZSB0aGVtIGludG8gYSB1bmlmaWVkIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgREVGQVVMVF9BR0dSRUdBVElPTl9QUk9NUFRcbiAgICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uUHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgUERGIGNodW5raW5nIGZvciBsYXJnZSBkb2N1bWVudHMuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgZG9jdW1lbnRzIGV4Y2VlZGluZyBjb25maWd1cmVkIHRocmVzaG9sZHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIHNwbGl0IGludG8gY2h1bmtzLCBwcm9jZXNzZWQgaW4gcGFyYWxsZWwgb3Igc2VxdWVudGlhbGx5LCBhbmQgcmVzdWx0cyBhZ2dyZWdhdGVkLlxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcjpcbiAgICogLSBQcm9jZXNzaW5nIGxhcmdlIFBERnMgKD4xMDAgcGFnZXMpXG4gICAqIC0gSGFuZGxpbmcgZG9jdW1lbnRzIHRoYXQgZXhjZWVkIEJlZHJvY2sgdG9rZW4gbGltaXRzICh+MjAwSyB0b2tlbnMpXG4gICAqIC0gSW1wcm92aW5nIHByb2Nlc3NpbmcgcmVsaWFiaWxpdHkgZm9yIGNvbXBsZXggZG9jdW1lbnRzXG4gICAqIC0gUHJvY2Vzc2luZyBkb2N1bWVudHMgd2l0aCB2YXJpYWJsZSBjb250ZW50IGRlbnNpdHlcbiAgICpcbiAgICogVGhlIGNodW5raW5nIHdvcmtmbG93OlxuICAgKiAxLiBBbmFseXplcyBQREYgdG8gZGV0ZXJtaW5lIHBhZ2UgY291bnQgYW5kIGVzdGltYXRlIHRva2VuIGNvdW50XG4gICAqIDIuIERlY2lkZXMgaWYgY2h1bmtpbmcgaXMgbmVlZGVkIGJhc2VkIG9uIGNvbmZpZ3VyZWQgdGhyZXNob2xkc1xuICAgKiAzLiBJZiBjaHVua2luZyBpcyBuZWVkZWQsIHNwbGl0cyBQREYgaW50byBjaHVua3MgYW5kIHVwbG9hZHMgdG8gUzNcbiAgICogNC4gUHJvY2Vzc2VzIGVhY2ggY2h1bmsgdGhyb3VnaCBjbGFzc2lmaWNhdGlvbiBhbmQgZXh0cmFjdGlvblxuICAgKiA1LiBBZ2dyZWdhdGVzIHJlc3VsdHMgdXNpbmcgbWFqb3JpdHkgdm90aW5nIGZvciBjbGFzc2lmaWNhdGlvblxuICAgKiA2LiBEZWR1cGxpY2F0ZXMgZW50aXRpZXMgYWNyb3NzIGNodW5rc1xuICAgKiA3LiBDbGVhbnMgdXAgdGVtcG9yYXJ5IGNodW5rIGZpbGVzIGZyb20gUzNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNodW5raW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgUERGIGNodW5raW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiBgZW5hYmxlQ2h1bmtpbmdgIGlzIHRydWUuIEFsbG93cyBjdXN0b21pemF0aW9uIG9mOlxuICAgKiAtICoqQ2h1bmtpbmcgc3RyYXRlZ3kqKjogSG93IGRvY3VtZW50cyBhcmUgc3BsaXQgKGZpeGVkLXBhZ2VzLCB0b2tlbi1iYXNlZCwgb3IgaHlicmlkKVxuICAgKiAtICoqVGhyZXNob2xkcyoqOiBXaGVuIHRvIHRyaWdnZXIgY2h1bmtpbmcgYmFzZWQgb24gcGFnZSBjb3VudCBvciB0b2tlbiBjb3VudFxuICAgKiAtICoqQ2h1bmsgc2l6ZSBhbmQgb3ZlcmxhcCoqOiBDb250cm9sIGNodW5rIGJvdW5kYXJpZXMgYW5kIGNvbnRleHQgcHJlc2VydmF0aW9uXG4gICAqIC0gKipQcm9jZXNzaW5nIG1vZGUqKjogUGFyYWxsZWwgKGZhc3Rlcikgb3Igc2VxdWVudGlhbCAoY29zdC1vcHRpbWl6ZWQpXG4gICAqIC0gKipBZ2dyZWdhdGlvbiBzdHJhdGVneSoqOiBIb3cgdG8gY29tYmluZSByZXN1bHRzIGZyb20gbXVsdGlwbGUgY2h1bmtzXG4gICAqXG4gICAqICMjIERlZmF1bHQgQ29uZmlndXJhdGlvblxuICAgKlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgc2Vuc2libGUgZGVmYXVsdHMgb3B0aW1pemVkIGZvciBtb3N0IHVzZSBjYXNlczpcbiAgICogLSBTdHJhdGVneTogYCdoeWJyaWQnYCAocmVjb21tZW5kZWQgLSBiYWxhbmNlcyB0b2tlbiBhbmQgcGFnZSBsaW1pdHMpXG4gICAqIC0gUGFnZSB0aHJlc2hvbGQ6IDEwMCBwYWdlc1xuICAgKiAtIFRva2VuIHRocmVzaG9sZDogMTUwLDAwMCB0b2tlbnNcbiAgICogLSBQcm9jZXNzaW5nIG1vZGU6IGAncGFyYWxsZWwnYFxuICAgKiAtIE1heCBjb25jdXJyZW5jeTogMTBcbiAgICogLSBBZ2dyZWdhdGlvbiBzdHJhdGVneTogYCdtYWpvcml0eS12b3RlJ2BcbiAgICpcbiAgICogIyMgU3RyYXRlZ3kgQ29tcGFyaXNvblxuICAgKlxuICAgKiB8IFN0cmF0ZWd5IHwgQmVzdCBGb3IgfCBQcm9zIHwgQ29ucyB8XG4gICAqIHwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLXxcbiAgICogfCBgaHlicmlkYCB8IE1vc3QgZG9jdW1lbnRzIHwgQmFsYW5jZXMgdG9rZW4vcGFnZSBsaW1pdHMgfCBTbGlnaHRseSBtb3JlIGNvbXBsZXggfFxuICAgKiB8IGB0b2tlbi1iYXNlZGAgfCBWYXJpYWJsZSBkZW5zaXR5IHwgUmVzcGVjdHMgbW9kZWwgbGltaXRzIHwgU2xvd2VyIGFuYWx5c2lzIHxcbiAgICogfCBgZml4ZWQtcGFnZXNgIHwgVW5pZm9ybSBkZW5zaXR5IHwgU2ltcGxlLCBmYXN0IHwgTWF5IGV4Y2VlZCB0b2tlbiBsaW1pdHMgfFxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgKHVzZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZW4gZW5hYmxlQ2h1bmtpbmcgaXMgdHJ1ZSlcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgQ2h1bmtpbmdDb25maWd9IGZvciBkZXRhaWxlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGNodW5raW5nQ29uZmlnPzogQ2h1bmtpbmdDb25maWc7XG59XG5cbmludGVyZmFjZSBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nSW50ZXJuYWxQcm9wcyBleHRlbmRzIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyB7XG4gIHJlYWRvbmx5IF9za2lwQmVkcm9ja1ZwY0VuZHBvaW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvdyBwb3dlcmVkIGJ5IEFtYXpvbiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzLlxuICpcbiAqIEV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB0byBwcm92aWRlIEFJLXBvd2VyZWQgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gYW5kIGV4dHJhY3Rpb25cbiAqIHVzaW5nIEFtYXpvbiBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzLiBUaGlzIGltcGxlbWVudGF0aW9uIG9mZmVyczpcbiAqXG4gKiAjIyBLZXkgRmVhdHVyZXNcbiAqIC0gKipBSS1Qb3dlcmVkIENsYXNzaWZpY2F0aW9uKio6IFVzZXMgQ2xhdWRlIDMuNyBTb25uZXQgKGNvbmZpZ3VyYWJsZSkgdG8gY2xhc3NpZnkgZG9jdW1lbnQgdHlwZXNcbiAqIC0gKipJbnRlbGxpZ2VudCBFeHRyYWN0aW9uKio6IEV4dHJhY3RzIHN0cnVjdHVyZWQgZGF0YSBmcm9tIGRvY3VtZW50cyB1c2luZyBmb3VuZGF0aW9uIG1vZGVsc1xuICogLSAqKkNyb3NzLVJlZ2lvbiBJbmZlcmVuY2UqKjogT3B0aW9uYWwgc3VwcG9ydCBmb3IgaW1wcm92ZWQgYXZhaWxhYmlsaXR5IHZpYSBpbmZlcmVuY2UgcHJvZmlsZXNcbiAqIC0gKipGbGV4aWJsZSBQcm9jZXNzaW5nKio6IE9wdGlvbmFsIGVucmljaG1lbnQgYW5kIHBvc3QtcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb25zXG4gKiAtICoqQ29zdCBPcHRpbWl6ZWQqKjogQ29uZmlndXJhYmxlIHRpbWVvdXRzIGFuZCBtb2RlbCBzZWxlY3Rpb24gZm9yIGNvc3QgY29udHJvbFxuICpcbiAqICMjIFByb2Nlc3NpbmcgV29ya2Zsb3dcbiAqIFMzIFVwbG9hZCDihpIgQ2xhc3NpZmljYXRpb24gKEJlZHJvY2spIOKGkiBFeHRyYWN0aW9uIChCZWRyb2NrKSDihpIgW0VucmljaG1lbnRdIOKGkiBbUG9zdC1Qcm9jZXNzaW5nXSDihpIgUmVzdWx0c1xuICpcbiAqICMjIERlZmF1bHQgTW9kZWxzXG4gKiAtIENsYXNzaWZpY2F0aW9uOiBDbGF1ZGUgMy43IFNvbm5ldCAoYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjApXG4gKiAtIEV4dHJhY3Rpb246IENsYXVkZSAzLjcgU29ubmV0IChhbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MClcbiAqXG4gKiAjIyBQcm9tcHQgVGVtcGxhdGVzXG4gKiBUaGUgY29uc3RydWN0IHVzZXMgZGVmYXVsdCBwcm9tcHRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQ6XG4gKiAtICoqQ2xhc3NpZmljYXRpb24qKjogQW5hbHl6ZXMgZG9jdW1lbnQgYW5kIHJldHVybnMgSlNPTiB3aXRoIGRvY3VtZW50Q2xhc3NpZmljYXRpb24gZmllbGRcbiAqIC0gKipFeHRyYWN0aW9uKio6IFVzZXMgY2xhc3NpZmljYXRpb24gcmVzdWx0IHRvIGV4dHJhY3QgZW50aXRpZXMgaW4gc3RydWN0dXJlZCBKU09OIGZvcm1hdFxuICpcbiAqICMjIENyb3NzLVJlZ2lvbiBJbmZlcmVuY2VcbiAqIFdoZW4gZW5hYmxlZCwgdXNlcyBCZWRyb2NrIGluZmVyZW5jZSBwcm9maWxlcyBmb3IgaW1wcm92ZWQgYXZhaWxhYmlsaXR5OlxuICogLSBVUyBwcmVmaXg6IFJvdXRlcyB0byBVUy1iYXNlZCByZWdpb25zIGZvciBsb3dlciBsYXRlbmN5XG4gKiAtIEVVIHByZWZpeDogUm91dGVzIHRvIEVVLWJhc2VkIHJlZ2lvbnMgZm9yIGRhdGEgcmVzaWRlbmN5IGNvbXBsaWFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NMQVNTSUZJQ0FUSU9OX1BST01QVCA9IGBcbiAgQW5hbHl6ZSB0aGUgZG9jdW1lbnQgYmVsb3csIGFuZCBjbGFzc2lmeSB0aGUgdHlwZSBvZiBkb2N1bWVudCBpdCBpcyAoZWcuIElOVk9JQ0UsIElERU5USVRZX0RPQ1VNRU5ULCBSRUNFSVBULCBldGMpLiBUaGUgcmVzdWx0IHNob3VsZCBiZSBpbiBKU09OIGFuZCBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIChvbmx5IHJlc3BvbmQgaW4gSlNPTiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFuZCBkbyBub3QgdXNlIG1hcmtkb3duIHRvIGluZGljYXRlIHRoZSBqc29uLCBqdXN0IG91dHB1dCBwbGFpbiBvbGQganNvbiB3aXRoIG5vdGhpbmcgZWxzZSk6XG5cbiAge1xuICAgICAgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogPENMQVNTSUZJQ0FUSU9OPlxuICB9XG5cbiAgQXR0YWNoZWQgZG9jdW1lbnQgaXMgYXMgZm9sbG93czpcblxuICBgO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9QUk9DRVNTSU5HX1BST01QVCA9IGBcbiAgVGhlIGRvY3VtZW50IGJlbG93IGhhcyBiZWVuIGNsYXNzaWZpZWQgYXMgW0FDVFVBTF9DTEFTU0lGSUNBVElPTl0uIEV4dHJhY3QgaW1wb3J0YW50IGVudGl0aWVzIGZyb20gdGhlIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBKU09OIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIGJlbG93IChvbmx5IHJlc3BvbmQgaW4gSlNPTiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFuZCBkbyBub3QgdXNlIG1hcmtkb3duIHRvIGluZGljYXRlIHRoZSBqc29uLCBqdXN0IG91dHB1dCBwbGFpbiBvbGQganNvbiB3aXRoIG5vdGhpbmcgZWxzZSk6XG5cbiAge1xuICAgICAgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogPENMQVNTSUZJQ0FUSU9OPixcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBlbnRpdGllczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IDxUWVBFIE9GIEVOVElUWT5cbiAgICAgICAgICAgICAgICB2YWx1ZTogPFZBTFVFIE9GIEVOVElUWT5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5cbiAgICAgICAgXVxuICAgICAgfVxuICB9XG5cbiAgQXR0YWNoZWQgZG9jdW1lbnQgaXMgYXMgZm9sbG93czpcblxuICBgO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BR0dSRUdBVElPTl9QUk9NUFQgPSBgXG4gIFlvdSBhcmUgZ2l2ZW4gdGhlIHByb2Nlc3NpbmcgcmVzdWx0cyBmcm9tIG11bHRpcGxlIGNodW5rcyBvZiBhIGxhcmdlIGRvY3VtZW50IHRoYXQgd2FzIHNwbGl0IGZvciBwcm9jZXNzaW5nLlxuICBZb3VyIHRhc2sgaXMgdG8gc3ludGhlc2l6ZSB0aGVzZSBjaHVuayByZXN1bHRzIGludG8gYSBzaW5nbGUsIGNvaGVyZW50IGZpbmFsIHJlc3VsdC5cblxuICBJbnN0cnVjdGlvbnM6XG4gIDEuIFJldmlldyBhbGwgdGhlIGNodW5rIHJlc3VsdHMgcHJvdmlkZWQgYmVsb3dcbiAgMi4gTWVyZ2UgYW5kIGRlZHVwbGljYXRlIGFueSBvdmVybGFwcGluZyBpbmZvcm1hdGlvbiAoY2h1bmtzIG1heSBoYXZlIG92ZXJsYXBwaW5nIHBhZ2VzKVxuICAzLiBTeW50aGVzaXplIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgdW5pZmllZCwgY29oZXJlbnQgcmVzdWx0XG4gIDQuIE1haW50YWluIHRoZSBzYW1lIG91dHB1dCBmb3JtYXQgYXMgdGhlIGluZGl2aWR1YWwgY2h1bmsgcmVzdWx0c1xuICA1LiBJZiB0aGUgY2h1bmtzIGNvbnRhaW4gc3VtbWFyaWVzLCBjcmVhdGUgYSBjb21wcmVoZW5zaXZlIHN1bW1hcnkgdGhhdCBjb3ZlcnMgYWxsIHNlY3Rpb25zXG4gIDYuIElmIHRoZSBjaHVua3MgY29udGFpbiBlbnRpdGllcywgZGVkdXBsaWNhdGUgYW5kIGNvbnNvbGlkYXRlIHRoZW1cbiAgNy4gUHJlc2VydmUgaW1wb3J0YW50IGRldGFpbHMgZnJvbSBlYWNoIGNodW5rIHdoaWxlIGF2b2lkaW5nIHJlZHVuZGFuY3lcblxuICBSZXR1cm4gdGhlIHJlc3VsdCBhcyBKU09OIChvbmx5IHJlc3BvbmQgaW4gSlNPTiB3aXRob3V0IG1hcmtkb3duIGZvcm1hdHRpbmcpOlxuXG4gIHtcbiAgICAgIFwicmVzdWx0XCI6IDxTWU5USEVTSVpFRF9SRVNVTFQ+XG4gIH1cblxuICBUaGUgY2h1bmsgcmVzdWx0cyB0byBhZ2dyZWdhdGUgYXJlIGFzIGZvbGxvd3M6XG5cbiAgYDtcblxuICAvKiogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIEJlZHJvY2sgZG9jdW1lbnQgcHJvY2Vzc2luZyAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzOiBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHM7XG4gIC8qKiBUaGUgU3RlcCBGdW5jdGlvbnMgc3RhdGUgbWFjaGluZSB0aGF0IG9yY2hlc3RyYXRlcyB0aGUgZG9jdW1lbnQgcHJvY2Vzc2luZyB3b3JrZmxvdyAqL1xuICByZWFkb25seSBzdGF0ZU1hY2hpbmU7XG4gIC8qKiBDYWNoZWQgY2xhc3NpZmljYXRpb24gTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXNvdXJjZSBjcmVhdGlvbiAqL1xuICBwcml2YXRlIF9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKiBDYWNoZWQgcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb24gdG8gYXZvaWQgZHVwbGljYXRlIHJlc291cmNlIGNyZWF0aW9uICovXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdGdW5jdGlvbj86IEZ1bmN0aW9uO1xuICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgY2xhc3NpZmljYXRpb24gc3RlcCBJRHMgKi9cbiAgcHJpdmF0ZSBfY2xhc3NpZmljYXRpb25TdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBwcm9jZXNzaW5nIHN0ZXAgSURzICovXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdTdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDYWNoZWQgYWdncmVnYXRpb24gTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXNvdXJjZSBjcmVhdGlvbiAqL1xuICBwcml2YXRlIF9hZ2dyZWdhdGlvbkZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBhZ2dyZWdhdGlvbiBzdGVwIElEcyAqL1xuICBwcml2YXRlIF9hZ2dyZWdhdGlvblN0ZXBDb3VudGVyID0gMDtcbiAgLyoqIENhY2hlZCBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbiB0byBhdm9pZCBkdXBsaWNhdGUgcmVzb3VyY2UgY3JlYXRpb24gKi9cbiAgcHJpdmF0ZSBfY2xlYW51cEZ1bmN0aW9uPzogRnVuY3Rpb247XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBlbnJpY2htZW50IHN0ZXAgSURzICovXG4gIHByaXZhdGUgX2VucmljaG1lbnRTdGVwQ291bnRlciA9IDA7XG4gIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBwb3N0LXByb2Nlc3Npbmcgc3RlcCBJRHMgKi9cbiAgcHJpdmF0ZSBfcG9zdFByb2Nlc3NpbmdTdGVwQ291bnRlciA9IDA7XG5cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdC5cbiAgICpcbiAgICogSW5pdGlhbGl6ZXMgdGhlIEJlZHJvY2stcG93ZXJlZCBkb2N1bWVudCBwcm9jZXNzaW5nIHBpcGVsaW5lIHdpdGggQUkgY2xhc3NpZmljYXRpb25cbiAgICogYW5kIGV4dHJhY3Rpb24gY2FwYWJpbGl0aWVzLiBDcmVhdGVzIExhbWJkYSBmdW5jdGlvbnMgd2l0aCBhcHByb3ByaWF0ZSBJQU0gcm9sZXNcbiAgICogZm9yIEJlZHJvY2sgbW9kZWwgaW52b2NhdGlvbiBhbmQgUzMgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBCZWRyb2NrIGRvY3VtZW50IHByb2Nlc3NpbmcgcGlwZWxpbmVcbiAgICogQHRocm93cyBFcnJvciBpZiBjaHVua2luZyBjb25maWd1cmF0aW9uIGlzIGludmFsaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICBjb25zdCBpbnRlcm5hbFByb3BzID0gcHJvcHMgYXMgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ0ludGVybmFsUHJvcHM7XG5cbiAgICAvLyBWYWxpZGF0ZSBjaHVua2luZyBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLmVuYWJsZUNodW5raW5nICYmIHByb3BzLmNodW5raW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ2h1bmtpbmdDb25maWcocHJvcHMuY2h1bmtpbmdDb25maWcpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5uZXR3b3JrICYmICFpbnRlcm5hbFByb3BzLl9za2lwQmVkcm9ja1ZwY0VuZHBvaW50cykge1xuICAgICAgcHJvcHMubmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ3ZwY2UtYmVkcm9jaycsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5CRURST0NLKTtcbiAgICAgIHByb3BzLm5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCd2cGNlLWJlZHJvY2stcnVudGltZScsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5CRURST0NLX1JVTlRJTUUpO1xuICAgIH1cblxuICAgIHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzID0gcHJvcHM7XG4gICAgdGhpcy5zdGF0ZU1hY2hpbmUgPSB0aGlzLmhhbmRsZVN0YXRlTWFjaGluZUNyZWF0aW9uKCdiZWRyb2NrLWRvY3VtZW50LXByb2Nlc3Npbmctd29ya2Zsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGNodW5raW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cbiAgICpcbiAgICogRW5zdXJlcyB0aGF0OlxuICAgKiAtIENodW5rIHNpemUgaXMgZ3JlYXRlciB0aGFuIDBcbiAgICogLSBPdmVybGFwIGlzIG5vbi1uZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIGNodW5rIHNpemVcbiAgICogLSBUaHJlc2hvbGRzIGFyZSBncmVhdGVyIHRoYW4gMFxuICAgKiAtIE1heCBjb25jdXJyZW5jeSBpcyBncmVhdGVyIHRoYW4gMFxuICAgKiAtIE1pbiBzdWNjZXNzIHRocmVzaG9sZCBpcyBiZXR3ZWVuIDAgYW5kIDFcbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBjaHVua2luZyBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDaHVua2luZ0NvbmZpZyhjb25maWc6IENodW5raW5nQ29uZmlnKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgY2h1bmsgc2l6ZSAoZm9yIGZpeGVkLXBhZ2VzIHN0cmF0ZWd5KVxuICAgIGlmIChjb25maWcuY2h1bmtTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb25maWcuY2h1bmtTaXplIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBjaHVua1NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJsYXAgcGFnZXMgKGZvciBmaXhlZC1wYWdlcyBzdHJhdGVneSlcbiAgICBpZiAoY29uZmlnLm92ZXJsYXBQYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uZmlnLm92ZXJsYXBQYWdlcyA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBvdmVybGFwUGFnZXMgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUNodW5rU2l6ZSA9IGNvbmZpZy5jaHVua1NpemUgfHwgNTA7IC8vIGRlZmF1bHQgY2h1bmsgc2l6ZVxuICAgICAgaWYgKGNvbmZpZy5vdmVybGFwUGFnZXMgPj0gZWZmZWN0aXZlQ2h1bmtTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogb3ZlcmxhcFBhZ2VzIG11c3QgYmUgbGVzcyB0aGFuIGNodW5rU2l6ZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBhZ2UgdGhyZXNob2xkXG4gICAgaWYgKGNvbmZpZy5wYWdlVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLnBhZ2VUaHJlc2hvbGQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaHVua2luZ0NvbmZpZyB2YWxpZGF0aW9uIGVycm9yOiBwYWdlVGhyZXNob2xkIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0b2tlbiB0aHJlc2hvbGRcbiAgICBpZiAoY29uZmlnLnRva2VuVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLnRva2VuVGhyZXNob2xkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogdG9rZW5UaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1heCB0b2tlbnMgcGVyIGNodW5rIChmb3IgdG9rZW4tYmFzZWQgc3RyYXRlZ3kpXG4gICAgaWYgKGNvbmZpZy5tYXhUb2tlbnNQZXJDaHVuayAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5tYXhUb2tlbnNQZXJDaHVuayA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG1heFRva2Vuc1BlckNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvdmVybGFwIHRva2VucyAoZm9yIHRva2VuLWJhc2VkIGFuZCBoeWJyaWQgc3RyYXRlZ2llcylcbiAgICBpZiAoY29uZmlnLm92ZXJsYXBUb2tlbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbmZpZy5vdmVybGFwVG9rZW5zIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG92ZXJsYXBUb2tlbnMgbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU1heFRva2VucyA9IGNvbmZpZy5tYXhUb2tlbnNQZXJDaHVuayB8fCAxMDAwMDA7IC8vIGRlZmF1bHQgbWF4IHRva2Vuc1xuICAgICAgaWYgKGNvbmZpZy5vdmVybGFwVG9rZW5zID49IGVmZmVjdGl2ZU1heFRva2Vucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG92ZXJsYXBUb2tlbnMgbXVzdCBiZSBsZXNzIHRoYW4gbWF4VG9rZW5zUGVyQ2h1bmsnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXggcGFnZXMgcGVyIGNodW5rIChmb3IgaHlicmlkIHN0cmF0ZWd5KVxuICAgIGlmIChjb25maWcubWF4UGFnZXNQZXJDaHVuayAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5tYXhQYWdlc1BlckNodW5rIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogbWF4UGFnZXNQZXJDaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGFyZ2V0IHRva2VucyBwZXIgY2h1bmsgKGZvciBoeWJyaWQgc3RyYXRlZ3kpXG4gICAgaWYgKGNvbmZpZy50YXJnZXRUb2tlbnNQZXJDaHVuayAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy50YXJnZXRUb2tlbnNQZXJDaHVuayA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IHRhcmdldFRva2Vuc1BlckNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXggY29uY3VycmVuY3lcbiAgICBpZiAoY29uZmlnLm1heENvbmN1cnJlbmN5ICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLm1heENvbmN1cnJlbmN5IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2h1bmtpbmdDb25maWcgdmFsaWRhdGlvbiBlcnJvcjogbWF4Q29uY3VycmVuY3kgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1pbiBzdWNjZXNzIHRocmVzaG9sZFxuICAgIGlmIChjb25maWcubWluU3VjY2Vzc1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uZmlnLm1pblN1Y2Nlc3NUaHJlc2hvbGQgPCAwIHx8IGNvbmZpZy5taW5TdWNjZXNzVGhyZXNob2xkID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NodW5raW5nQ29uZmlnIHZhbGlkYXRpb24gZXJyb3I6IG1pblN1Y2Nlc3NUaHJlc2hvbGQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgZG9jdW1lbnQgY2xhc3NpZmljYXRpb24gc3RlcCB1c2luZyBBbWF6b24gQmVkcm9jay5cbiAgICpcbiAgICogQ3JlYXRlcyBhIExhbWJkYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIGNvbmZpZ3VyZWQgQmVkcm9jayBtb2RlbCB0byBjbGFzc2lmeVxuICAgKiB0aGUgZG9jdW1lbnQgdHlwZS4gVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBkb2N1bWVudCBmcm9tIFMzIGFuZCBzZW5kcyBpdCB0b1xuICAgKiBCZWRyb2NrIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIHByb21wdC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIHJlc291cmNlcyxcbiAgICogYnV0IGNyZWF0ZXMgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgZWFjaCB0aW1lIHRvIGFsbG93IHByb3BlciBzdGF0ZSBjaGFpbmluZy5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2xhc3NpZmljYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjbGFzc2lmaWNhdGlvblN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb24gb25seSBvbmNlXG4gICAgaWYgKCF0aGlzLl9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5jbGFzc2lmaWNhdGlvblByb21wdCB8fCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLkRFRkFVTFRfQ0xBU1NJRklDQVRJT05fUFJPTVBUO1xuICAgICAgY29uc3QgYWRqdXN0ZWRNb2RlbElkID0gQmVkcm9ja01vZGVsVXRpbHMuZGVyaXZlQWN0dWFsTW9kZWxJZCh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5jbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCByb2xlID0gdGhpcy5nZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKCdDbGFzc2lmaWNhdGlvbkxhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5jbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2YodGhpcyk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICAgIGFjY291bnQsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ2JlZHJvY2staWRwLWNsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChyb2xlKTtcblxuICAgICAgdGhpcy5fY2xhc3NpZmljYXRpb25GdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQmVkcm9ja0NsYXNzaWZpY2F0aW9uRnVuY3Rpb24nLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMudW5pcXVlRnVuY3Rpb25OYW1lLFxuICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICAgIGVudHJ5OiB0aGlzLnJlc29sdmVCZWRyb2NrSW52b2tlRW50cnkoKSxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5zdGVwVGltZW91dHMgfHwgRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBNT0RFTF9JRDogYWRqdXN0ZWRNb2RlbElkLFxuICAgICAgICAgIFBST01QVDogcHJvbXB0LFxuICAgICAgICAgIElOVk9LRV9UWVBFOiBJbnZva2VUeXBlLkNMQVNTSUZJQ0FUSU9OLFxuICAgICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgdnBjOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB2cGNTdWJuZXRzOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2NsYXNzaWZpY2F0aW9uRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmspIHtcbiAgICAgICAgdGhpcy5fY2xhc3NpZmljYXRpb25GdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyBjcmVhdGUgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgdG8gYWxsb3cgcHJvcGVyIHN0YXRlIGNoYWluaW5nXG4gICAgY29uc3Qgc3RlcElkID0gYENsYXNzaWZpY2F0aW9uU3RlcC0ke3RoaXMuX2NsYXNzaWZpY2F0aW9uU3RlcENvdW50ZXJ9YDtcbiAgICB0aGlzLl9jbGFzc2lmaWNhdGlvblN0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9jbGFzc2lmaWNhdGlvbkZ1bmN0aW9uLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2xhc3NpZmljYXRpb25SZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ2RvY3VtZW50Q2xhc3NpZmljYXRpb24uJCc6ICckLlBheWxvYWQuZG9jdW1lbnRDbGFzc2lmaWNhdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIGRvY3VtZW50IGV4dHJhY3Rpb24gc3RlcCB1c2luZyBBbWF6b24gQmVkcm9jay5cbiAgICpcbiAgICogQ3JlYXRlcyBhIExhbWJkYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIGNvbmZpZ3VyZWQgQmVkcm9jayBtb2RlbCB0byBleHRyYWN0XG4gICAqIHN0cnVjdHVyZWQgZGF0YSBmcm9tIHRoZSBkb2N1bWVudC4gVXNlcyB0aGUgY2xhc3NpZmljYXRpb24gcmVzdWx0IGZyb20gdGhlXG4gICAqIHByZXZpb3VzIHN0ZXAgdG8gcHJvdmlkZSBjb250ZXh0IGZvciBtb3JlIGFjY3VyYXRlIGV4dHJhY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nIGR1cGxpY2F0ZSByZXNvdXJjZXMsXG4gICAqIGJ1dCBjcmVhdGVzIGEgbmV3IExhbWJkYUludm9rZSB0YXNrIGVhY2ggdGltZSB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGV4dHJhY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiBvbmx5IG9uY2VcbiAgICBpZiAoIXRoaXMuX3Byb2Nlc3NpbmdGdW5jdGlvbikge1xuICAgICAgY29uc3QgcHJvbXB0ID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ1Byb21wdCB8fCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLkRFRkFVTFRfUFJPQ0VTU0lOR19QUk9NUFQ7XG4gICAgICBjb25zdCBhZGp1c3RlZE1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnByb2Nlc3NpbmdCZWRyb2NrTW9kZWwpO1xuICAgICAgY29uc3Qgcm9sZSA9IHRoaXMuZ2VuZXJhdGVMYW1iZGFSb2xlRm9yQmVkcm9jaygnUHJvY2Vzc2luZ0xhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgICBhY2NvdW50LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdiZWRyb2NrLWlkcC1wcm9jZXNzaW5nJyxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG4gICAgICB0aGlzLl9wcm9jZXNzaW5nRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ0JlZHJvY2tFeHRyYWN0aW9uRnVuY3Rpb24nLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMudW5pcXVlRnVuY3Rpb25OYW1lLFxuICAgICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICAgIGVudHJ5OiB0aGlzLnJlc29sdmVCZWRyb2NrSW52b2tlRW50cnkoKSxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5zdGVwVGltZW91dHMgfHwgRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBNT0RFTF9JRDogYWRqdXN0ZWRNb2RlbElkLFxuICAgICAgICAgIFBST01QVDogcHJvbXB0LFxuICAgICAgICAgIElOVk9LRV9UWVBFOiBJbnZva2VUeXBlLlBST0NFU1NJTkcsXG4gICAgICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZ0Z1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyBjcmVhdGUgYSBuZXcgTGFtYmRhSW52b2tlIHRhc2sgdG8gYWxsb3cgcHJvcGVyIHN0YXRlIGNoYWluaW5nXG4gICAgY29uc3Qgc3RlcElkID0gYFByb2Nlc3NpbmdTdGVwLSR7dGhpcy5fcHJvY2Vzc2luZ1N0ZXBDb3VudGVyfWA7XG4gICAgdGhpcy5fcHJvY2Vzc2luZ1N0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9wcm9jZXNzaW5nRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICdkb2N1bWVudENsYXNzaWZpY2F0aW9uLiQnOiAnJC5QYXlsb2FkLmRvY3VtZW50Q2xhc3NpZmljYXRpb24nLFxuICAgICAgICAncmVzdWx0LiQnOiAnJC5QYXlsb2FkLnJlc3VsdCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlTGFtYmRhUm9sZUZvckJlZHJvY2soaWQ6IHN0cmluZywgbW9kZWw/OiBCZWRyb2NrTW9kZWxQcm9wcykge1xuICAgIHJldHVybiBuZXcgUm9sZSh0aGlzLCBpZCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIEJlZHJvY2tJbnZva2VQb2xpY3k6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgLy8gUzMgcmVhZC1vbmx5IGFjY2VzcyBmb3IgZG9jdW1lbnQgcmV0cmlldmFsIC0gbGVhc3QgcHJpdmlsZWdlXG4gICAgICAgICAgICAuLi50aGlzLmluZ3Jlc3NBZGFwdGVyLmdlbmVyYXRlQWRhcHRlcklBTVBvbGljaWVzKCksXG4gICAgICAgICAgICBCZWRyb2NrTW9kZWxVdGlscy5nZW5lcmF0ZU1vZGVsSUFNUGVybWlzc2lvbnModGhpcywgbW9kZWwpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQmVkcm9ja0ludm9rZUVudHJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvZGVmYXVsdC1iZWRyb2NrLWludm9rZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIGRvY3VtZW50IGVucmljaG1lbnQgc3RlcC5cbiAgICpcbiAgICogSWYgYW4gZW5yaWNobWVudCBMYW1iZGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gdGhlIHByb3BzLCBjcmVhdGVzIGEgTGFtYmRhSW52b2tlXG4gICAqIHRhc2sgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgb24gdGhlIGV4dHJhY3RlZCBkYXRhLiBUaGlzIHN0ZXAgaXMgdXNlZnVsXG4gICAqIGZvciBkYXRhIHZhbGlkYXRpb24sIHRyYW5zZm9ybWF0aW9uLCBvciBpbnRlZ3JhdGlvbiB3aXRoIGV4dGVybmFsIHN5c3RlbXMuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciBlbnJpY2htZW50LCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBlbnJpY2htZW50U3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcElkID0gYEVucmljaG1lbnRTdGVwLSR7dGhpcy5fZW5yaWNobWVudFN0ZXBDb3VudGVyfWA7XG4gICAgdGhpcy5fZW5yaWNobWVudFN0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbnJpY2htZW50TGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgICBvdXRwdXRQYXRoOiAnJCcsXG4gICAgICBwYXlsb2FkUmVzcG9uc2VPbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIHBvc3QtcHJvY2Vzc2luZyBzdGVwLlxuICAgKlxuICAgKiBJZiBhIHBvc3QtcHJvY2Vzc2luZyBMYW1iZGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gdGhlIHByb3BzLCBjcmVhdGVzIGEgTGFtYmRhSW52b2tlXG4gICAqIHRhc2sgdG8gcGVyZm9ybSBmaW5hbCBwcm9jZXNzaW5nIG9uIHRoZSB3b3JrZmxvdyByZXN1bHRzLiBUaGlzIHN0ZXAgaXMgdXNlZnVsIGZvclxuICAgKiBkYXRhIGZvcm1hdHRpbmcsIG5vdGlmaWNhdGlvbnMsIG9yIGludGVncmF0aW9uIHdpdGggZG93bnN0cmVhbSBzeXN0ZW1zLlxuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgcG9zdC1wcm9jZXNzaW5nLCBvciB1bmRlZmluZWQgdG8gc2tpcCB0aGlzIHN0ZXBcbiAgICovXG4gIHByb3RlY3RlZCBwb3N0UHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucG9zdFByb2Nlc3NpbmdMYW1iZGFGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwSWQgPSBgUG9zdFByb2Nlc3NpbmdTdGVwLSR7dGhpcy5fcG9zdFByb2Nlc3NpbmdTdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX3Bvc3RQcm9jZXNzaW5nU3RlcENvdW50ZXIrKztcblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsIHN0ZXBJZCwge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnBvc3RQcm9jZXNzaW5nTGFtYmRhRnVuY3Rpb24sXG4gICAgICByZXN1bHRQYXRoOiAnJC5wb3N0UHJvY2Vzc2VkUmVzdWx0JyxcbiAgICAgIG91dHB1dFBhdGg6ICckJyxcbiAgICAgIHBheWxvYWRSZXNwb25zZU9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBwcmVwcm9jZXNzaW5nIHN0ZXAgZm9yIFBERiBjaHVua2luZy5cbiAgICpcbiAgICogV2hlbiBjaHVua2luZyBpcyBlbmFibGVkLCBjcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgYW5hbHl6ZXMgUERGcyBhbmRcbiAgICogc3BsaXRzIGxhcmdlIGRvY3VtZW50cyBpbnRvIG1hbmFnZWFibGUgY2h1bmtzLiBUaGUgZnVuY3Rpb246XG4gICAqIDEuIEFuYWx5emVzIHRoZSBQREYgdG8gZGV0ZXJtaW5lIHBhZ2UgY291bnQgYW5kIHRva2VuIGVzdGltYXRlc1xuICAgKiAyLiBEZWNpZGVzIGlmIGNodW5raW5nIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmVkIHRocmVzaG9sZHNcbiAgICogMy4gSWYgY2h1bmtpbmcgaXMgbmVlZGVkLCBzcGxpdHMgdGhlIFBERiBhbmQgdXBsb2FkcyBjaHVua3MgdG8gUzNcbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhSW52b2tlIHRhc2sgZm9yIFBERiBhbmFseXNpcyBhbmQgY2h1bmtpbmcsIG9yIHVuZGVmaW5lZCBpZiBjaHVua2luZyBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBPbmx5IGVuYWJsZSBjaHVua2luZyBpZiBleHBsaWNpdGx5IGNvbmZpZ3VyZWRcbiAgICBpZiAoIXRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZUNodW5raW5nKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBjaHVua2luZ0NvbmZpZyA9IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmNodW5raW5nQ29uZmlnIHx8IHt9O1xuXG4gICAgLy8gQ3JlYXRlIElBTSByb2xlIGZvciBjaHVua2luZyBMYW1iZGEgd2l0aCBsZWFzdCBwcml2aWxlZ2UgcGVybWlzc2lvbnNcbiAgICAvLyBDaHVua2luZyBMYW1iZGEgbmVlZHM6IEdldE9iamVjdCAocmVhZCByYXcgUERGcyksIFB1dE9iamVjdCAod3JpdGUgY2h1bmtzKVxuICAgIGNvbnN0IHJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnQ2h1bmtpbmdMYW1iZGFSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIENodW5raW5nUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucyA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2h1bmtpbmcnLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAvLyBDcmVhdGUgUERGIEFuYWx5c2lzICYgQ2h1bmtpbmcgTGFtYmRhXG4gICAgY29uc3QgY2h1bmtpbmdMYW1iZGEgPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ1BERkNodW5raW5nRnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL3BkZi1jaHVua2luZycpLFxuICAgICAgaW5kZXg6ICdoYW5kbGVyLnB5JyxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICByb2xlLFxuICAgICAgbWVtb3J5U2l6ZTogMjA0OCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQ0hVTktJTkdfU1RSQVRFR1k6IGNodW5raW5nQ29uZmlnLnN0cmF0ZWd5IHx8ICdoeWJyaWQnLFxuICAgICAgICBQQUdFX1RIUkVTSE9MRDogU3RyaW5nKGNodW5raW5nQ29uZmlnLnBhZ2VUaHJlc2hvbGQgfHwgMTAwKSxcbiAgICAgICAgVE9LRU5fVEhSRVNIT0xEOiBTdHJpbmcoY2h1bmtpbmdDb25maWcudG9rZW5UaHJlc2hvbGQgfHwgMTUwMDAwKSxcbiAgICAgICAgQ0hVTktfU0laRTogU3RyaW5nKGNodW5raW5nQ29uZmlnLmNodW5rU2l6ZSB8fCA1MCksXG4gICAgICAgIE9WRVJMQVBfUEFHRVM6IFN0cmluZyhjaHVua2luZ0NvbmZpZy5vdmVybGFwUGFnZXMgfHwgNSksXG4gICAgICAgIE1BWF9UT0tFTlNfUEVSX0NIVU5LOiBTdHJpbmcoY2h1bmtpbmdDb25maWcubWF4VG9rZW5zUGVyQ2h1bmsgfHwgMTAwMDAwKSxcbiAgICAgICAgT1ZFUkxBUF9UT0tFTlM6IFN0cmluZyhjaHVua2luZ0NvbmZpZy5vdmVybGFwVG9rZW5zIHx8IDUwMDApLFxuICAgICAgICBUQVJHRVRfVE9LRU5TX1BFUl9DSFVOSzogU3RyaW5nKGNodW5raW5nQ29uZmlnLnRhcmdldFRva2Vuc1BlckNodW5rIHx8IDgwMDAwKSxcbiAgICAgICAgTUFYX1BBR0VTX1BFUl9DSFVOSzogU3RyaW5nKGNodW5raW5nQ29uZmlnLm1heFBhZ2VzUGVyQ2h1bmsgfHwgOTkpLFxuICAgICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIHRoaXMubWV0cmljU2VydmljZU5hbWUsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICBjaHVua2luZ0xhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrKSB7XG4gICAgICBjaHVua2luZ0xhbWJkYS5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShMYW1iZGFJYW1VdGlscy5nZW5lcmF0ZUxhbWJkYVZQQ1Blcm1pc3Npb25zKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdQREZBbmFseXNpc0FuZENodW5raW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IGNodW5raW5nTGFtYmRhLFxuICAgICAgcmVzdWx0UGF0aDogJyQuY2h1bmtpbmdSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3JlcXVpcmVzQ2h1bmtpbmcuJCc6ICckLlBheWxvYWQucmVxdWlyZXNDaHVua2luZycsXG4gICAgICAgICd0b2tlbkFuYWx5c2lzLiQnOiAnJC5QYXlsb2FkLnRva2VuQW5hbHlzaXMnLFxuICAgICAgICAnc3RyYXRlZ3kuJCc6ICckLlBheWxvYWQuc3RyYXRlZ3knLFxuICAgICAgICAnY2h1bmtzLiQnOiAnJC5QYXlsb2FkLmNodW5rcycsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFkZGl0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGZvciBjaHVua2luZyB0byBiZSBzdG9yZWQgaW4gRHluYW1vREIuXG4gICAqXG4gICAqIFdoZW4gY2h1bmtpbmcgaXMgZW5hYmxlZCwgYWRkcyBmaWVsZHMgZm9yOlxuICAgKiAtIENodW5raW5nRW5hYmxlZDogc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2xlYW4gZmxhZ1xuICAgKiAtIENodW5raW5nU3RyYXRlZ3k6IHN0cmF0ZWd5IHVzZWQgKGZpeGVkLXBhZ2VzLCB0b2tlbi1iYXNlZCwgaHlicmlkKVxuICAgKiAtIFRva2VuQW5hbHlzaXM6IEpTT04gc3RyaW5nIHdpdGggdG9rZW4gYW5hbHlzaXMgcmVzdWx0c1xuICAgKiAtIENodW5rTWV0YWRhdGE6IEpTT04gc3RyaW5nIGFycmF5IHdpdGggY2h1bmsgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQHJldHVybnMgUmVjb3JkIG9mIER5bmFtb0RCIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGNodW5raW5nIG1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc2luZ01ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtb0F0dHJpYnV0ZVZhbHVlPiB7XG4gICAgaWYgKCF0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVDaHVua2luZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBDaHVua2luZ0VuYWJsZWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoXG4gICAgICAgIEpzb25QYXRoLnN0cmluZ0F0KCdTdGF0ZXMuRm9ybWF0KFxcJ3t9XFwnLCAkLmNodW5raW5nUmVzdWx0LnJlcXVpcmVzQ2h1bmtpbmcpJyksXG4gICAgICApLFxuICAgICAgQ2h1bmtpbmdTdHJhdGVneTogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhcbiAgICAgICAgSnNvblBhdGguc3RyaW5nQXQoJyQuY2h1bmtpbmdSZXN1bHQuc3RyYXRlZ3knKSxcbiAgICAgICksXG4gICAgICBUb2tlbkFuYWx5c2lzOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2h1bmtpbmdSZXN1bHQudG9rZW5BbmFseXNpcycpKSxcbiAgICAgICksXG4gICAgICBDaHVua01ldGFkYXRhOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICBKc29uUGF0aC5qc29uVG9TdHJpbmcoSnNvblBhdGgub2JqZWN0QXQoJyQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzJykpLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByb2Nlc3Npbmcgd29ya2Zsb3cgd2l0aCBjb25kaXRpb25hbCBicmFuY2hpbmcgZm9yIGNodW5rZWQgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBXaGVuIGNodW5raW5nIGlzIGVuYWJsZWQsIGNyZWF0ZXMgYSBDaG9pY2UgU3RhdGUgdGhhdDpcbiAgICogLSBSb3V0ZXMgdG8gY2h1bmtlZCBwcm9jZXNzaW5nIGZsb3cgaWYgZG9jdW1lbnQgd2FzIGNodW5rZWRcbiAgICogLSBSb3V0ZXMgdG8gc3RhbmRhcmQgcHJvY2Vzc2luZyBmbG93IGlmIGRvY3VtZW50IHdhcyBub3QgY2h1bmtlZFxuICAgKlxuICAgKiBXaGVuIGNodW5raW5nIGlzIGRpc2FibGVkLCByZXR1cm5zIHRoZSBzdGFuZGFyZCBwcm9jZXNzaW5nIHdvcmtmbG93LlxuICAgKlxuICAgKiBAcmV0dXJucyBTdGVwIEZ1bmN0aW9ucyBjaGFpbiBmb3IgcHJvY2Vzc2luZyB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKTogSUNoYWluYWJsZSB7XG4gICAgLy8gSWYgY2h1bmtpbmcgaXMgbm90IGVuYWJsZWQsIHVzZSBzdGFuZGFyZCB3b3JrZmxvd1xuICAgIGlmICghdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlQ2h1bmtpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENob2ljZSBTdGF0ZSB0byBjaGVjayBpZiBjaHVua2luZyB3YXMgYXBwbGllZFxuICAgIGNvbnN0IGNob2ljZVN0YXRlID0gbmV3IENob2ljZSh0aGlzLCAnQ2hlY2tJZkNodW5rZWQnKTtcblxuICAgIGNob2ljZVN0YXRlXG4gICAgICAud2hlbihcbiAgICAgICAgQ29uZGl0aW9uLmJvb2xlYW5FcXVhbHMoJyQuY2h1bmtpbmdSZXN1bHQucmVxdWlyZXNDaHVua2luZycsIHRydWUpLFxuICAgICAgICB0aGlzLmNyZWF0ZUNodW5rZWRQcm9jZXNzaW5nRmxvdygpLFxuICAgICAgKVxuICAgICAgLm90aGVyd2lzZShcbiAgICAgICAgLy8gUGFzcyAnU3RhbmRhcmQnIHByZWZpeCB0byBhdm9pZCBjb25zdHJ1Y3QgSUQgY29sbGlzaW9ucyB3aXRoIGNodW5rZWQgZmxvd1xuICAgICAgICB0aGlzLmNyZWF0ZVN0YW5kYXJkUHJvY2Vzc2luZ1dvcmtmbG93KCdTdGFuZGFyZCcpLFxuICAgICAgKTtcblxuICAgIHJldHVybiBjaG9pY2VTdGF0ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGNodW5rZWQgcHJvY2Vzc2luZyBmbG93IGZvciBsYXJnZSBkb2N1bWVudHMuXG4gICAqXG4gICAqIFRoaXMgZmxvdzpcbiAgICogMS4gVXNlcyBhIE1hcCBTdGF0ZSB0byBwcm9jZXNzIGVhY2ggY2h1bmsgaW4gcGFyYWxsZWwgKG9yIHNlcXVlbnRpYWxseSlcbiAgICogMi4gRWFjaCBjaHVuayBnb2VzIHRocm91Z2ggY2xhc3NpZmljYXRpb24gYW5kIHByb2Nlc3NpbmdcbiAgICogMy4gUmVzdWx0cyBhcmUgYWdncmVnYXRlZCB1c2luZyB0aGUgYWdncmVnYXRpb24gTGFtYmRhXG4gICAqIDQuIER5bmFtb0RCIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWdncmVnYXRlZCByZXN1bHRcbiAgICogNS4gVGVtcG9yYXJ5IGNodW5rcyBhcmUgY2xlYW5lZCB1cCBmcm9tIFMzXG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIGNoYWluIGZvciBjaHVua2VkIGRvY3VtZW50IHByb2Nlc3NpbmdcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2h1bmtlZFByb2Nlc3NpbmdGbG93KCk6IElDaGFpbmFibGUge1xuICAgIGNvbnN0IGNodW5raW5nQ29uZmlnID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuY2h1bmtpbmdDb25maWcgfHwge307XG4gICAgY29uc3QgbWF4Q29uY3VycmVuY3kgPSBjaHVua2luZ0NvbmZpZy5wcm9jZXNzaW5nTW9kZSA9PT0gJ3NlcXVlbnRpYWwnXG4gICAgICA/IDFcbiAgICAgIDogKGNodW5raW5nQ29uZmlnLm1heENvbmN1cnJlbmN5IHx8IDEwKTtcblxuICAgIC8vIENyZWF0ZSBNYXAgU3RhdGUgZm9yIHByb2Nlc3NpbmcgY2h1bmtzXG4gICAgY29uc3QgbWFwU3RhdGUgPSBuZXcgTWFwKHRoaXMsICdQcm9jZXNzQ2h1bmtzJywge1xuICAgICAgaXRlbXNQYXRoOiAnJC5jaHVua2luZ1Jlc3VsdC5jaHVua3MnLFxuICAgICAgbWF4Q29uY3VycmVuY3ksXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICdkb2N1bWVudElkLiQnOiAnJC5kb2N1bWVudElkJyxcbiAgICAgICAgJ2NodW5rLiQnOiAnJCQuTWFwLkl0ZW0uVmFsdWUnLFxuICAgICAgICAnY2h1bmtJbmRleC4kJzogJyQkLk1hcC5JdGVtLkluZGV4JyxcbiAgICAgICAgJ3RvdGFsQ2h1bmtzLiQnOiAnU3RhdGVzLkFycmF5TGVuZ3RoKCQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzKScsXG4gICAgICAgIC8vIE92ZXJyaWRlIGNvbnRlbnQgdG8gcG9pbnQgdG8gdGhlIGNodW5rIFBERiwgbm90IHRoZSBvcmlnaW5hbCBkb2N1bWVudFxuICAgICAgICAnY29udGVudCc6IHtcbiAgICAgICAgICAnbG9jYXRpb24nOiAnczMnLFxuICAgICAgICAgICdidWNrZXQuJCc6ICckJC5NYXAuSXRlbS5WYWx1ZS5idWNrZXQnLFxuICAgICAgICAgICdrZXkuJCc6ICckJC5NYXAuSXRlbS5WYWx1ZS5rZXknLFxuICAgICAgICAgICdmaWxlbmFtZS4kJzogJyQuY29udGVudC5maWxlbmFtZScsXG4gICAgICAgIH0sXG4gICAgICAgICdjb250ZW50VHlwZS4kJzogJyQuY29udGVudFR5cGUnLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNodW5rUmVzdWx0cycsXG4gICAgfSk7XG5cbiAgICAvLyBEZWZpbmUgcGVyLWNodW5rIHByb2Nlc3Npbmc6IGNsYXNzaWZpY2F0aW9uIOKGkiBwcm9jZXNzaW5nXG4gICAgY29uc3QgY2h1bmtDbGFzc2lmaWNhdGlvbiA9IHRoaXMuY2xhc3NpZmljYXRpb25TdGVwKCk7XG4gICAgY29uc3QgY2h1bmtQcm9jZXNzaW5nID0gdGhpcy5wcm9jZXNzaW5nU3RlcCgpO1xuXG4gICAgbWFwU3RhdGUuaXRlbVByb2Nlc3NvcihcbiAgICAgIGNodW5rQ2xhc3NpZmljYXRpb24ubmV4dChjaHVua1Byb2Nlc3NpbmcpLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYWdncmVnYXRpb24gc3RlcCAoTGFtYmRhIGludm9rZSBvbmx5LCBub3JtYWxpemF0aW9uIGFkZGVkIHNlcGFyYXRlbHkpXG4gICAgY29uc3QgYWdncmVnYXRpb25MYW1iZGFTdGVwID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGlvblN0ZXAoKTtcblxuICAgIC8vIEFkZCBhIFBhc3Mgc3RhdGUgdG8gbm9ybWFsaXplIHRoZSBhZ2dyZWdhdGVkIHJlc3VsdCBmb3IgZG93bnN0cmVhbSBjb21wYXRpYmlsaXR5XG4gICAgLy8gVGhpcyBjb3BpZXMgYWdncmVnYXRlZFJlc3VsdCB0byBwcm9jZXNzaW5nUmVzdWx0IHNvIGVucmljaG1lbnQvcG9zdC1wcm9jZXNzaW5nXG4gICAgLy8gc2VlIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGNodW5raW5nIHdhcyB1c2VkXG4gICAgY29uc3Qgbm9ybWFsaXplU3RhdGUgPSBuZXcgUGFzcyh0aGlzLCAnTm9ybWFsaXplQWdncmVnYXRlZFJlc3VsdCcsIHtcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgJ2RvY3VtZW50SWQuJCc6ICckLmRvY3VtZW50SWQnLFxuICAgICAgICAnY29udGVudFR5cGUuJCc6ICckLmNvbnRlbnRUeXBlJyxcbiAgICAgICAgJ2NvbnRlbnQuJCc6ICckLmNvbnRlbnQnLFxuICAgICAgICAnY2h1bmtpbmdSZXN1bHQuJCc6ICckLmNodW5raW5nUmVzdWx0JyxcbiAgICAgICAgJ2NodW5rUmVzdWx0cy4kJzogJyQuY2h1bmtSZXN1bHRzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0ZWRSZXN1bHQuJCc6ICckLmFnZ3JlZ2F0ZWRSZXN1bHQnLFxuICAgICAgICAvLyBDb3B5IGFnZ3JlZ2F0ZWQgcmVzdWx0IHRvIHByb2Nlc3NpbmdSZXN1bHQgZm9yIGRvd25zdHJlYW0gY29tcGF0aWJpbGl0eVxuICAgICAgICAncHJvY2Vzc2luZ1Jlc3VsdCc6IHtcbiAgICAgICAgICAncmVzdWx0LiQnOiAnJC5hZ2dyZWdhdGVkUmVzdWx0LnJlc3VsdCcsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEFsc28gc2V0IGNsYXNzaWZpY2F0aW9uUmVzdWx0IGZyb20gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgY2h1bmsgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICdjbGFzc2lmaWNhdGlvblJlc3VsdC4kJzogJyQuY2h1bmtSZXN1bHRzWzBdLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgRHluYW1vREIgdXBkYXRlIHN0ZXAgZm9yIGFnZ3JlZ2F0ZWQgcmVzdWx0XG4gICAgY29uc3QgdXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXAgPSB0aGlzLmNyZWF0ZVVwZGF0ZUFnZ3JlZ2F0ZWRSZXN1bHRTdGVwKCk7XG5cbiAgICAvLyBDcmVhdGUgY2xlYW51cCBzdGVwXG4gICAgY29uc3QgY2xlYW51cFN0ZXAgPSB0aGlzLmNyZWF0ZUNsZWFudXBTdGVwKCk7XG5cbiAgICAvLyBDcmVhdGUgbW92ZSB0byBwcm9jZXNzZWQgY2hhaW4gd2l0aCAnQ2h1bmtlZCcgcHJlZml4IHRvIGF2b2lkIElEIGNvbGxpc2lvbnNcbiAgICBjb25zdCBtb3ZlVG9Qcm9jZXNzZWQgPSB0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZVN1Y2Nlc3NDaGFpbih0aGlzLCAnQ2h1bmtlZCcpO1xuXG4gICAgLy8gQ3JlYXRlIGVycm9yIGhhbmRsZXIgZm9yIGFnZ3JlZ2F0aW9uIGZhaWx1cmVzXG4gICAgY29uc3QgYWdncmVnYXRpb25FcnJvckhhbmRsZXIgPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyKCk7XG5cbiAgICAvLyBHZXQgb3B0aW9uYWwgZW5yaWNobWVudCBhbmQgcG9zdC1wcm9jZXNzaW5nIHN0ZXBzXG4gICAgY29uc3QgZW5yaWNobWVudFN0ZXAgPSB0aGlzLmVucmljaG1lbnRTdGVwKCk7XG4gICAgY29uc3QgcG9zdFByb2Nlc3NpbmdTdGVwID0gdGhpcy5wb3N0UHJvY2Vzc2luZ1N0ZXAoKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBmaW5hbCBjaGFpbiBhZnRlciBhZ2dyZWdhdGlvblxuICAgIC8vIENoYWluOiBNYXAgU3RhdGUg4oaSIEFnZ3JlZ2F0aW9uIOKGkiBEeW5hbW9EQiBVcGRhdGUg4oaSIFtFbnJpY2htZW50XSDihpIgW1Bvc3RQcm9jZXNzaW5nXSDihpIgQ2xlYW51cCDihpIgTW92ZSB0byBQcm9jZXNzZWRcbiAgICBsZXQgZmluYWxDaGFpbjogSUNoYWluYWJsZSA9IGNsZWFudXBTdGVwXG4gICAgICAuYWRkUmV0cnkoe1xuICAgICAgICBlcnJvcnM6IFsnTGFtYmRhLlNlcnZpY2VFeGNlcHRpb24nLCAnTGFtYmRhLlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiddLFxuICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXG4gICAgICAgIGJhY2tvZmZSYXRlOiAyLFxuICAgICAgfSlcbiAgICAgIC5uZXh0KG1vdmVUb1Byb2Nlc3NlZCk7XG5cbiAgICAvLyBBZGQgcG9zdC1wcm9jZXNzaW5nIGlmIHByb3ZpZGVkIChpbnNlcnQgYmVmb3JlIGNsZWFudXApXG4gICAgaWYgKHBvc3RQcm9jZXNzaW5nU3RlcCkge1xuICAgICAgY29uc3QgcG9zdFByb2Nlc3NpbmdFcnJvckhhbmRsZXIgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZFBvc3RQcm9jZXNzaW5nRmFpbEREQlVwZGF0ZScsIHtcbiAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgIGtleToge1xuICAgICAgICAgIERvY3VtZW50SWQ6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguc3RyaW5nQXQoJyQuZG9jdW1lbnRJZCcpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgICBleHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctZmFpbHVyZScpLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSkubmV4dCh0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMsICdDaHVua2VkUG9zdFByb2MnKSk7XG5cbiAgICAgIGZpbmFsQ2hhaW4gPSBwb3N0UHJvY2Vzc2luZ1N0ZXBcbiAgICAgICAgLmFkZENhdGNoKHBvc3RQcm9jZXNzaW5nRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgfSlcbiAgICAgICAgLm5leHQoXG4gICAgICAgICAgbmV3IER5bmFtb1VwZGF0ZUl0ZW0odGhpcywgJ0NodW5rZWRQb3N0UHJvY2Vzc2luZ1N1Y2Nlc3NVcGRhdGUnLCB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMsIFBvc3RQcm9jZXNzaW5nUmVzdWx0ID0gOnBvc3RQcm9jZXNzaW5nUmVzdWx0JyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICAgJzpuZXdTdGF0dXMnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdwb3N0LXByb2Nlc3NpbmctY29tcGxldGUnKSxcbiAgICAgICAgICAgICAgJzpwb3N0UHJvY2Vzc2luZ1Jlc3VsdCc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoSnNvblBhdGguanNvblRvU3RyaW5nKEpzb25QYXRoLm9iamVjdEF0KCckLnBvc3RQcm9jZXNzZWRSZXN1bHQnKSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VsdFBhdGg6IEpzb25QYXRoLkRJU0NBUkQsXG4gICAgICAgICAgfSkubmV4dChmaW5hbENoYWluKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZW5yaWNobWVudCBpZiBwcm92aWRlZCAoaW5zZXJ0IGJlZm9yZSBwb3N0LXByb2Nlc3Npbmcgb3IgY2xlYW51cClcbiAgICBpZiAoZW5yaWNobWVudFN0ZXApIHtcbiAgICAgIGNvbnN0IGVucmljaG1lbnRFcnJvckhhbmRsZXIgPSBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZEVucmljaG1lbnRGYWlsRERCVXBkYXRlJywge1xuICAgICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgICAga2V5OiB7XG4gICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVFeHByZXNzaW9uOiAnU0VUIFdvcmtmbG93U3RhdHVzID0gOm5ld1N0YXR1cycsXG4gICAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2VucmljaG1lbnQtZmFpbHVyZScpLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgfSkubmV4dCh0aGlzLmluZ3Jlc3NBZGFwdGVyLmNyZWF0ZUZhaWxlZENoYWluKHRoaXMsICdDaHVua2VkRW5yaWNoJykpO1xuXG4gICAgICBmaW5hbENoYWluID0gZW5yaWNobWVudFN0ZXBcbiAgICAgICAgLmFkZENhdGNoKGVucmljaG1lbnRFcnJvckhhbmRsZXIsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgICAgICB9KVxuICAgICAgICAubmV4dChcbiAgICAgICAgICBuZXcgRHluYW1vVXBkYXRlSXRlbSh0aGlzLCAnQ2h1bmtlZEVucmljaG1lbnRTdWNjZXNzVXBkYXRlJywge1xuICAgICAgICAgICAgdGFibGU6IHRoaXMuZG9jdW1lbnRQcm9jZXNzaW5nVGFibGUsXG4gICAgICAgICAgICBrZXk6IHtcbiAgICAgICAgICAgICAgRG9jdW1lbnRJZDogRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZyhKc29uUGF0aC5zdHJpbmdBdCgnJC5kb2N1bWVudElkJykpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZUV4cHJlc3Npb246ICdTRVQgV29ya2Zsb3dTdGF0dXMgPSA6bmV3U3RhdHVzLCBFbnJpY2htZW50UmVzdWx0ID0gOmVucmljaG1lbnRSZXN1bHQnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgICAnOm5ld1N0YXR1cyc6IHBvc3RQcm9jZXNzaW5nU3RlcFxuICAgICAgICAgICAgICAgID8gRHluYW1vQXR0cmlidXRlVmFsdWUuZnJvbVN0cmluZygnZW5yaWNobWVudC1jb21wbGV0ZScpXG4gICAgICAgICAgICAgICAgOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKCdjb21wbGV0ZScpLFxuICAgICAgICAgICAgICAnOmVucmljaG1lbnRSZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5lbnJpY2hlZFJlc3VsdCcpKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICAgICAgICB9KS5uZXh0KGZpbmFsQ2hhaW4pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIENoYWluOiBNYXAgU3RhdGUg4oaSIEFnZ3JlZ2F0aW9uIOKGkiBOb3JtYWxpemUg4oaSIER5bmFtb0RCIFVwZGF0ZSDihpIgW0VucmljaG1lbnRdIOKGkiBbUG9zdFByb2Nlc3NpbmddIOKGkiBDbGVhbnVwIOKGkiBNb3ZlIHRvIFByb2Nlc3NlZFxuICAgIHJldHVybiBtYXBTdGF0ZVxuICAgICAgLmFkZENhdGNoKGFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgIHJlc3VsdFBhdGg6ICckLmVycm9yJyxcbiAgICAgIH0pXG4gICAgICAubmV4dChcbiAgICAgICAgYWdncmVnYXRpb25MYW1iZGFTdGVwXG4gICAgICAgICAgLmFkZENhdGNoKGFnZ3JlZ2F0aW9uRXJyb3JIYW5kbGVyLCB7XG4gICAgICAgICAgICByZXN1bHRQYXRoOiAnJC5lcnJvcicsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYWRkUmV0cnkoe1xuICAgICAgICAgICAgZXJyb3JzOiBbJ0xhbWJkYS5TZXJ2aWNlRXhjZXB0aW9uJywgJ0xhbWJkYS5Ub29NYW55UmVxdWVzdHNFeGNlcHRpb24nXSxcbiAgICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXG4gICAgICAgICAgICBiYWNrb2ZmUmF0ZTogMixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5uZXh0KFxuICAgICAgICAgICAgbm9ybWFsaXplU3RhdGUubmV4dChcbiAgICAgICAgICAgICAgdXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXBcbiAgICAgICAgICAgICAgICAuYWRkUmV0cnkoe1xuICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbJ0R5bmFtb0RCLlByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkRXhjZXB0aW9uJ10sXG4gICAgICAgICAgICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygxKSxcbiAgICAgICAgICAgICAgICAgIG1heEF0dGVtcHRzOiAzLFxuICAgICAgICAgICAgICAgICAgYmFja29mZlJhdGU6IDIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAubmV4dChmaW5hbENoYWluKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYWdncmVnYXRpb24gc3RlcCBmb3IgY29tYmluaW5nIGNodW5rIHJlc3VsdHMgdXNpbmcgQmVkcm9jay5cbiAgICpcbiAgICogVXNlcyB0aGUgc2FtZSBCZWRyb2NrIGludm9rZSBMYW1iZGEgcGF0dGVybiBhcyB0aGUgcHJvY2Vzc2luZyBzdGVwIGJ1dCB3aXRoXG4gICAqIGEgZGlmZmVyZW50IHByb21wdCBkZXNpZ25lZCBmb3IgYWdncmVnYXRpbmcgbXVsdGlwbGUgY2h1bmsgcmVzdWx0cy5cbiAgICogVGhlIGNodW5rIHByb2Nlc3NpbmcgcmVzdWx0cyBhcmUgcGFzc2VkIGFzIHRleHQgZGF0YSB0byB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYUludm9rZSB0YXNrIGZvciByZXN1bHQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRpb25TdGVwKCk6IExhbWJkYUludm9rZSB7XG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiBvbmx5IG9uY2UgKHJldXNlcyBiZWRyb2NrLWludm9rZSBwYXR0ZXJuKVxuICAgIGlmICghdGhpcy5fYWdncmVnYXRpb25GdW5jdGlvbikge1xuICAgICAgY29uc3QgcHJvbXB0ID0gdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuYWdncmVnYXRpb25Qcm9tcHQgfHwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy5ERUZBVUxUX0FHR1JFR0FUSU9OX1BST01QVDtcbiAgICAgIGNvbnN0IGFkanVzdGVkTW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMucHJvY2Vzc2luZ0JlZHJvY2tNb2RlbCk7XG4gICAgICBjb25zdCByb2xlID0gdGhpcy5nZW5lcmF0ZUxhbWJkYVJvbGVGb3JCZWRyb2NrKCdBZ2dyZWdhdGlvbkxhbWJkYVJvbGUnLCB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5wcm9jZXNzaW5nQmVkcm9ja01vZGVsKTtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3QgZ2VuZXJhdGVkTG9nUGVybWlzc2lvbnMgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgICBhY2NvdW50LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdiZWRyb2NrLWlkcC1hZ2dyZWdhdGlvbicsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRnVuY3Rpb24gPSBuZXcgUHl0aG9uRnVuY3Rpb24odGhpcywgJ0JlZHJvY2tBZ2dyZWdhdGlvbkZ1bmN0aW9uJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBydW50aW1lOiBEZWZhdWx0UnVudGltZXMuUFlUSE9OLFxuICAgICAgICBlbnRyeTogdGhpcy5yZXNvbHZlQmVkcm9ja0ludm9rZUVudHJ5KCksXG4gICAgICAgIHJvbGUsXG4gICAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLnN0ZXBUaW1lb3V0cyB8fCBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIE1PREVMX0lEOiBhZGp1c3RlZE1vZGVsSWQsXG4gICAgICAgICAgUFJPTVBUOiBwcm9tcHQsXG4gICAgICAgICAgSU5WT0tFX1RZUEU6IEludm9rZVR5cGUuQUdHUkVHQVRJT04sXG4gICAgICAgICAgSU5WT0tFX01BWF9UT0tFTlM6ICc2NDAwMCcsIC8vIEFnZ3JlZ2F0aW9uIG1heSBuZWVkIG1vcmUgdG9rZW5zIGZvciBtZXJnZWQgb3V0cHV0XG4gICAgICAgICAgLi4uUG93ZXJ0b29sc0NvbmZpZy5nZW5lcmF0ZURlZmF1bHRMYW1iZGFDb25maWcoXG4gICAgICAgICAgICB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICB0aGlzLm1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICB2cGM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsudnBjXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmtcbiAgICAgICAgICA/IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgICAgdGhpcy5fYWdncmVnYXRpb25GdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9hZ2dyZWdhdGlvbkZ1bmN0aW9uLnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KExhbWJkYUlhbVV0aWxzLmdlbmVyYXRlTGFtYmRhVlBDUGVybWlzc2lvbnMoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGNyZWF0ZSBhIG5ldyBMYW1iZGFJbnZva2UgdGFzayB0byBhbGxvdyBwcm9wZXIgc3RhdGUgY2hhaW5pbmdcbiAgICBjb25zdCBzdGVwSWQgPSBgQWdncmVnYXRpb25TdGVwLSR7dGhpcy5fYWdncmVnYXRpb25TdGVwQ291bnRlcn1gO1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uU3RlcENvdW50ZXIrKztcblxuICAgIC8vIFBhc3MgY2h1bmsgcmVzdWx0cyBhcyBkYXRhIGNvbnRlbnQgLSB0aGUgTGFtYmRhIHdpbGwgZm9ybWF0IHRoZW0gZm9yIEJlZHJvY2tcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9hZ2dyZWdhdGlvbkZ1bmN0aW9uLFxuICAgICAgcGF5bG9hZDogVGFza0lucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAnZG9jdW1lbnRJZC4kJzogJyQuZG9jdW1lbnRJZCcsXG4gICAgICAgICdjb250ZW50VHlwZSc6ICdkYXRhJyxcbiAgICAgICAgJ2NvbnRlbnQnOiB7XG4gICAgICAgICAgLy8gUGFzcyB0aGUgY2h1bmsgcmVzdWx0cyBhcyBKU09OIHN0cmluZyBmb3IgdGhlIExhbWJkYSB0byBwcm9jZXNzXG4gICAgICAgICAgJ2RhdGEuJCc6ICdTdGF0ZXMuSnNvblRvU3RyaW5nKCQuY2h1bmtSZXN1bHRzKScsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIC8vIFN0b3JlIGluIGJvdGggYWdncmVnYXRlZFJlc3VsdCBBTkQgcHJvY2Vzc2luZ1Jlc3VsdCBmb3IgY29uc2lzdGVuY3kgd2l0aCBub24tY2h1bmtlZCBmbG93XG4gICAgICAvLyBUaGlzIGFsbG93cyBlbnJpY2htZW50L3Bvc3QtcHJvY2Vzc2luZyBzdGVwcyB0byB1c2UgJC5wcm9jZXNzaW5nUmVzdWx0IHJlZ2FyZGxlc3Mgb2YgY2h1bmtpbmdcbiAgICAgIHJlc3VsdFBhdGg6ICckLmFnZ3JlZ2F0ZWRSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3Jlc3VsdC4kJzogJyQuUGF5bG9hZC5yZXN1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBEeW5hbW9EQiB1cGRhdGUgc3RlcCBmb3Igc3RvcmluZyBhZ2dyZWdhdGVkIHJlc3VsdHMuXG4gICAqXG4gICAqIFVwZGF0ZXMgdGhlIGRvY3VtZW50IHJlY29yZCB3aXRoOlxuICAgKiAtIEFnZ3JlZ2F0ZWRSZXN1bHQ6IEpTT04gc3RyaW5nIHdpdGggY2xhc3NpZmljYXRpb24sIGVudGl0aWVzLCBhbmQgc3VtbWFyeVxuICAgKiAtIFdvcmtmbG93U3RhdHVzOiAnY29tcGxldGUnXG4gICAqXG4gICAqIEByZXR1cm5zIER5bmFtb1VwZGF0ZUl0ZW0gdGFzayBmb3Igc3RvcmluZyBhZ2dyZWdhdGVkIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVXBkYXRlQWdncmVnYXRlZFJlc3VsdFN0ZXAoKTogRHluYW1vVXBkYXRlSXRlbSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdTdG9yZUFnZ3JlZ2F0ZWRSZXN1bHQnLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGtleToge1xuICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICB9LFxuICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBBZ2dyZWdhdGVkUmVzdWx0ID0gOnJlc3VsdCwgV29ya2Zsb3dTdGF0dXMgPSA6c3RhdHVzJyxcbiAgICAgIGV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgJzpyZXN1bHQnOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKFxuICAgICAgICAgIEpzb25QYXRoLmpzb25Ub1N0cmluZyhKc29uUGF0aC5vYmplY3RBdCgnJC5hZ2dyZWdhdGVkUmVzdWx0JykpLFxuICAgICAgICApLFxuICAgICAgICAnOnN0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2NvbXBsZXRlJyksXG4gICAgICB9LFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBjbGVhbnVwIExhbWJkYSBzdGVwIGZvciByZW1vdmluZyB0ZW1wb3JhcnkgY2h1bmsgZmlsZXMuXG4gICAqXG4gICAqIFRoZSBjbGVhbnVwIExhbWJkYTpcbiAgICogLSBEZWxldGVzIGFsbCBjaHVuayBmaWxlcyBmcm9tIFMzIGNodW5rcy8gcHJlZml4XG4gICAqIC0gVXNlcyBiYXRjaCBkZWxldGUgZm9yIGVmZmljaWVuY3kgKHVwIHRvIDEwMDAgb2JqZWN0cyBwZXIgcmVxdWVzdClcbiAgICogLSBMb2dzIGVycm9ycyBidXQgZG9lc24ndCBmYWlsIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcmV0dXJucyBMYW1iZGFJbnZva2UgdGFzayBmb3IgY2h1bmsgY2xlYW51cFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwU3RlcCgpOiBMYW1iZGFJbnZva2Uge1xuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb24gb25seSBvbmNlXG4gICAgaWYgKCF0aGlzLl9jbGVhbnVwRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgICAgY29uc3Qgcm9sZSA9IG5ldyBSb2xlKHRoaXMsICdDbGVhbnVwTGFtYmRhUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICBDbGVhbnVwUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICAvLyBTMyBhY2Nlc3MgZm9yIGRlbGV0aW5nIGNodW5rcyBvbmx5IC0gbGVhc3QgcHJpdmlsZWdlXG4gICAgICAgICAgICAgIC4uLnRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoWydzMzpEZWxldGVPYmplY3QnXSwgdHJ1ZSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiAnYmVkcm9jay1pZHAtY2xlYW51cCcsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRoaXMuYmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQocm9sZSk7XG5cbiAgICAgIHRoaXMuX2NsZWFudXBGdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQ2xlYW51cEZ1bmN0aW9uJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGdlbmVyYXRlZExvZ1Blcm1pc3Npb25zLnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvY2xlYW51cCcpLFxuICAgICAgICBpbmRleDogJ2hhbmRsZXIucHknLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICAgICAgdGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgICAgIHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgICAgdGhpcy5tZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudEVuY3J5cHRpb246IHRoaXMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgdnBjOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLnZwY1xuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB2cGNTdWJuZXRzOiB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrXG4gICAgICAgICAgPyB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZW5lcmF0ZWRMb2dQZXJtaXNzaW9ucy5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXBGdW5jdGlvbi5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5iZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMubmV0d29yaykge1xuICAgICAgICB0aGlzLl9jbGVhbnVwRnVuY3Rpb24ucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnQ2xlYW51cENodW5rcycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9jbGVhbnVwRnVuY3Rpb24sXG4gICAgICBwYXlsb2FkOiBUYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICdkb2N1bWVudElkLiQnOiAnJC5kb2N1bWVudElkJyxcbiAgICAgICAgJ2NodW5rcy4kJzogJyQuY2h1bmtpbmdSZXN1bHQuY2h1bmtzJyxcbiAgICAgIH0pLFxuICAgICAgcmVzdWx0UGF0aDogSnNvblBhdGguRElTQ0FSRCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBoYW5kbGVyIGZvciBhZ2dyZWdhdGlvbiBmYWlsdXJlcy5cbiAgICpcbiAgICogV2hlbiBhZ2dyZWdhdGlvbiBmYWlsczpcbiAgICogLSBVcGRhdGVzIER5bmFtb0RCIHdpdGggJ2FnZ3JlZ2F0aW9uLWZhaWx1cmUnIHN0YXR1c1xuICAgKiAtIE1vdmVzIGRvY3VtZW50IHRvIGZhaWxlZC8gcHJlZml4XG4gICAqXG4gICAqIEByZXR1cm5zIFN0ZXAgRnVuY3Rpb25zIGNoYWluIGZvciBoYW5kbGluZyBhZ2dyZWdhdGlvbiBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRpb25FcnJvckhhbmRsZXIoKTogSUNoYWluYWJsZSB7XG4gICAgY29uc3QgdXBkYXRlRmFpbHVyZVN0YXR1cyA9IG5ldyBEeW5hbW9VcGRhdGVJdGVtKHRoaXMsICdBZ2dyZWdhdGlvbkZhaWxEREJVcGRhdGUnLCB7XG4gICAgICB0YWJsZTogdGhpcy5kb2N1bWVudFByb2Nlc3NpbmdUYWJsZSxcbiAgICAgIGtleToge1xuICAgICAgICBEb2N1bWVudElkOiBEeW5hbW9BdHRyaWJ1dGVWYWx1ZS5mcm9tU3RyaW5nKEpzb25QYXRoLnN0cmluZ0F0KCckLmRvY3VtZW50SWQnKSksXG4gICAgICB9LFxuICAgICAgdXBkYXRlRXhwcmVzc2lvbjogJ1NFVCBXb3JrZmxvd1N0YXR1cyA9IDpuZXdTdGF0dXMnLFxuICAgICAgZXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAnOm5ld1N0YXR1cyc6IER5bmFtb0F0dHJpYnV0ZVZhbHVlLmZyb21TdHJpbmcoJ2FnZ3JlZ2F0aW9uLWZhaWx1cmUnKSxcbiAgICAgIH0sXG4gICAgICByZXN1bHRQYXRoOiBKc29uUGF0aC5ESVNDQVJELFxuICAgIH0pO1xuXG4gICAgLy8gVXNlICdDaHVua2VkJyBwcmVmaXggdG8gYXZvaWQgSUQgY29sbGlzaW9ucyB3aXRoIHN0YW5kYXJkIHdvcmtmbG93XG4gICAgY29uc3QgbW92ZVRvRmFpbGVkID0gdGhpcy5pbmdyZXNzQWRhcHRlci5jcmVhdGVGYWlsZWRDaGFpbih0aGlzLCAnQ2h1bmtlZCcpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZUZhaWx1cmVTdGF0dXMubmV4dChtb3ZlVG9GYWlsZWQpO1xuICB9XG59XG4iXX0=