@cdklabs/cdk-appmod-catalog-blueprints 1.16.1 → 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 (81) hide show
  1. package/.jsii +963 -146
  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.d.ts +1 -0
  6. package/lib/document-processing/bedrock-document-processing.js +117 -70
  7. package/lib/document-processing/default-document-processing-config.js +3 -5
  8. package/lib/document-processing/index.d.ts +2 -0
  9. package/lib/document-processing/index.js +3 -1
  10. package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
  11. package/lib/document-processing/localstack-agentic-document-processing.js +99 -0
  12. package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
  13. package/lib/document-processing/localstack-bedrock-document-processing.js +69 -0
  14. package/lib/document-processing/resources/cleanup/handler.py +16 -1
  15. package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
  16. package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
  17. package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
  18. package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
  19. package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
  20. package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
  21. package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
  22. package/lib/document-processing/tests/base-document-processing.test.js +12 -1
  23. package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
  24. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +111 -0
  25. package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
  26. package/lib/document-processing/tests/localstack-document-processing.test.js +149 -0
  27. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
  28. package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
  29. package/lib/framework/agents/base-agent.js +31 -4
  30. package/lib/framework/agents/batch-agent.d.ts +1 -0
  31. package/lib/framework/agents/batch-agent.js +42 -7
  32. package/lib/framework/agents/default-agent-config.js +3 -5
  33. package/lib/framework/agents/index.d.ts +1 -0
  34. package/lib/framework/agents/index.js +2 -1
  35. package/lib/framework/agents/interactive-agent.js +115 -23
  36. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
  37. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
  38. package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
  39. package/lib/framework/agents/localstack-batch-agent.js +64 -0
  40. package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
  41. package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
  42. package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
  43. package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
  44. package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
  45. package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
  46. package/lib/framework/bedrock/bedrock.d.ts +9 -0
  47. package/lib/framework/bedrock/bedrock.js +20 -12
  48. package/lib/framework/custom-resource/default-runtimes.js +20 -22
  49. package/lib/framework/foundation/access-log.js +50 -7
  50. package/lib/framework/foundation/eventbridge-broker.js +5 -4
  51. package/lib/framework/foundation/network.js +4 -4
  52. package/lib/framework/index.d.ts +1 -0
  53. package/lib/framework/index.js +2 -1
  54. package/lib/framework/localstack/index.d.ts +1 -0
  55. package/lib/framework/localstack/index.js +18 -0
  56. package/lib/framework/localstack/localstack-config.d.ts +79 -0
  57. package/lib/framework/localstack/localstack-config.js +47 -0
  58. package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
  59. package/lib/framework/tests/batch-agent.test.js +35 -2
  60. package/lib/framework/tests/framework-nag.test.js +35 -2
  61. package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
  62. package/lib/framework/tests/interactive-agent.test.js +35 -2
  63. package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
  64. package/lib/framework/tests/localstack-batch-agent.test.js +100 -0
  65. package/lib/utilities/data-loader.js +50 -5
  66. package/lib/utilities/lambda-iam-utils.js +38 -7
  67. package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
  68. package/lib/utilities/observability/bedrock-observability.js +38 -2
  69. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
  70. package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
  71. package/lib/utilities/observability/default-observability-config.js +6 -8
  72. package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
  73. package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
  74. package/lib/utilities/observability/observability.js +47 -6
  75. package/lib/utilities/observability/powertools-config.js +2 -4
  76. package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
  77. package/lib/webapp/frontend-construct.js +46 -5
  78. package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
  79. package/lib/webapp/tests/frontend-construct.test.js +36 -3
  80. package/package.json +60 -61
  81. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -1,11 +1,43 @@
1
1
  "use strict";
2
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
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.InteractiveAgent = exports.AgentCoreRuntimeHostingAdapter = exports.NetworkMode = exports.LambdaHostingAdapter = exports.NoAuthenticator = exports.DynamoDBSessionIndex = exports.CognitoAuthenticator = exports.NullConversationManager = exports.SlidingWindowConversationManager = exports.S3SessionManager = exports.StreamingHttpAdapter = 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_cdk_lib_1 = require("aws-cdk-lib");
10
42
  const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
11
43
  const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
@@ -65,6 +97,21 @@ const custom_resource_1 = require("../custom-resource");
65
97
  * ```
66
98
  */
67
99
  class StreamingHttpAdapter {
100
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.17.1" };
101
+ /**
102
+ * The REST API Gateway.
103
+ */
104
+ restApi;
105
+ /**
106
+ * The Cognito User Pools authorizer (if Cognito authentication is enabled).
107
+ */
108
+ cognitoAuthorizer;
109
+ /**
110
+ * The API endpoint URL.
111
+ */
112
+ apiEndpoint;
113
+ props;
114
+ scope;
68
115
  constructor(props = {}) {
69
116
  this.props = props;
70
117
  }
@@ -188,8 +235,6 @@ class StreamingHttpAdapter {
188
235
  }
189
236
  }
190
237
  exports.StreamingHttpAdapter = StreamingHttpAdapter;
191
- _a = JSII_RTTI_SYMBOL_1;
192
- StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.16.1" };
193
238
  /**
194
239
  * S3-based session manager for persisting conversation state.
195
240
  *
@@ -229,6 +274,15 @@ StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Stream
229
274
  * is no longer needed to configure session persistence.
230
275
  */
231
276
  class S3SessionManager {
277
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.17.1" };
278
+ /**
279
+ * The S3 bucket used for session storage.
280
+ */
281
+ bucket;
282
+ /**
283
+ * The session TTL duration.
284
+ */
285
+ sessionTTL;
232
286
  constructor(scope, id, props = {}) {
233
287
  const removalPolicy = props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY;
234
288
  const sessionTTL = props.sessionTTL || aws_cdk_lib_1.Duration.hours(24);
@@ -265,8 +319,6 @@ class S3SessionManager {
265
319
  }
266
320
  }
267
321
  exports.S3SessionManager = S3SessionManager;
268
- _b = JSII_RTTI_SYMBOL_1;
269
- S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.16.1" };
270
322
  /**
271
323
  * Sliding window conversation manager for maintaining recent conversation history.
272
324
  *
@@ -294,6 +346,11 @@ S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionM
294
346
  * conversation windowing natively.
295
347
  */
296
348
  class SlidingWindowConversationManager {
349
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.17.1" };
350
+ /**
351
+ * The window size (number of messages to keep).
352
+ */
353
+ windowSize;
297
354
  constructor(props = {}) {
298
355
  const windowSize = props.windowSize !== undefined ? props.windowSize : 20;
299
356
  if (windowSize < 1 || windowSize > 1000) {
@@ -313,8 +370,6 @@ class SlidingWindowConversationManager {
313
370
  }
314
371
  }
315
372
  exports.SlidingWindowConversationManager = SlidingWindowConversationManager;
316
- _c = JSII_RTTI_SYMBOL_1;
317
- SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.16.1" };
318
373
  /**
319
374
  * Null conversation manager for stateless interactions.
320
375
  *
@@ -325,6 +380,7 @@ SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-bluep
325
380
  * To disable conversation history, omit the session bucket configuration.
326
381
  */
327
382
  class NullConversationManager {
383
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.17.1" };
328
384
  /**
329
385
  * Get environment variables for Lambda configuration.
330
386
  */
@@ -336,8 +392,6 @@ class NullConversationManager {
336
392
  }
337
393
  }
338
394
  exports.NullConversationManager = NullConversationManager;
339
- _d = JSII_RTTI_SYMBOL_1;
340
- NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.16.1" };
341
395
  /**
342
396
  * Cognito-based authenticator for securing REST API endpoints.
343
397
  *
@@ -372,6 +426,17 @@ NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Nul
372
426
  * ```
373
427
  */
374
428
  class CognitoAuthenticator {
429
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.17.1" };
430
+ /**
431
+ * The Cognito User Pool.
432
+ */
433
+ userPool;
434
+ /**
435
+ * The Cognito User Pool Client.
436
+ */
437
+ userPoolClient;
438
+ scope;
439
+ removalPolicy;
375
440
  constructor(props = {}) {
376
441
  this.userPool = props.userPool;
377
442
  this.userPoolClient = props.userPoolClient;
@@ -459,8 +524,6 @@ class CognitoAuthenticator {
459
524
  }
460
525
  }
461
526
  exports.CognitoAuthenticator = CognitoAuthenticator;
462
- _e = JSII_RTTI_SYMBOL_1;
463
- CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.16.1" };
464
527
  /**
465
528
  * DynamoDB-based session index for fast user to session lookups.
466
529
  *
@@ -501,6 +564,15 @@ CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Cognit
501
564
  * ```
502
565
  */
503
566
  class DynamoDBSessionIndex {
567
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DynamoDBSessionIndex", version: "1.17.1" };
568
+ /**
569
+ * The DynamoDB table used for session index storage.
570
+ */
571
+ table;
572
+ /**
573
+ * The session TTL duration (if configured).
574
+ */
575
+ sessionTTL;
504
576
  constructor(scope, id, props = {}) {
505
577
  const removalPolicy = props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY;
506
578
  // Use provided table or create new one
@@ -546,8 +618,6 @@ class DynamoDBSessionIndex {
546
618
  }
547
619
  }
548
620
  exports.DynamoDBSessionIndex = DynamoDBSessionIndex;
549
- _f = JSII_RTTI_SYMBOL_1;
550
- DynamoDBSessionIndex[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DynamoDBSessionIndex", version: "1.16.1" };
551
621
  /**
552
622
  * No-authentication authenticator for development and testing.
553
623
  *
@@ -560,6 +630,7 @@ DynamoDBSessionIndex[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Dynamo
560
630
  * This authenticator provides NO security. Never use in production.
561
631
  */
562
632
  class NoAuthenticator {
633
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.17.1" };
563
634
  /**
564
635
  * No-op for NoAuthenticator since no authentication is performed.
565
636
  */
@@ -576,8 +647,6 @@ class NoAuthenticator {
576
647
  }
577
648
  }
578
649
  exports.NoAuthenticator = NoAuthenticator;
579
- _g = JSII_RTTI_SYMBOL_1;
580
- NoAuthenticator[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.16.1" };
581
650
  /**
582
651
  * Lambda hosting adapter for InteractiveAgent.
583
652
  *
@@ -592,6 +661,12 @@ NoAuthenticator[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthentic
592
661
  * ```
593
662
  */
594
663
  class LambdaHostingAdapter {
664
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.17.1" };
665
+ /** The communication adapter. */
666
+ communicationAdapter;
667
+ /** The authenticator. */
668
+ authenticator;
669
+ props;
595
670
  constructor(props = {}) {
596
671
  this.props = props;
597
672
  }
@@ -722,8 +797,6 @@ class LambdaHostingAdapter {
722
797
  }
723
798
  }
724
799
  exports.LambdaHostingAdapter = LambdaHostingAdapter;
725
- _h = JSII_RTTI_SYMBOL_1;
726
- LambdaHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.16.1" };
727
800
  /**
728
801
  * Configuration properties for AgentCoreRuntimeHostingAdapter.
729
802
  */
@@ -793,6 +866,8 @@ var NetworkMode;
793
866
  * ```
794
867
  */
795
868
  class AgentCoreRuntimeHostingAdapter {
869
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.17.1" };
870
+ props;
796
871
  constructor(props = {}) {
797
872
  this.props = props;
798
873
  }
@@ -1066,8 +1141,6 @@ class AgentCoreRuntimeHostingAdapter {
1066
1141
  }
1067
1142
  }
1068
1143
  exports.AgentCoreRuntimeHostingAdapter = AgentCoreRuntimeHostingAdapter;
1069
- _j = JSII_RTTI_SYMBOL_1;
1070
- AgentCoreRuntimeHostingAdapter[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.16.1" };
1071
1144
  /**
1072
1145
  * Interactive Agent for real-time conversational AI with SSE streaming.
1073
1146
  *
@@ -1120,6 +1193,27 @@ AgentCoreRuntimeHostingAdapter[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-bluepri
1120
1193
  * ```
1121
1194
  */
1122
1195
  class InteractiveAgent extends base_agent_1.BaseAgent {
1196
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.InteractiveAgent", version: "1.17.1" };
1197
+ agentFunction;
1198
+ adapter;
1199
+ sessionStore;
1200
+ contextStrategy;
1201
+ authenticator;
1202
+ apiEndpoint;
1203
+ sessionBucket;
1204
+ cfnRuntime;
1205
+ /**
1206
+ * The session index for fast user to session lookups.
1207
+ */
1208
+ sessionIndex;
1209
+ /**
1210
+ * The REST API Gateway (only available when using LambdaHostingAdapter with StreamingHttpAdapter).
1211
+ */
1212
+ restApi;
1213
+ /**
1214
+ * The Cognito User Pools authorizer (only available when using LambdaHostingAdapter with CognitoAuthenticator).
1215
+ */
1216
+ cognitoAuthorizer;
1123
1217
  constructor(scope, id, props) {
1124
1218
  // Determine hosting adapter BEFORE super() so we can pass its trust principal
1125
1219
  const hostingAdapter = props.hostingAdapter || new LambdaHostingAdapter({
@@ -1274,6 +1368,4 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
1274
1368
  }
1275
1369
  }
1276
1370
  exports.InteractiveAgent = InteractiveAgent;
1277
- _k = JSII_RTTI_SYMBOL_1;
1278
- InteractiveAgent[_k] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.InteractiveAgent", version: "1.16.1" };
1279
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDZDQUF3RjtBQUN4RiwrREFTb0M7QUFDcEMsMkVBQWtGO0FBQ2xGLHlEQUF5SDtBQUN6SCwyREFBc0g7QUFDdEgsaURBQXFGO0FBQ3JGLCtEQUE4RDtBQUM5RCxpREFBa0c7QUFFbEcsdURBQXVIO0FBQ3ZILCtDQUEwRjtBQUUxRiw2Q0FBeUQ7QUFDekQsK0NBQTBFO0FBQzFFLGlFQUE0RDtBQUM1RCwrQ0FBbUU7QUFDbkUsaUVBQTJFO0FBQzNFLHdDQUErQztBQUMvQyx3REFBcUQ7QUFzRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBYSxvQkFBb0I7SUFtQi9CLFlBQVksUUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsY0FBeUI7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztRQUNqRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUUsTUFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsNEJBQTRCO1FBQzVCLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSx3QkFBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ2pELFdBQVcsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFVBQVU7WUFDeEQsV0FBVyxFQUFFLG9EQUFvRDtZQUNqRSxhQUFhLEVBQUUsQ0FBQyw2QkFBWSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxhQUFhLEVBQUU7Z0JBQ2IsU0FBUztnQkFDVCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTO2dCQUNuRCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVO2FBQ3REO1lBQ0QsMkJBQTJCLEVBQUU7Z0JBQzNCLFlBQVksRUFBRSxxQkFBSSxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRSxnQkFBZ0I7Z0JBQzlCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUM7YUFDaEQ7U0FDRixDQUFDLENBQUM7UUFDRixJQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUVoQyw2REFBNkQ7UUFDN0QscUVBQXFFO1FBQ3JFLDZFQUE2RTtRQUM3RSxJQUFJLGdDQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtZQUNuRCxPQUFPO1lBQ1AsSUFBSSxFQUFFLDZCQUFZLENBQUMsV0FBVztZQUM5QixlQUFlLEVBQUU7Z0JBQ2YsNkJBQTZCLEVBQUUsS0FBSztnQkFDcEMsOEJBQThCLEVBQUUsOEJBQThCO2dCQUM5RCw4QkFBOEIsRUFBRSxJQUFJLHNCQUFzQixHQUFHO2FBQzlEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxnQ0FBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7WUFDbkQsT0FBTztZQUNQLElBQUksRUFBRSw2QkFBWSxDQUFDLFdBQVc7WUFDOUIsZUFBZSxFQUFFO2dCQUNmLDZCQUE2QixFQUFFLEtBQUs7Z0JBQ3BDLDhCQUE4QixFQUFFLDhCQUE4QjtnQkFDOUQsOEJBQThCLEVBQUUsSUFBSSxzQkFBc0IsR0FBRzthQUM5RDtTQUNGLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixNQUFNLGlCQUFpQixHQUFHLElBQUksa0NBQWlCLENBQUMsY0FBYyxFQUFFO1lBQzlELEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELCtCQUErQjtRQUMvQixJQUFJLGlCQUFpQixHQUFHLGtDQUFpQixDQUFDLElBQUksQ0FBQztRQUMvQyxJQUFJLFVBQWtELENBQUM7UUFFdkQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsWUFBWSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsRyxVQUFVLEdBQUcsSUFBSSwyQ0FBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFO2dCQUMzRSxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDckQsY0FBYyxFQUFFLG1CQUFtQjthQUNwQyxDQUFDLENBQUM7WUFDRixJQUFZLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDO1lBQzdDLGlCQUFpQixHQUFHLGtDQUFpQixDQUFDLE9BQU8sQ0FBQztRQUNoRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7WUFDbkUsaUJBQWlCO1lBQ2pCLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFFSCwwREFBMEQ7UUFDMUQsb0RBQW9EO1FBQ3BELHFEQUFxRDtRQUNyRCxpRUFBaUU7UUFDakUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFtQixDQUFDO1FBQ3RELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxTQUFTLENBQUMsbUJBQW1CLENBQUMsa0NBQWtDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDNUUsMEVBQTBFO1lBQzFFLE1BQU0sTUFBTSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDM0MsU0FBUyxDQUFDLG1CQUFtQixDQUMzQixpQkFBaUIsRUFDakIsc0JBQXNCLE1BQU0scUNBQXFDLGNBQWMsQ0FBQyxXQUFXLGlDQUFpQyxDQUM3SCxDQUFDO1lBQ0Ysb0RBQW9EO1lBQ3BELFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLGNBQWMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDL0MsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsMEJBQTBCLENBQUM7WUFDM0QsU0FBUyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtTQUN0QyxDQUFDLENBQUM7UUFFSCxpREFBaUQ7UUFDakQsY0FBYyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRTtZQUNyRCxTQUFTLEVBQUUsSUFBSSwwQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztZQUMzRCxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFDcEQsTUFBTSxFQUFFLDBCQUEwQjtTQUNuQyxDQUFDLENBQUM7UUFFSCx5QkFBeUI7UUFDekIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxJQUFZLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUVoQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsZUFBMEI7UUFDcEMscUVBQXFFO1FBQ3JFLHVFQUF1RTtJQUN6RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQzs7QUE5Skgsb0RBK0pDOzs7QUE2REQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFhLGdCQUFnQjtJQVczQixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQStCLEVBQUU7UUFDekUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSwyQkFBYSxDQUFDLE9BQU8sQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLHNCQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFELHdDQUF3QztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxlQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7WUFDN0QsVUFBVSxFQUFFLHlCQUFnQixDQUFDLEdBQUc7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGFBQWEsRUFBRSxhQUFhO1lBQzVCLGlCQUFpQixFQUFFLGFBQWEsS0FBSywyQkFBYSxDQUFDLE9BQU87WUFDMUQsY0FBYyxFQUFFO2dCQUNkO29CQUNFLEVBQUUsRUFBRSxtQkFBbUI7b0JBQ3ZCLFVBQVUsRUFBRSxVQUFVO29CQUN0QixPQUFPLEVBQUUsSUFBSTtpQkFDZDthQUNGO1lBQ0QsVUFBVSxFQUFFLElBQUk7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztTQUMvQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxjQUF5QjtRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3QyxDQUFDOztBQWhESCw0Q0FpREM7OztBQW9DRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQWEsZ0NBQWdDO0lBTTNDLFlBQVksUUFBK0MsRUFBRTtRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTFFLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0I7UUFDbEIsT0FBTztZQUNMLGVBQWUsRUFBRSxNQUFNO1lBQ3ZCLGdCQUFnQixFQUFFLGVBQWU7WUFDakMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7U0FDaEQsQ0FBQztJQUNKLENBQUM7O0FBekJILDRFQTBCQzs7O0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLHVCQUF1QjtJQUNsQzs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixPQUFPO1lBQ0wsZUFBZSxFQUFFLE9BQU87WUFDeEIsZ0JBQWdCLEVBQUUsTUFBTTtTQUN6QixDQUFDO0lBQ0osQ0FBQzs7QUFUSCwwREFVQzs7O0FBOENEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUNILE1BQWEsb0JBQW9CO0lBYy9CLFlBQVksUUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSwyQkFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsY0FBeUI7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHdGQUF3RixDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFFRCxjQUFjLENBQUMsZUFBZSxDQUM1QixJQUFJLHlCQUFlLENBQUM7WUFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztZQUNwQixPQUFPLEVBQUU7Z0JBQ1AscUJBQXFCO2dCQUNyQiwwQkFBMEI7YUFDM0I7WUFDRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztTQUN2QyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixPQUFPO1lBQ0wsU0FBUyxFQUFFLFNBQVM7WUFDcEIsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUU7WUFDN0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsSUFBSSxFQUFFO1NBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFZLENBQUMsUUFBUSxHQUFHLElBQUksc0JBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUN2RCxZQUFZLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFdBQVc7Z0JBQ3JELGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGFBQWEsRUFBRTtvQkFDYixLQUFLLEVBQUUsSUFBSTtvQkFDWCxRQUFRLEVBQUUsSUFBSTtpQkFDZjtnQkFDRCxVQUFVLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0QsY0FBYyxFQUFFO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLGFBQWEsRUFBRSxJQUFJO29CQUNuQixjQUFjLEVBQUUsSUFBSTtpQkFDckI7Z0JBQ0QsR0FBRyxFQUFFLGlCQUFHLENBQUMsUUFBUTtnQkFDakIsZUFBZSxFQUFFO29CQUNmLEdBQUcsRUFBRSxJQUFJO29CQUNULEdBQUcsRUFBRSxJQUFJO2lCQUNWO2dCQUNELGVBQWUsRUFBRSw2QkFBZSxDQUFDLFVBQVU7Z0JBQzNDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTthQUNsQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLElBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSw0QkFBYyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtnQkFDekUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixrQkFBa0IsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsaUJBQWlCO2dCQUNqRSxTQUFTLEVBQUU7b0JBQ1QsWUFBWSxFQUFFLElBQUk7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJO2lCQUNkO2dCQUNELGNBQWMsRUFBRSxLQUFLO2dCQUNyQiwwQkFBMEIsRUFBRTtvQkFDMUIsNENBQThCLENBQUMsT0FBTztpQkFDdkM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzs7QUEzR0gsb0RBNEdDOzs7QUEyREQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBQ0gsTUFBYSxvQkFBb0I7SUFXL0IsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFtQyxFQUFFO1FBQzdFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksMkJBQWEsQ0FBQyxPQUFPLENBQUM7UUFFbkUsdUNBQXVDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sVUFBVSxHQUFRO2dCQUN0QixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDN0QsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQzNELFdBQVcsRUFBRSwwQkFBVyxDQUFDLGVBQWU7Z0JBQ3hDLFVBQVUsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyw4QkFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyw4QkFBZSxDQUFDLFdBQVc7Z0JBQ2hHLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLE1BQU0sRUFBRSw2QkFBYyxDQUFDLGtCQUFrQjthQUMxQyxDQUFDO1lBRUYsd0NBQXdDO1lBQ3hDLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksb0JBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxPQUFtQjtRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixNQUFNLEdBQUcsR0FBMkI7WUFDbEMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO1NBQzFDLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RSxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQTVESCxvREE2REM7OztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGVBQWU7SUFDMUI7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxlQUEwQjtRQUMxQyx3QkFBd0I7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLE9BQU87WUFDTCxTQUFTLEVBQUUsTUFBTTtTQUNsQixDQUFDO0lBQ0osQ0FBQzs7QUFmSCwwQ0FnQkM7OztBQTZJRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLG9CQUFvQjtJQVEvQixZQUFZLFFBQW1DLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLDBCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9FOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQTBCO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFM0IsMkJBQTJCO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVM7WUFDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUMxQixDQUFDLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLElBQVksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBRTVDLElBQUksYUFBYSxZQUFZLG9CQUFvQixFQUFFLENBQUM7WUFDbEQsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksSUFBSSxvQkFBb0IsQ0FBQztZQUMxRSxhQUFhO1lBQ2IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7U0FDOUMsQ0FBQyxDQUFDO1FBQ0YsSUFBWSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztRQUU3QyxJQUFJLE9BQU8sWUFBWSxvQkFBb0IsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixNQUFNLEdBQUcsR0FBMkI7WUFDbEMsR0FBRyxNQUFNLENBQUMsV0FBVztZQUNyQixtQ0FBbUM7WUFDbkMsdUJBQXVCLEVBQUUsZ0JBQWdCO1lBQ3pDLG1CQUFtQixFQUFFLGlCQUFpQjtZQUN0Qyw0QkFBNEIsRUFBRSxTQUFTO1lBQ3ZDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLElBQUksRUFBRSxNQUFNO1lBQ1osR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7U0FDeEMsQ0FBQztRQUVGLHVEQUF1RDtRQUN2RCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sK0JBQStCLEdBQUcsMEJBQWMsQ0FBQyxxQkFBcUIsQ0FBQztZQUMzRSxPQUFPO1lBQ1AsTUFBTTtZQUNOLEtBQUs7WUFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDOUIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtTQUNoRCxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxlQUFlLEdBQUcseUJBQVksQ0FBQyxtQkFBbUIsQ0FDdEQsS0FBSyxFQUNMLHVCQUF1QixFQUN2QixrQkFBa0IsTUFBTSw4Q0FBOEMsQ0FDdkUsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBRWhGLG9FQUFvRTtRQUNwRSxNQUFNLGFBQWEsR0FBRyxpQ0FBZSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBRTFFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUkseUJBQVksQ0FBQyxNQUFNLENBQUM7UUFDM0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RSxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLElBQUksTUFBTSxDQUFDLDRCQUE0QixDQUFDO1FBRXBILE1BQU0sYUFBYSxHQUFHLElBQUkscUJBQVEsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUU7WUFDcEUsWUFBWSxFQUFFLCtCQUErQixDQUFDLGtCQUFrQjtZQUNoRSxZQUFZO1lBQ1osSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtnQkFDaEMsUUFBUSxFQUFFO29CQUNSLEtBQUssRUFBRSxhQUFhLENBQUMsYUFBYTtvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLE1BQU0sRUFBRSxJQUFJO3dCQUNaLDJFQUEyRTtxQkFDNUU7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLFNBQVMsQ0FBQyxTQUFpQjs0QkFDekIsSUFBSSxDQUFDO2dDQUNILE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLDREQUE0RDtnQ0FDbkcsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFNBQVMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dDQUNyRSxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0NBQzFCLEtBQUssTUFBTSxTQUFTLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQ0FDekMsSUFBSSxDQUFDO3dDQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7d0NBQ3ZGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQzt3Q0FDL0MsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOzRDQUNoRyxTQUFTLEdBQUcsU0FBUyxDQUFDOzRDQUN0QixNQUFNO3dDQUNSLENBQUM7b0NBQ0gsQ0FBQztvQ0FBQyxNQUFNLENBQUM7d0NBQ1AsU0FBUztvQ0FDWCxDQUFDO2dDQUNILENBQUM7Z0NBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FDWCxHQUFHLFNBQVMsMkNBQTJDLFNBQVMsMEVBQTBFLFNBQVMsRUFBRSxFQUNySixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUN2QyxDQUFDO2dDQUNGLElBQUksQ0FBQyxRQUFRLENBQ1gsWUFBWSxTQUFTLEdBQUcsRUFDeEIsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FDdkMsQ0FBQztnQ0FDRixPQUFPLElBQUksQ0FBQzs0QkFDZCxDQUFDOzRCQUFDLE1BQU0sQ0FBQztnQ0FDUCxPQUFPLEtBQUssQ0FBQzs0QkFDZixDQUFDO3dCQUNILENBQUM7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQ3RCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE9BQU87WUFDUCxVQUFVO1lBQ1YsV0FBVyxFQUFFLEdBQUc7WUFDaEIscUJBQXFCLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3BELFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDcEYsNEJBQTRCO1NBQzdCLENBQUMsQ0FBQztRQUVILHdCQUF3QjtRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLCtCQUErQixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDOztBQWpLSCxvREFrS0M7OztBQWNEOztHQUVHO0FBQ0g7Ozs7O0dBS0c7QUFDSCxJQUFZLFdBb0JYO0FBcEJELFdBQVksV0FBVztJQUNyQjs7O09BR0c7SUFDSCxnQ0FBaUIsQ0FBQTtJQUVqQjs7Ozs7Ozs7Ozs7T0FXRztJQUNILDBCQUFXLENBQUE7QUFDYixDQUFDLEVBcEJXLFdBQVcsMkJBQVgsV0FBVyxRQW9CdEI7QUE4RUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFhLDhCQUE4QjtJQUd6QyxZQUFZLFFBQTZDLEVBQUU7UUFDekQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLDBCQUFnQixDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQTBCO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUVqRSxpREFBaUQ7UUFDakQsSUFBSSxpQkFBdUMsQ0FBQztRQUM1QyxJQUFJLHdCQUE4QyxDQUFDO1FBRW5ELElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyx3REFBd0Q7WUFDeEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RixDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQzlDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsQ0FDNUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ1osaUJBQWlCLEdBQUcsT0FBTyxDQUFDO1lBQzlCLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzlCLHdCQUF3QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRixDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMxQix5REFBeUQ7Z0JBQ3pELE1BQU0sRUFBRSxHQUFHLElBQUksdUJBQWEsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7b0JBQ3hELEdBQUcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUc7b0JBQ3ZCLFdBQVcsRUFBRSwyQ0FBMkM7b0JBQ3hELGdCQUFnQixFQUFFLElBQUk7aUJBQ3ZCLENBQUMsQ0FBQztnQkFDSCx3QkFBd0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQ7b0JBQzlELDRFQUE0RTtvQkFDNUUsMkRBQTJELENBQzVELENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixJQUFJLHdCQUF3QixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkUsTUFBTSxJQUFJLEtBQUssQ0FDYixzRUFBc0U7b0JBQ3RFLGdGQUFnRjtvQkFDaEYsZ0NBQWdDLENBQ2pDLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELHFDQUFxQztRQUNyQyxJQUFJLFlBQW9CLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sVUFBVSxHQUFHLElBQUksaUNBQWdCLENBQUMsS0FBSyxFQUFFLHVCQUF1QixFQUFFO2dCQUN0RSxTQUFTLEVBQUUsV0FBVzthQUN2QixDQUFDLENBQUM7WUFDSCxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxDQUFDO1FBRUQsbUZBQW1GO1FBQ25GLDhFQUE4RTtRQUM5RSxnRkFBZ0Y7UUFDaEYsb0NBQW9DO1FBQ3BDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO1lBQ2hGLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxFQUFFO2dCQUNQLDRCQUE0QjtnQkFDNUIsbUJBQW1CO2dCQUNuQiwyQkFBMkI7YUFDNUI7WUFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUFDLENBQUM7UUFFSixtREFBbUQ7UUFDbkQsK0VBQStFO1FBQy9FLHVGQUF1RjtRQUN2RixvR0FBb0c7UUFDcEcsa0ZBQWtGO1FBQ2xGLDRGQUE0RjtRQUM1RixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO2dCQUN4RCxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUU7b0JBQ1Asd0JBQXdCO29CQUN4Qix5QkFBeUI7aUJBQzFCO2dCQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzthQUNqQixDQUFDLENBQUMsQ0FBQztZQUNKLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSx5QkFBZSxDQUFDO2dCQUN4RCxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUU7b0JBQ1AsMEJBQTBCO2lCQUMzQjtnQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7YUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLDBFQUEwRTtZQUMxRSxzREFBc0Q7WUFDdEQsVUFBVSxFQUFFLE1BQU07WUFDbEIsa0JBQWtCLEVBQUUsTUFBTTtTQUMzQixDQUFDO1FBQ0YsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLGlFQUFpRTtRQUNqRSxzRUFBc0U7UUFDdEUsa0VBQWtFO1FBQ2xFLCtCQUErQjtRQUUvQiw4QkFBOEI7UUFDOUIsTUFBTSxvQkFBb0IsR0FBUTtZQUNoQyxXQUFXO1NBQ1osQ0FBQztRQUVGLG1FQUFtRTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUNsRCxtQkFBbUIsRUFBRTtnQkFDbkIsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBWTtnQkFDekQsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsZUFBZTtnQkFDL0QsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsY0FBYzthQUM5RDtTQUNGLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLG9CQUFvQjtRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLGlDQUFVLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1lBQ3hELGdCQUFnQixFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQ2xFLG9CQUFvQixFQUFFO2dCQUNwQixzQkFBc0IsRUFBRTtvQkFDdEIsWUFBWTtpQkFDYjthQUNGO1lBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTztZQUNqQyxvQkFBb0I7WUFDcEIsdUJBQXVCLEVBQUUsVUFBVTtZQUNuQyxvQkFBb0IsRUFBRSxPQUFPO1NBQzlCLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUUseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSxrSEFBa0g7UUFDbEgsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDbkMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLDRCQUE0QixFQUFFO2dCQUN4RCxzQkFBc0IsRUFBRSxDQUFDLGVBQWUsQ0FBQzthQUMxQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsd0ZBQXdGO1FBQ3hGLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxHQUFHLElBQUksaUJBQWlCLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUNyRixPQUFPLENBQUMsbUJBQW1CLENBQUMsd0NBQXdDLEVBQUU7Z0JBQ3BFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLGNBQWMsRUFBRSx3QkFBd0I7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHFGQUFxRjtRQUNyRiw2REFBNkQ7UUFDN0QsMEZBQTBGO1FBQzFGLDJDQUEyQztRQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsaUZBQWlGO1FBQ2pGLElBQUksYUFBeUMsQ0FBQztRQUM5QyxJQUFJLFdBQVcsS0FBSyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEMsTUFBTSxZQUFZLEdBQUcsbUJBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFckUsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQkFBUSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtnQkFDM0QsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsY0FBYyxZQUFZLEVBQUU7Z0JBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7Z0JBQzVCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ3BCLGlDQUFpQztvQkFDakMsNkJBQTZCO29CQUM3Qix5SEFBeUg7b0JBQ3pILCtEQUErRDtvQkFDL0QsaUNBQWlDO29CQUNqQyxxQkFBcUI7b0JBQ3JCLDhFQUE4RTtvQkFDOUUsNkZBQTZGO29CQUM3Riw2QkFBNkI7b0JBQzdCLGlDQUFpQztvQkFDakMsaURBQWlEO29CQUNqRCx1QkFBdUI7b0JBQ3ZCLE9BQU87b0JBQ1AsZ0RBQWdEO29CQUNoRCw2Q0FBNkM7b0JBQzdDLDhGQUE4RjtvQkFDOUYsbUZBQW1GO29CQUNuRiw4QkFBOEI7b0JBQzlCLHNCQUFzQjtvQkFDdEIsZ0JBQWdCO29CQUNoQixPQUFPO29CQUNQLEdBQUc7b0JBQ0gsK0NBQStDO29CQUMvQyxTQUFTO29CQUNULHdHQUF3RztvQkFDeEcseURBQXlEO29CQUN6RCxnRUFBZ0U7b0JBQ2hFLG9DQUFvQztvQkFDcEMsa0dBQWtHO29CQUNsRyw4REFBOEQ7b0JBQzlELG9FQUFvRTtvQkFDcEUsOEdBQThHO29CQUM5RywrSEFBK0g7b0JBQy9ILHFEQUFxRDtvQkFDckQsT0FBTztvQkFDUCxxR0FBcUc7b0JBQ3JHLGlCQUFpQjtvQkFDakIsdUJBQXVCO29CQUN2QixrRUFBa0U7b0JBQ2xFLEtBQUs7b0JBQ0wsSUFBSTtpQkFDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDYixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2FBQzlCLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSx5QkFBZSxDQUFDO2dCQUMzQyxNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQztnQkFDOUMsU0FBUyxFQUFFLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO3dCQUNwQyxPQUFPLEVBQUUsbUJBQW1CO3dCQUM1QixRQUFRLEVBQUUsU0FBUzt3QkFDbkIsWUFBWSxFQUFFLEdBQUc7cUJBQ2xCLENBQUMsQ0FBQzthQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUosYUFBYSxHQUFHLElBQUksNEJBQWMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQzlELFlBQVksRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDbEMsVUFBVSxFQUFFO29CQUNWLGNBQWMsRUFBRSxPQUFPLENBQUMsR0FBRztpQkFDNUI7YUFDRixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDbEcsTUFBTSxlQUFlLEdBQUcsSUFBSSx5Q0FBa0IsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUU7WUFDaEYsY0FBYyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQzNCLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyx1QkFBdUI7WUFDcEQsSUFBSSxFQUFFLFlBQVk7WUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLElBQUk7Z0JBQ3RDLHFCQUFxQixFQUFFO29CQUNyQixjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUI7aUJBQ2pEO2FBQ0YsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEYsb0VBQW9FO1FBQ3BFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELHFGQUFxRjtRQUNyRiwySEFBMkg7UUFDM0gsTUFBTSxVQUFVLEdBQUcsZ0JBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzdCLGtDQUFrQztZQUNsQyxNQUFNO1lBQ04sS0FBSztZQUNMLE9BQU87WUFDUCxlQUFlO1lBQ2YsT0FBTyxDQUFDLGtCQUFrQjtTQUMzQixDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxnQkFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDM0IsNEJBQTRCO1lBQzVCLE1BQU07WUFDTiwwQkFBMEI7WUFDMUIsVUFBVTtZQUNWLHlCQUF5QjtZQUN6QixZQUFZO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0MsQ0FBQzs7QUE5U0gsd0VBK1NDOzs7QUErSEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxzQkFBUztJQXNCN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSw4RUFBOEU7UUFDOUUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLG9CQUFvQixDQUFDO1lBQ3RFLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7WUFDaEQsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyw0QkFBNEI7U0FDakUsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRWxGLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLE1BQU0sT0FBTyxHQUFHLDJCQUFpQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLDBDQUEwQixDQUFDLHdCQUF3QixDQUFDO1FBQ3JHLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLHlDQUFrQixDQUFDLHFDQUFxQyxDQUFDO1FBRTlHLDJFQUEyRTtRQUMzRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUMvRCxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWE7Z0JBQzNCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTthQUM3QixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLG1GQUFtRjtZQUNuRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUMvRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBRXRELHFFQUFxRTtRQUNyRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO2dCQUNqRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxxRkFBcUY7UUFDckYsMkRBQTJEO1FBQzNELElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FBQztnQkFDMUQsVUFBVSxFQUFFLEtBQUssQ0FBQyxtQkFBbUI7YUFDdEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLEdBQUcsR0FBMkI7WUFDbEMsUUFBUSxFQUFFLE9BQU87WUFDakIsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsWUFBWTtZQUM3RSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxXQUFXO1lBQ3BFLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRSxHQUFHLDRCQUFnQixDQUFDLDJCQUEyQixDQUM3QyxLQUFLLENBQUMsbUJBQW1CLEVBQ3pCLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsT0FBTyxDQUNSO1NBQ0YsQ0FBQztRQUVGLHFEQUFxRDtRQUNyRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3JELENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekMsR0FBRyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkUsR0FBRyxDQUFDLHFDQUFxQyxHQUFHLElBQUEsdURBQXlDLEVBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzFDLEtBQUssRUFBRSxJQUFJO1lBQ1gsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixXQUFXLEVBQUUsR0FBRztZQUNoQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLDRCQUE0QixFQUFFLEtBQUssQ0FBQyw0QkFBNEI7WUFDaEUsWUFBWSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWTtZQUNoRCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQzdDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDO1lBQy9ELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFlBQVk7WUFDbkUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFdBQVc7WUFDL0Qsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbEgsaUNBQWlDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNyRSxDQUFDLENBQUMsSUFBQSx1REFBeUMsRUFBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3RFLENBQUMsQ0FBQyxTQUFTO1lBQ2IsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBRTNDLHNFQUFzRTtRQUN0RSxJQUFJLGNBQWMsWUFBWSxvQkFBb0IsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1lBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztZQUVsRCx3RUFBd0U7WUFDeEUsSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDOUIsK0RBQStEO2dCQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsS0FBNEI7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0YsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqRCxJQUFJLGNBQWMsR0FBRyxDQUFDLElBQUksY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25ILE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQzs7QUFsTUgsNENBbU1DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgTmFtZXMsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyLFxuICBDb3JzLFxuICBFbmRwb2ludFR5cGUsXG4gIEdhdGV3YXlSZXNwb25zZSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIFJlc3BvbnNlVHlwZSxcbiAgUmVzdEFwaSxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgQ2ZuUnVudGltZSwgQ2ZuUnVudGltZUVuZHBvaW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50LCBNZmEsIEFjY291bnRSZWNvdmVyeSwgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZ25pdG8nO1xuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSwgQmlsbGluZ01vZGUsIElUYWJsZSwgU3RyZWFtVmlld1R5cGUsIFRhYmxlLCBUYWJsZUVuY3J5cHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgSVNlY3VyaXR5R3JvdXAsIFNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2VBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzJztcbmltcG9ydCB7IElHcmFudGFibGUsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWwsIFBvbGljeVN0YXRlbWVudCwgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IElGdW5jdGlvbiwgQXJjaGl0ZWN0dXJlLCBJTGF5ZXJWZXJzaW9uLCBMYXllclZlcnNpb24sIEZ1bmN0aW9uLCBDb2RlLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJQnVja2V0LCBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24sIEJsb2NrUHVibGljQWNjZXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUFnZW50LCBCYXNlQWdlbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1hZ2VudCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbiB9IGZyb20gJy4vYmF0Y2gtYWdlbnQnO1xuaW1wb3J0IHsgRGVmYXVsdEFnZW50Q29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWFnZW50LWNvbmZpZyc7XG5pbXBvcnQgeyBMYW1iZGFJYW1VdGlscywgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5JztcbmltcG9ydCB7IEJlZHJvY2tNb2RlbFV0aWxzIH0gZnJvbSAnLi4vYmVkcm9jayc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMgfSBmcm9tICcuLi9jdXN0b20tcmVzb3VyY2UnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZvdW5kYXRpb24nO1xuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgcGx1Z2dhYmxlIGNvbW11bmljYXRpb24gbWVjaGFuaXNtcy5cbiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgKEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tbXVuaWNhdGlvbkFkYXB0ZXIge1xuICAvKipcbiAgICogQXR0YWNoIHRoZSBhZGFwdGVyIHRvIGEgTGFtYmRhIGZ1bmN0aW9uIGFuZCBjcmVhdGUgY29tbXVuaWNhdGlvbiBpbmZyYXN0cnVjdHVyZS5cbiAgICogUmV0dXJucyB0aGUgcHVibGljIGVuZHBvaW50IFVSTCBmb3IgY2xpZW50IGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gc2VuZCByZXNwb25zZXMgYmFjayB0byBjbGllbnRzLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhyb3R0bGUgc2V0dGluZ3MgZm9yIFJFU1QgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocm90dGxlU2V0dGluZ3Mge1xuICAvKipcbiAgICogUmF0ZSBsaW1pdCAocmVxdWVzdHMgcGVyIHNlY29uZCkuXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ1cnN0IGxpbWl0IChtYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVyc3RMaW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFN0cmVhbWluZ0h0dHBBZGFwdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogUkVTVCBBUEkgc3RhZ2UgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ3Byb2QnXG4gICAqL1xuICByZWFkb25seSBzdGFnZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRocm90dGxlIHNldHRpbmdzIGZvciBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gdGhyb3R0bGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGhyb3R0bGU/OiBUaHJvdHRsZVNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBVc2VzIGF1dGhlbnRpY2F0b3IgZnJvbSBJbnRlcmFjdGl2ZUFnZW50XG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgLyoqXG4gICAqIEhUVFAgbWV0aG9kcyB0byBhbGxvdyBpbiBDT1JTIHByZWZsaWdodCByZXNwb25zZXMuXG4gICAqIFVzZSB0aGlzIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1ldGhvZHMgKEdFVCwgREVMRVRFLCBQVVQpIGZvciBjdXN0b20gcm91dGVzXG4gICAqIGFkZGVkIHRvIHRoZSBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgWydQT1NUJywgJ09QVElPTlMnXVxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFN0cmVhbWluZyBIVFRQIGFkYXB0ZXIgZm9yIHJlYWwtdGltZSBhZ2VudCBjb21tdW5pY2F0aW9uIHZpYSBTU0UuXG4gKlxuICogVGhpcyBhZGFwdGVyIGNyZWF0ZXMgYW4gQVBJIEdhdGV3YXkgUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcgZW5hYmxlZCxcbiAqIGFsbG93aW5nIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gc3RyZWFtIFNTRSAoU2VydmVyLVNlbnQgRXZlbnRzKSByZXNwb25zZXNcbiAqIGJhY2sgdG8gY2xpZW50cyBhcyB0aGUgU3RyYW5kcyBBZ2VudCBnZW5lcmF0ZXMgdG9rZW5zLlxuICpcbiAqICMjIEFyY2hpdGVjdHVyZVxuICpcbiAqIGBgYFxuICogQ2xpZW50IOKGkiBQT1NUIC9jaGF0IOKGkiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAoU1RSRUFNIG1vZGUpIOKGkiBMYW1iZGEgKEZhc3RBUEkgKyBMV0EpIOKGkiBCZWRyb2NrXG4gKiBDbGllbnQg4oaQIFNTRSBzdHJlYW0g4oaQIEFQSSBHYXRld2F5IOKGkCBMYW1iZGEgcmVzcG9uc2Ugc3RyZWFtaW5nIOKGkCBBZ2VudCB0b2tlbnNcbiAqIGBgYFxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKlJlc3BvbnNlIFN0cmVhbWluZyoqOiBQcm9ncmVzc2l2ZSBTU0UgZGVsaXZlcnkgdmlhIEFQSSBHYXRld2F5IHJlc3BvbnNlIHN0cmVhbWluZ1xuICogLSAqKjE1LU1pbnV0ZSBUaW1lb3V0Kio6IEV4dGVuZGVkIHRpbWVvdXQgZm9yIGxvbmctcnVubmluZyBhZ2VudCBjb252ZXJzYXRpb25zXG4gKiAtICoqQ29nbml0byBBdXRoKio6IE5hdGl2ZSBDT0dOSVRPX1VTRVJfUE9PTFMgYXV0aG9yaXplciBvbiBSRVNUIEFQSVxuICogLSAqKkNPUlMqKjogQnVpbHQtaW4gQ09SUyBzdXBwb3J0IGZvciBicm93c2VyIGNsaWVudHNcbiAqIC0gKipUaHJvdHRsaW5nKio6IENvbmZpZ3VyYWJsZSByYXRlIGFuZCBidXJzdCBsaW1pdHNcbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFN0cmVhbWluZ0h0dHBBZGFwdGVyIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3QgYWRhcHRlciA9IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcih7XG4gKiAgIHN0YWdlTmFtZTogJ3Byb2QnLFxuICogICB0aHJvdHRsZTogeyByYXRlTGltaXQ6IDEwMCwgYnVyc3RMaW1pdDogMjAwIH1cbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBjb21tdW5pY2F0aW9uQWRhcHRlcjogYWRhcHRlclxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbWluZ0h0dHBBZGFwdGVyIGltcGxlbWVudHMgSUNvbW11bmljYXRpb25BZGFwdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBSRVNUIEFQSSBHYXRld2F5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGk/OiBSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2xzIGF1dGhvcml6ZXIgKGlmIENvZ25pdG8gYXV0aGVudGljYXRpb24gaXMgZW5hYmxlZCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29nbml0b0F1dGhvcml6ZXI/OiBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcjtcblxuICAvKipcbiAgICogVGhlIEFQSSBlbmRwb2ludCBVUkwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpRW5kcG9pbnQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcztcbiAgcHJpdmF0ZSBzY29wZT86IENvbnN0cnVjdDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGUgYWRhcHRlciB0byBhIExhbWJkYSBmdW5jdGlvbiBhbmQgY3JlYXRlIFJFU1QgQVBJIGluZnJhc3RydWN0dXJlLlxuICAgKiBDcmVhdGVzIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggUE9TVCAvY2hhdCBlbmRwb2ludCBhbmQgcmVzcG9uc2Ugc3RyZWFtaW5nLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2NvcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3RyZWFtaW5nSHR0cEFkYXB0ZXIgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgc2NvcGUgYmVmb3JlIGNhbGxpbmcgYXR0YWNoVG9GdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlTmFtZSA9IHRoaXMucHJvcHMuc3RhZ2VOYW1lIHx8ICdwcm9kJztcbiAgICBjb25zdCBjb3JzQWxsb3dNZXRob2RzID0gdGhpcy5wcm9wcy5jb3JzQWxsb3dNZXRob2RzIHx8IFsnUE9TVCcsICdPUFRJT05TJ107XG4gICAgY29uc3QgY29yc0FsbG93TWV0aG9kc1N0cmluZyA9IGNvcnNBbGxvd01ldGhvZHMuam9pbignLCcpO1xuXG4gICAgLy8gQ3JlYXRlIFJFU1QgQVBJIHdpdGggQ09SU1xuICAgIC8vIFVzZSBSRUdJT05BTCBlbmRwb2ludCBmb3IgNS1taW51dGUgaWRsZSB0aW1lb3V0ICh2cyAzMHMgZm9yIEVER0UpLlxuICAgIC8vIFRoaXMgYWxsb3dzIHJlc3BvbnNlIHN0cmVhbWluZyB0byBleGNlZWQgQVBJIEdhdGV3YXkncyAyOXMgbGltaXQuXG4gICAgY29uc3QgcmVzdEFwaSA9IG5ldyBSZXN0QXBpKHRoaXMuc2NvcGUsICdDaGF0QXBpJywge1xuICAgICAgcmVzdEFwaU5hbWU6IGAke1N0YWNrLm9mKHRoaXMuc2NvcGUpLnN0YWNrTmFtZX0tQ2hhdEFwaWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyYWN0aXZlIEFnZW50IENoYXQgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nJyxcbiAgICAgIGVuZHBvaW50VHlwZXM6IFtFbmRwb2ludFR5cGUuUkVHSU9OQUxdLFxuICAgICAgZGVwbG95T3B0aW9uczoge1xuICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHRoaXMucHJvcHMudGhyb3R0bGU/LnJhdGVMaW1pdCxcbiAgICAgICAgdGhyb3R0bGluZ0J1cnN0TGltaXQ6IHRoaXMucHJvcHMudGhyb3R0bGU/LmJ1cnN0TGltaXQsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogQ29ycy5BTExfT1JJR0lOUyxcbiAgICAgICAgYWxsb3dNZXRob2RzOiBjb3JzQWxsb3dNZXRob2RzLFxuICAgICAgICBhbGxvd0hlYWRlcnM6IFsnQ29udGVudC1UeXBlJywgJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgKHRoaXMgYXMgYW55KS5yZXN0QXBpID0gcmVzdEFwaTtcblxuICAgIC8vIEFkZCBDT1JTIGhlYWRlcnMgdG8gQVBJIEdhdGV3YXkgZXJyb3IgcmVzcG9uc2VzICg0WFgvNVhYKS5cbiAgICAvLyBXaXRob3V0IHRoZXNlLCB0aGUgQ29nbml0byBhdXRob3JpemVyJ3MgNDAxIHJlc3BvbnNlIHdvbid0IGluY2x1ZGVcbiAgICAvLyBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4gYW5kIHRoZSBicm93c2VyIHdpbGwgYmxvY2sgaXQgYXMgYSBDT1JTIGVycm9yLlxuICAgIG5ldyBHYXRld2F5UmVzcG9uc2UodGhpcy5zY29wZSwgJ0dhdGV3YXlEZWZhdWx0NFhYJywge1xuICAgICAgcmVzdEFwaSxcbiAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5ERUZBVUxUXzRYWCxcbiAgICAgIHJlc3BvbnNlSGVhZGVyczoge1xuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogXCInKidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiBcIidDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiBgJyR7Y29yc0FsbG93TWV0aG9kc1N0cmluZ30nYCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbmV3IEdhdGV3YXlSZXNwb25zZSh0aGlzLnNjb3BlLCAnR2F0ZXdheURlZmF1bHQ1WFgnLCB7XG4gICAgICByZXN0QXBpLFxuICAgICAgdHlwZTogUmVzcG9uc2VUeXBlLkRFRkFVTFRfNVhYLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7XG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiBcIicqJ1wiLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6IFwiJ0NvbnRlbnQtVHlwZSxBdXRob3JpemF0aW9uJ1wiLFxuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6IGAnJHtjb3JzQWxsb3dNZXRob2RzU3RyaW5nfSdgLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgaW50ZWdyYXRpb25cbiAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihsYW1iZGFGdW5jdGlvbiwge1xuICAgICAgcHJveHk6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgL2NoYXQgcmVzb3VyY2Ugd2l0aCBQT1NUIG1ldGhvZFxuICAgIGNvbnN0IGNoYXRSZXNvdXJjZSA9IHJlc3RBcGkucm9vdC5hZGRSZXNvdXJjZSgnY2hhdCcpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGF1dGhvcml6YXRpb24gdHlwZVxuICAgIGxldCBhdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLk5PTkU7XG4gICAgbGV0IGF1dGhvcml6ZXI6IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuYXV0aGVudGljYXRvciBpbnN0YW5jZW9mIENvZ25pdG9BdXRoZW50aWNhdG9yICYmIHRoaXMucHJvcHMuYXV0aGVudGljYXRvci51c2VyUG9vbCkge1xuICAgICAgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcih0aGlzLnNjb3BlLCAnQ29nbml0b0F1dGhvcml6ZXInLCB7XG4gICAgICAgIGNvZ25pdG9Vc2VyUG9vbHM6IFt0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3IudXNlclBvb2xdLFxuICAgICAgICBhdXRob3JpemVyTmFtZTogJ0NvZ25pdG9BdXRob3JpemVyJyxcbiAgICAgIH0pO1xuICAgICAgKHRoaXMgYXMgYW55KS5jb2duaXRvQXV0aG9yaXplciA9IGF1dGhvcml6ZXI7XG4gICAgICBhdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE87XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdE1ldGhvZCA9IGNoYXRSZXNvdXJjZS5hZGRNZXRob2QoJ1BPU1QnLCBsYW1iZGFJbnRlZ3JhdGlvbiwge1xuICAgICAgYXV0aG9yaXphdGlvblR5cGUsXG4gICAgICBhdXRob3JpemVyLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIHJlc3BvbnNlIHN0cmVhbWluZyB2aWEgQ2ZuTWV0aG9kIGVzY2FwZSBoYXRjaFxuICAgIC8vIEFQSSBHYXRld2F5IFJFU1QgQVBJIHJlc3BvbnNlIHN0cmVhbWluZyByZXF1aXJlczpcbiAgICAvLyAxLiByZXNwb25zZVRyYW5zZmVyTW9kZTogU1RSRUFNIG9uIHRoZSBpbnRlZ3JhdGlvblxuICAgIC8vIDIuIEludGVncmF0aW9uIFVSSSBwb2ludGluZyB0byAvcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zXG4gICAgY29uc3QgY2ZuTWV0aG9kID0gcG9zdE1ldGhvZC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhbnk7XG4gICAgaWYgKGNmbk1ldGhvZCkge1xuICAgICAgY2ZuTWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ0ludGVncmF0aW9uLlJlc3BvbnNlVHJhbnNmZXJNb2RlJywgJ1NUUkVBTScpO1xuICAgICAgLy8gT3ZlcnJpZGUgdGhlIGludGVncmF0aW9uIFVSSSB0byB1c2UgcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zIHBhdGhcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMuc2NvcGUpLnJlZ2lvbjtcbiAgICAgIGNmbk1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKFxuICAgICAgICAnSW50ZWdyYXRpb24uVXJpJyxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06bGFtYmRhOnBhdGgvMjAyMS0xMS0xNS9mdW5jdGlvbnMvJHtsYW1iZGFGdW5jdGlvbi5mdW5jdGlvbkFybn0vcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zYCxcbiAgICAgICk7XG4gICAgICAvLyBTZXQgaW50ZWdyYXRpb24gdGltZW91dCB0byAxNSBtaW51dGVzICg5MDAwMDAgbXMpXG4gICAgICBjZm5NZXRob2QuYWRkUHJvcGVydHlPdmVycmlkZSgnSW50ZWdyYXRpb24uVGltZW91dEluTWlsbGlzJywgOTAwMDAwKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9uIHRvIGludm9rZSBMYW1iZGEgd2l0aCByZXNwb25zZSBzdHJlYW1pbmdcbiAgICBsYW1iZGFGdW5jdGlvbi5hZGRQZXJtaXNzaW9uKCdBcGlHYXRld2F5SW52b2tlJywge1xuICAgICAgcHJpbmNpcGFsOiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyksXG4gICAgICBzb3VyY2VBcm46IHJlc3RBcGkuYXJuRm9yRXhlY3V0ZUFwaSgpLFxuICAgIH0pO1xuXG4gICAgLy8gQWxzbyBncmFudCBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW0gcGVybWlzc2lvblxuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFBlcm1pc3Npb24oJ0FwaUdhdGV3YXlTdHJlYW1JbnZva2UnLCB7XG4gICAgICBwcmluY2lwYWw6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdhcGlnYXRld2F5LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIHNvdXJjZUFybjogcmVzdEFwaS5hcm5Gb3JFeGVjdXRlQXBpKCdQT1NUJywgJy9jaGF0JyksXG4gICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmwnLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uc3RydWN0IGVuZHBvaW50IFVSTFxuICAgIGNvbnN0IHVybCA9IHJlc3RBcGkudXJsRm9yUGF0aCgnL2NoYXQnKTtcbiAgICAodGhpcyBhcyBhbnkpLmFwaUVuZHBvaW50ID0gdXJsO1xuXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb25zIGZvciBBUEkgR2F0ZXdheSBpbnRlZ3JhdGlvbi5cbiAgICogRm9yIFJFU1QgQVBJIHN0cmVhbWluZywgbm8gYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUgbmVlZGVkIGJleW9uZCB0aGUgaW52b2tlIHBlcm1pc3Npb24uXG4gICAqL1xuICBncmFudEludm9rZShfbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIFJFU1QgQVBJIHN0cmVhbWluZyBkb2Vzbid0IG5lZWQgcG9zdF90b19jb25uZWN0aW9uIGxpa2UgV2ViU29ja2V0LlxuICAgIC8vIFRoZSBMYW1iZGEgaW52b2tlIHBlcm1pc3Npb24gaXMgYWxyZWFkeSBncmFudGVkIGluIGF0dGFjaFRvRnVuY3Rpb24uXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciB3aXRoIGEgQ0RLIHNjb3BlLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYXR0YWNoVG9GdW5jdGlvbiBvciBncmFudEludm9rZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3NldFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UuXG4gKlxuICogU2Vzc2lvbiBzdG9yZXMgbWFuYWdlIGNvbnZlcnNhdGlvbiBzdGF0ZSBwZXJzaXN0ZW5jZSBhY3Jvc3MgSFRUUCByZXF1ZXN0cy5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIChTM1Nlc3Npb25NYW5hZ2VyKSB1c2VzIFMzIGZvciBkdXJhYmxlIHN0b3JhZ2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYCBmcm9tIGBzdHJhbmRzLnNlc3Npb24uczNfc2Vzc2lvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICogVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzIFN0cmFuZHMtbmF0aXZlIHNlc3Npb24gbWFuYWdlbWVudCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uU3RvcmUge1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB1c2VkIGZvciBzZXNzaW9uIHN0b3JhZ2UgKGlmIFMzLWJhc2VkKS5cbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25CdWNrZXQ/OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhRnVuY3Rpb24gLSBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSBzZXNzaW9uIHN0b3JlXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFMzU2Vzc2lvbk1hbmFnZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYCBmcm9tIGBzdHJhbmRzLnNlc3Npb24uczNfc2Vzc2lvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzU2Vzc2lvbk1hbmFnZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBTMyBidWNrZXQgZm9yIHNlc3Npb24gc3RvcmFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGJ1Y2tldCB3aXRoIEtNUyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgZm9yIHNlc3Npb25zLlxuICAgKiBTZXNzaW9ucyBvbGRlciB0aGFuIHRoaXMgZHVyYXRpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDI0KVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBLTVMgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBzZXNzaW9uIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIEtNUyBrZXkgd2l0aCByb3RhdGlvbiBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogSUtleTtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIHRoZSBzZXNzaW9uIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBTMy1iYXNlZCBzZXNzaW9uIG1hbmFnZXIgZm9yIHBlcnNpc3RpbmcgY29udmVyc2F0aW9uIHN0YXRlLlxuICpcbiAqIFVzZXMgUzMgZm9yIGR1cmFibGUgc3RvcmFnZSBvZiBzZXNzaW9uIGRhdGEgd2l0aCBhdXRvbWF0aWMgZXhwaXJhdGlvblxuICogdmlhIGxpZmVjeWNsZSBwb2xpY2llcy4gRWFjaCBIVFRQIHJlcXVlc3QgbG9hZHMvc2F2ZXMgc2Vzc2lvbiBzdGF0ZSxcbiAqIGVuYWJsaW5nIG11bHRpLXR1cm4gY29udmVyc2F0aW9ucyBvdmVyIHN0YXRlbGVzcyBIVFRQLlxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKkR1cmFibGUgU3RvcmFnZSoqOiBTZXNzaW9ucyBwZXJzaXN0ZWQgdG8gUzMgc3Vydml2ZSBMYW1iZGEgcmVzdGFydHNcbiAqIC0gKipBdXRvbWF0aWMgRXhwaXJhdGlvbioqOiBMaWZlY3ljbGUgcG9saWN5IHJlbW92ZXMgb2xkIHNlc3Npb25zXG4gKiAtICoqRW5jcnlwdGlvbioqOiBLTVMgZW5jcnlwdGlvbiBhdCByZXN0XG4gKiAtICoqQ29zdCBPcHRpbWl6YXRpb24qKjogUzMgU3RhbmRhcmQgc3RvcmFnZSB3aXRoIGxpZmVjeWNsZSBtYW5hZ2VtZW50XG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgUzNTZXNzaW9uTWFuYWdlciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqIGltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3Qgc2Vzc2lvbk1hbmFnZXIgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gKiAgIHNlc3Npb25UVEw6IER1cmF0aW9uLmhvdXJzKDQ4KVxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIHNlc3Npb25TdG9yZTogc2Vzc2lvbk1hbmFnZXJcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYCBmcm9tIGBzdHJhbmRzLnNlc3Npb24uczNfc2Vzc2lvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICogVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzIFN0cmFuZHMtbmF0aXZlIHNlc3Npb24gbWFuYWdlbWVudCBhdXRvbWF0aWNhbGx5LlxuICogQW4gUzMgYnVja2V0IGlzIHN0aWxsIGNyZWF0ZWQgZm9yIHRoZSBTdHJhbmRzIHNlc3Npb24gbWFuYWdlcjsgdGhpcyBDREsgY2xhc3NcbiAqIGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gY29uZmlndXJlIHNlc3Npb24gcGVyc2lzdGVuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTM1Nlc3Npb25NYW5hZ2VyIGltcGxlbWVudHMgSVNlc3Npb25TdG9yZSB7XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWNrZXQ6IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9uIFRUTCBkdXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uVFRMOiBEdXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUzNTZXNzaW9uTWFuYWdlclByb3BzID0ge30pIHtcbiAgICBjb25zdCByZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1k7XG4gICAgY29uc3Qgc2Vzc2lvblRUTCA9IHByb3BzLnNlc3Npb25UVEwgfHwgRHVyYXRpb24uaG91cnMoMjQpO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGJ1Y2tldCBvciBjcmVhdGUgbmV3IG9uZVxuICAgIHRoaXMuYnVja2V0ID0gcHJvcHMuYnVja2V0IHx8IG5ldyBCdWNrZXQoc2NvcGUsIGAke2lkfUJ1Y2tldGAsIHtcbiAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uS01TLFxuICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHJlbW92YWxQb2xpY3ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogcmVtb3ZhbFBvbGljeSA9PT0gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnRGVsZXRlT2xkU2Vzc2lvbnMnLFxuICAgICAgICAgIGV4cGlyYXRpb246IHNlc3Npb25UVEwsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgdmVyc2lvbmVkOiBmYWxzZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlc3Npb25UVEwgPSBzZXNzaW9uVFRMO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgdXNlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIChJU2Vzc2lvblN0b3JlIGludGVyZmFjZSkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlc3Npb25CdWNrZXQoKTogSUJ1Y2tldCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb24pO1xuICB9XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBjb252ZXJzYXRpb24gaGlzdG9yeSBtYW5hZ2VtZW50LlxuICpcbiAqIENvbnRleHQgc3RyYXRlZ2llcyBjb250cm9sIGhvdyBjb252ZXJzYXRpb24gaGlzdG9yeSBpcyBtYWludGFpbmVkIGFuZCBwcm92aWRlZFxuICogdG8gdGhlIGFnZW50LiBEaWZmZXJlbnQgc3RyYXRlZ2llcyBlbmFibGUgZGlmZmVyZW50IGNvbnZlcnNhdGlvbiBwYXR0ZXJucy5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBmcm9tXG4gKiBgc3RyYW5kcy5hZ2VudC5jb252ZXJzYXRpb25fbWFuYWdlcmAgaW5zdGVhZC4gVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzXG4gKiBTdHJhbmRzLW5hdGl2ZSBjb252ZXJzYXRpb24gbWFuYWdlbWVudCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjb25maWd1cmUgdGhlIGNvbnRleHQgbWFuYWdlclxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGZyb21cbiAqIGBzdHJhbmRzLmFnZW50LmNvbnZlcnNhdGlvbl9tYW5hZ2VyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyUHJvcHMge1xuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCBpbiBjb252ZXJzYXRpb24gaGlzdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjAgbWVzc2FnZXNcbiAgICovXG4gIHJlYWRvbmx5IHdpbmRvd1NpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogU2xpZGluZyB3aW5kb3cgY29udmVyc2F0aW9uIG1hbmFnZXIgZm9yIG1haW50YWluaW5nIHJlY2VudCBjb252ZXJzYXRpb24gaGlzdG9yeS5cbiAqXG4gKiBLZWVwcyBhIGZpeGVkLXNpemUgd2luZG93IG9mIHJlY2VudCBtZXNzYWdlcywgYXV0b21hdGljYWxseSBkaXNjYXJkaW5nIG9sZGVyXG4gKiBtZXNzYWdlcyBhcyBuZXcgb25lcyBhcnJpdmUuIFByb3ZpZGVzIGNvbnNpc3RlbnQgY29udGV4dCBzaXplIGZvciB0aGUgYWdlbnQuXG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBjb250ZXh0TWFuYWdlciA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDMwIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBjb250ZXh0U3RyYXRlZ3k6IGNvbnRleHRNYW5hZ2VyXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGZyb21cbiAqIGBzdHJhbmRzLmFnZW50LmNvbnZlcnNhdGlvbl9tYW5hZ2VyYCBpbnN0ZWFkLiBUaGUgUHl0aG9uIGhhbmRsZXIgbm93IGhhbmRsZXNcbiAqIGNvbnZlcnNhdGlvbiB3aW5kb3dpbmcgbmF0aXZlbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogVGhlIHdpbmRvdyBzaXplIChudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2luZG93U2l6ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlclByb3BzID0ge30pIHtcbiAgICBjb25zdCB3aW5kb3dTaXplID0gcHJvcHMud2luZG93U2l6ZSAhPT0gdW5kZWZpbmVkID8gcHJvcHMud2luZG93U2l6ZSA6IDIwO1xuXG4gICAgaWYgKHdpbmRvd1NpemUgPCAxIHx8IHdpbmRvd1NpemUgPiAxMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd1NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG5cbiAgICB0aGlzLndpbmRvd1NpemUgPSB3aW5kb3dTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ1NsaWRpbmdXaW5kb3cnLFxuICAgICAgQ09OVEVYVF9XSU5ET1dfU0laRTogdGhpcy53aW5kb3dTaXplLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE51bGwgY29udmVyc2F0aW9uIG1hbmFnZXIgZm9yIHN0YXRlbGVzcyBpbnRlcmFjdGlvbnMuXG4gKlxuICogRGlzYWJsZXMgY29udmVyc2F0aW9uIGhpc3RvcnksIHRyZWF0aW5nIGVhY2ggbWVzc2FnZSBhcyBpbmRlcGVuZGVudC5cbiAqIFVzZWZ1bCBmb3Igc3RhdGVsZXNzIHVzZSBjYXNlcyB3aGVyZSBjb250ZXh0IGlzIG5vdCBuZWVkZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyB1c2VzIFN0cmFuZHMtbmF0aXZlIGNvbnZlcnNhdGlvbiBtYW5hZ2VtZW50LlxuICogVG8gZGlzYWJsZSBjb252ZXJzYXRpb24gaGlzdG9yeSwgb21pdCB0aGUgc2Vzc2lvbiBidWNrZXQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bGxDb252ZXJzYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgSUNvbnRleHRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBDT05URVhUX0VOQUJMRUQ6ICdmYWxzZScsXG4gICAgICBDT05URVhUX1NUUkFURUdZOiAnTnVsbCcsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBBdXRoZW50aWNhdG9ycyBjb250cm9sIGhvdyBBUEkgZW5kcG9pbnRzIGFyZSBzZWN1cmVkLlxuICogRGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IHZhcmlvdXMgYXV0aGVudGljYXRpb24gbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBHcmFudCBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBDb2duaXRvQXV0aGVudGljYXRvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2duaXRvQXV0aGVudGljYXRvclByb3BzIHtcbiAgLyoqXG4gICAqIENvZ25pdG8gVXNlciBQb29sIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIFVzZXIgUG9vbCB3aXRoIHNlY3VyZSBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlclBvb2w/OiBVc2VyUG9vbDtcblxuICAvKipcbiAgICogQ29nbml0byBVc2VyIFBvb2wgQ2xpZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgY2xpZW50IHdpdGggYXBwcm9wcmlhdGUgYXV0aCBmbG93c1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlclBvb2xDbGllbnQ/OiBVc2VyUG9vbENsaWVudDtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIENvZ25pdG8gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIENvZ25pdG8tYmFzZWQgYXV0aGVudGljYXRvciBmb3Igc2VjdXJpbmcgUkVTVCBBUEkgZW5kcG9pbnRzLlxuICpcbiAqIENyZWF0ZXMgYSBDb2duaXRvIFVzZXIgUG9vbCBhbmQgaW50ZWdyYXRlcyB3aXRoIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gKiB1c2luZyB0aGUgbmF0aXZlIENPR05JVE9fVVNFUl9QT09MUyBhdXRob3JpemVyIHR5cGUuIENsaWVudHMgc2VuZFxuICogSldUIHRva2VucyBpbiB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqTmF0aXZlIEpXVCBWYWxpZGF0aW9uKio6IEFQSSBHYXRld2F5IHZhbGlkYXRlcyB0b2tlbnMgd2l0aG91dCBjdXN0b20gTGFtYmRhXG4gKiAtICoqVXNlciBNYW5hZ2VtZW50Kio6IEJ1aWx0LWluIHVzZXIgcmVnaXN0cmF0aW9uIGFuZCBtYW5hZ2VtZW50XG4gKiAtICoqUGFzc3dvcmQgUG9saWNpZXMqKjogRW5mb3JjZXMgc3Ryb25nIHBhc3N3b3JkIHJlcXVpcmVtZW50c1xuICogLSAqKkFjY291bnQgUmVjb3ZlcnkqKjogRW1haWwtYmFzZWQgYWNjb3VudCByZWNvdmVyeVxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBDb2duaXRvQXV0aGVudGljYXRvciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IGF1dGhlbnRpY2F0b3IgPSBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3Ioe1xuICogICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIGF1dGhlbnRpY2F0b3JcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2duaXRvQXV0aGVudGljYXRvciBpbXBsZW1lbnRzIElBdXRoZW50aWNhdG9yIHtcbiAgLyoqXG4gICAqIFRoZSBDb2duaXRvIFVzZXIgUG9vbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbD86IFVzZXJQb29sO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2wgQ2xpZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJQb29sQ2xpZW50PzogVXNlclBvb2xDbGllbnQ7XG5cbiAgcHJpdmF0ZSBzY29wZT86IENvbnN0cnVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDb2duaXRvQXV0aGVudGljYXRvclByb3BzID0ge30pIHtcbiAgICB0aGlzLnVzZXJQb29sID0gcHJvcHMudXNlclBvb2w7XG4gICAgdGhpcy51c2VyUG9vbENsaWVudCA9IHByb3BzLnVzZXJQb29sQ2xpZW50O1xuICAgIHRoaXMucmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGF1dGhlbnRpY2F0aW9uIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBHcmFudHMgcGVybWlzc2lvbnMgdG8gdmVyaWZ5IENvZ25pdG8gdG9rZW5zLlxuICAgKi9cbiAgZ3JhbnRBdXRoZW50aWNhdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY29wZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2duaXRvQXV0aGVudGljYXRvciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSBzY29wZSBiZWZvcmUgY2FsbGluZyBncmFudEF1dGhlbnRpY2F0ZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VyUG9vbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIFBvb2wgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBncmFudGluZyBwZXJtaXNzaW9ucy4gQ2FsbCBfc2V0U2NvcGUgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgbGFtYmRhRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2NvZ25pdG8taWRwOkdldFVzZXInLFxuICAgICAgICAgICdjb2duaXRvLWlkcDpBZG1pbkdldFVzZXInLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLnVzZXJQb29sLnVzZXJQb29sQXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQVVUSF9UWVBFOiAnQ29nbml0bycsXG4gICAgICBVU0VSX1BPT0xfSUQ6IHRoaXMudXNlclBvb2w/LnVzZXJQb29sSWQgfHwgJycsXG4gICAgICBVU0VSX1BPT0xfQ0xJRU5UX0lEOiB0aGlzLnVzZXJQb29sQ2xpZW50Py51c2VyUG9vbENsaWVudElkIHx8ICcnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYXV0aGVudGljYXRvciB3aXRoIGEgQ0RLIHNjb3BlLlxuICAgKiBDcmVhdGVzIFVzZXIgUG9vbCBhbmQgQ2xpZW50IGlmIG5vdCBwcm92aWRlZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3NldFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2wpIHtcbiAgICAgICh0aGlzIGFzIGFueSkudXNlclBvb2wgPSBuZXcgVXNlclBvb2woc2NvcGUsICdVc2VyUG9vbCcsIHtcbiAgICAgICAgdXNlclBvb2xOYW1lOiBgJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfS1Vc2VyUG9vbGAsXG4gICAgICAgIHNlbGZTaWduVXBFbmFibGVkOiB0cnVlLFxuICAgICAgICBzaWduSW5BbGlhc2VzOiB7XG4gICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgICAgdXNlcm5hbWU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9WZXJpZnk6IHtcbiAgICAgICAgICBlbWFpbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFzc3dvcmRQb2xpY3k6IHtcbiAgICAgICAgICBtaW5MZW5ndGg6IDgsXG4gICAgICAgICAgcmVxdWlyZUxvd2VyY2FzZTogdHJ1ZSxcbiAgICAgICAgICByZXF1aXJlVXBwZXJjYXNlOiB0cnVlLFxuICAgICAgICAgIHJlcXVpcmVEaWdpdHM6IHRydWUsXG4gICAgICAgICAgcmVxdWlyZVN5bWJvbHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIG1mYTogTWZhLk9QVElPTkFMLFxuICAgICAgICBtZmFTZWNvbmRGYWN0b3I6IHtcbiAgICAgICAgICBzbXM6IHRydWUsXG4gICAgICAgICAgb3RwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBhY2NvdW50UmVjb3Zlcnk6IEFjY291bnRSZWNvdmVyeS5FTUFJTF9PTkxZLFxuICAgICAgICByZW1vdmFsUG9saWN5OiB0aGlzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2xDbGllbnQgJiYgdGhpcy51c2VyUG9vbCkge1xuICAgICAgKHRoaXMgYXMgYW55KS51c2VyUG9vbENsaWVudCA9IG5ldyBVc2VyUG9vbENsaWVudChzY29wZSwgJ1VzZXJQb29sQ2xpZW50Jywge1xuICAgICAgICB1c2VyUG9vbDogdGhpcy51c2VyUG9vbCxcbiAgICAgICAgdXNlclBvb2xDbGllbnROYW1lOiBgJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfS1Vc2VyUG9vbENsaWVudGAsXG4gICAgICAgIGF1dGhGbG93czoge1xuICAgICAgICAgIHVzZXJQYXNzd29yZDogdHJ1ZSxcbiAgICAgICAgICB1c2VyU3JwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBnZW5lcmF0ZVNlY3JldDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRlZElkZW50aXR5UHJvdmlkZXJzOiBbXG4gICAgICAgICAgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyLkNPR05JVE8sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHNlc3Npb24gaW5kZXggc3RvcmFnZS5cbiAqXG4gKiBTZXNzaW9uIGluZGV4ZXMgcHJvdmlkZSBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzIGZvciBsaXN0aW5nIGFuZCBtYW5hZ2luZyBzZXNzaW9ucy5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIChEeW5hbW9EQlNlc3Npb25JbmRleCkgdXNlcyBEeW5hbW9EQiBmb3IgZWZmaWNpZW50IHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNlc3Npb25JbmRleCB7XG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgcHJpbmNpcGFsIHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSBzZXNzaW9uIGluZGV4XG4gICAqL1xuICBncmFudFJlYWRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogdm9pZDtcblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjb25maWd1cmUgdGhlIHNlc3Npb24gaW5kZXhcbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBEeW5hbW9EQlNlc3Npb25JbmRleC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9EQlNlc3Npb25JbmRleFByb3BzIHtcbiAgLyoqXG4gICAqIEV4aXN0aW5nIER5bmFtb0RCIHRhYmxlIHRvIHVzZS5cbiAgICogVGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXkgJ3VzZXJfaWQnIChTdHJpbmcpIGFuZCBzb3J0IGtleSAnc2Vzc2lvbl9pZCcgKFN0cmluZykuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCB0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGU/OiBJVGFibGU7XG5cbiAgLyoqXG4gICAqIFRpbWUtdG8tbGl2ZSBmb3Igc2Vzc2lvbiBpbmRleCByZWNvcmRzLlxuICAgKiBXaGVuIHNldCwgZXhwaXJlZCByZWNvcmRzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYnkgRHluYW1vREIgVFRMLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBUVEwgKHNlc3Npb25zIHBlcnNpc3QgdW50aWwgZXhwbGljaXRseSBkZWxldGVkKVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBLTVMga2V5IGZvciB0YWJsZSBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogSUtleTtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIHRoZSBEeW5hbW9EQiB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBEeW5hbW9EQi1iYXNlZCBzZXNzaW9uIGluZGV4IGZvciBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzLlxuICpcbiAqIENyZWF0ZXMgYSBEeW5hbW9EQiB0YWJsZSBpbmRleGVkIGJ5IHVzZXJfaWQgKHBhcnRpdGlvbiBrZXkpIGFuZCBzZXNzaW9uX2lkIChzb3J0IGtleSlcbiAqIGZvciBlZmZpY2llbnQgcXVlcnlpbmcgb2YgYSB1c2VyJ3Mgc2Vzc2lvbnMuIFRoZSB0YWJsZSBzdG9yZXMgc2Vzc2lvbiBtZXRhZGF0YVxuICogaW5jbHVkaW5nIGNyZWF0aW9uIHRpbWUsIGxhc3QgdXBkYXRlIHRpbWUsIGFuZCBvcHRpb25hbCBUVEwgZm9yIGF1dG9tYXRpYyBjbGVhbnVwLlxuICpcbiAqICMjIFRhYmxlIFNjaGVtYVxuICpcbiAqIC0gKipQYXJ0aXRpb24gS2V5Kio6IHVzZXJfaWQgKFN0cmluZykgLSBVc2VyIGlkZW50aWZpZXIgZnJvbSBhdXRoZW50aWNhdGlvblxuICogLSAqKlNvcnQgS2V5Kio6IHNlc3Npb25faWQgKFN0cmluZykgLSBVbmlxdWUgc2Vzc2lvbiBpZGVudGlmaWVyXG4gKiAtICoqQXR0cmlidXRlcyoqOiBjcmVhdGVkX2F0LCB1cGRhdGVkX2F0LCBsYXN0X21lc3NhZ2UsIGV4cGlyZXNfYXQgKG9wdGlvbmFsKVxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKkZhc3QgTG9va3VwcyoqOiBRdWVyeSBhbGwgc2Vzc2lvbnMgZm9yIGEgdXNlciBpbiBPKDEpIHVzaW5nIHBhcnRpdGlvbiBrZXlcbiAqIC0gKipBdXRvbWF0aWMgRXhwaXJhdGlvbioqOiBPcHRpb25hbCBUVEwgcmVtb3ZlcyBzdGFsZSBzZXNzaW9ucyBhdXRvbWF0aWNhbGx5XG4gKiAtICoqT24tRGVtYW5kIENhcGFjaXR5Kio6IFBheS1wZXItcmVxdWVzdCBiaWxsaW5nLCBubyBjYXBhY2l0eSBwbGFubmluZyBuZWVkZWRcbiAqIC0gKipFbmNyeXB0aW9uKio6IEFXUyBtYW5hZ2VkIG9yIGN1c3RvbWVyLW1hbmFnZWQgS01TIGVuY3J5cHRpb25cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIER5bmFtb0RCU2Vzc2lvbkluZGV4IH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3Qgc2Vzc2lvbkluZGV4ID0gbmV3IER5bmFtb0RCU2Vzc2lvbkluZGV4KHRoaXMsICdTZXNzaW9uSW5kZXgnLCB7XG4gKiAgIHNlc3Npb25UVEw6IER1cmF0aW9uLmRheXMoNylcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBzZXNzaW9uSW5kZXhcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEeW5hbW9EQlNlc3Npb25JbmRleCBpbXBsZW1lbnRzIElTZXNzaW9uSW5kZXgge1xuICAvKipcbiAgICogVGhlIER5bmFtb0RCIHRhYmxlIHVzZWQgZm9yIHNlc3Npb24gaW5kZXggc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWJsZTogSVRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vzc2lvbiBUVEwgZHVyYXRpb24gKGlmIGNvbmZpZ3VyZWQpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRHluYW1vREJTZXNzaW9uSW5kZXhQcm9wcyA9IHt9KSB7XG4gICAgY29uc3QgcmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIHRhYmxlIG9yIGNyZWF0ZSBuZXcgb25lXG4gICAgaWYgKHByb3BzLnRhYmxlKSB7XG4gICAgICB0aGlzLnRhYmxlID0gcHJvcHMudGFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhYmxlUHJvcHM6IGFueSA9IHtcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6ICd1c2VyX2lkJywgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAgICAgICAgc29ydEtleTogeyBuYW1lOiAnc2Vzc2lvbl9pZCcsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICAgIGJpbGxpbmdNb2RlOiBCaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb25LZXkgPyBUYWJsZUVuY3J5cHRpb24uQ1VTVE9NRVJfTUFOQUdFRCA6IFRhYmxlRW5jcnlwdGlvbi5BV1NfTUFOQUdFRCxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcmVtb3ZhbFBvbGljeSxcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeTogdHJ1ZSxcbiAgICAgICAgc3RyZWFtOiBTdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMsXG4gICAgICB9O1xuXG4gICAgICAvLyBFbmFibGUgVFRMIGlmIHNlc3Npb25UVEwgaXMgc3BlY2lmaWVkXG4gICAgICBpZiAocHJvcHMuc2Vzc2lvblRUTCkge1xuICAgICAgICB0YWJsZVByb3BzLnRpbWVUb0xpdmVBdHRyaWJ1dGUgPSAnZXhwaXJlc19hdCc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGFibGUgPSBuZXcgVGFibGUoc2NvcGUsIGAke2lkfVRhYmxlYCwgdGFibGVQcm9wcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXNzaW9uVFRMID0gcHJvcHMuc2Vzc2lvblRUTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFNFU1NJT05fSU5ERVhfVEFCTEU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZXNzaW9uVFRMKSB7XG4gICAgICBlbnYuU0VTU0lPTl9JTkRFWF9UVExfU0VDT05EUyA9IHRoaXMuc2Vzc2lvblRUTC50b1NlY29uZHMoKS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBlbnY7XG4gIH1cbn1cblxuLyoqXG4gKiBOby1hdXRoZW50aWNhdGlvbiBhdXRoZW50aWNhdG9yIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZy5cbiAqXG4gKiBEaXNhYmxlcyBhdXRoZW50aWNhdGlvbiBlbnRpcmVseSwgYWxsb3dpbmcgYW55IGNsaWVudCB0byBjb25uZWN0XG4gKiB3aXRob3V0IGNyZWRlbnRpYWxzLiBUaGlzIHNob3VsZCBPTkxZIGJlIHVzZWQgZm9yIGRldmVsb3BtZW50XG4gKiBhbmQgdGVzdGluZyBlbnZpcm9ubWVudHMuXG4gKlxuICogIyMgU2VjdXJpdHkgV2FybmluZ1xuICpcbiAqIFRoaXMgYXV0aGVudGljYXRvciBwcm92aWRlcyBOTyBzZWN1cml0eS4gTmV2ZXIgdXNlIGluIHByb2R1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBOby1vcCBmb3IgTm9BdXRoZW50aWNhdG9yIHNpbmNlIG5vIGF1dGhlbnRpY2F0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKF9sYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgLy8gTm8gcGVybWlzc2lvbnMgbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQVVUSF9UWVBFOiAnTm9uZScsXG4gICAgfTtcbiAgfVxufVxuXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXNzZWQgdG8gYSBob3N0aW5nIGFkYXB0ZXIncyBkZXBsb3kgbWV0aG9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50SG9zdGluZ0NvbmZpZyB7XG4gIC8qKiBDREsgc2NvcGUgZm9yIGNyZWF0aW5nIHJlc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcbiAgLyoqIEFnZW50IG5hbWUgaWRlbnRpZmllci4gKi9cbiAgcmVhZG9ubHkgYWdlbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBmb3IgdGhlIGFnZW50IHJ1bnRpbWUuICovXG4gIHJlYWRvbmx5IGFnZW50Um9sZTogUm9sZTtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgb24gdGhlIHJ1bnRpbWUuICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogS01TIGVuY3J5cHRpb24ga2V5LiAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5OiBLZXk7XG4gIC8qKiBPcHRpb25hbCBWUEMgbmV0d29yayBjb25maWd1cmF0aW9uLiAqL1xuICByZWFkb25seSBuZXR3b3JrPzogTmV0d29yaztcbiAgLyoqIExhbWJkYSBhcmNoaXRlY3R1cmUgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG4gIC8qKiBMYW1iZGEgbWVtb3J5IHNpemUgaW4gTUIgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuICAvKiogTGFtYmRhIHRpbWVvdXQgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG4gIC8qKiBSZXNlcnZlZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xuICAvKiogTGFtYmRhIGxheWVycyBmcm9tIGFnZW50IGRlZmluaXRpb24gKExhbWJkYSBob3N0aW5nIG9ubHkpLiAqL1xuICByZWFkb25seSBsYW1iZGFMYXllcnM/OiBJTGF5ZXJWZXJzaW9uW107XG4gIC8qKiBMYW1iZGEgbGF5ZXJzIGZyb20ga25vd2xlZGdlIGJhc2VzIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkga25vd2xlZGdlQmFzZUxheWVycz86IElMYXllclZlcnNpb25bXTtcbiAgLyoqIFdoZXRoZXIgb2JzZXJ2YWJpbGl0eSBpcyBlbmFibGVkLiAqL1xuICByZWFkb25seSBlbmFibGVPYnNlcnZhYmlsaXR5PzogYm9vbGVhbjtcbiAgLyoqIEFnZW50IHRvb2xzIGxvY2F0aW9uIGRlZmluaXRpb25zIChKU09OIHNlcmlhbGl6ZWQpLiAqL1xuICByZWFkb25seSB0b29sc0NvbmZpZzogc3RyaW5nO1xuICAvKiogU3lzdGVtIHByb21wdCBTMyBidWNrZXQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgc3lzdGVtUHJvbXB0QnVja2V0OiBzdHJpbmc7XG4gIC8qKiBTeXN0ZW0gcHJvbXB0IFMzIGtleS4gKi9cbiAgcmVhZG9ubHkgc3lzdGVtUHJvbXB0S2V5OiBzdHJpbmc7XG4gIC8qKiBLbm93bGVkZ2UgYmFzZSBjb25maWdzIChKU09OIHNlcmlhbGl6ZWQpLiAqL1xuICByZWFkb25seSBrbm93bGVkZ2VCYXNlQ29uZmlncz86IHN0cmluZztcbiAgLyoqIEtub3dsZWRnZSBiYXNlIHN5c3RlbSBwcm9tcHQgYWRkaXRpb24uICovXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbj86IHN0cmluZztcbiAgLyoqIFJlbW92YWwgcG9saWN5IGZvciByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBhIGhvc3RpbmcgYWRhcHRlcidzIGRlcGxveSBtZXRob2QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRIb3N0aW5nUmVzdWx0IHtcbiAgLyoqIFRoZSBhZ2VudCBlbmRwb2ludCBVUkwgb3IgQVJOLiAqL1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICAvKiogVGhlIExhbWJkYSBmdW5jdGlvbiAoaWYgTGFtYmRhLWhvc3RlZCkuICovXG4gIHJlYWRvbmx5IGFnZW50RnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKiBUaGUgQWdlbnRDb3JlIENmblJ1bnRpbWUgKGlmIEFnZW50Q29yZS1ob3N0ZWQpLiAqL1xuICByZWFkb25seSBjZm5SdW50aW1lPzogQ2ZuUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHBsdWdnYWJsZSBob3N0aW5nIGJhY2tlbmRzLlxuICpcbiAqIEhvc3RpbmcgYWRhcHRlcnMgZW5jYXBzdWxhdGUgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byBydW4gYW4gYWdlbnQuXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBgTGFtYmRhSG9zdGluZ0FkYXB0ZXJgIChMYW1iZGEgKyBMV0EgKyBBUEkgR2F0ZXdheSkuXG4gKiBgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyYCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB1c2luZyBBZ2VudENvcmUgUnVudGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG9zdGluZ0FkYXB0ZXIge1xuICAvKipcbiAgICogVGhlIElBTSBzZXJ2aWNlIHByaW5jaXBhbCB0aGF0IHRoaXMgaG9zdGluZyBiYWNrZW5kIHJlcXVpcmVzLlxuICAgKlxuICAgKiBCYXNlQWdlbnQgdXNlcyB0aGlzIHRvIGNyZWF0ZSB0aGUgYWdlbnQgcm9sZSB3aXRoIHRoZSBjb3JyZWN0IHRydXN0IHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIExhbWJkYSBob3N0aW5nIHJlcXVpcmVzIGBsYW1iZGEuYW1hem9uYXdzLmNvbWAgd2hpbGUgQWdlbnRDb3JlXG4gICAqIGhvc3RpbmcgcmVxdWlyZXMgYGJlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb21gLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbDogU2VydmljZVByaW5jaXBhbDtcblxuICAvKipcbiAgICogRGVwbG95IHRoZSBhZ2VudCBob3N0aW5nIGluZnJhc3RydWN0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IGhvc3RpbmdcbiAgICogQHJldHVybnMgVGhlIGhvc3RpbmcgcmVzdWx0IGluY2x1ZGluZyBlbmRwb2ludCBhbmQgb3B0aW9uYWwgcmVzb3VyY2VzXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBMYW1iZGFIb3N0aW5nQWRhcHRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFIb3N0aW5nQWRhcHRlclByb3BzIHtcbiAgLyoqXG4gICAqIENvbW11bmljYXRpb24gYWRhcHRlciBmb3IgY2xpZW50LWFnZW50IGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdHJlYW1pbmdIdHRwQWRhcHRlclxuICAgKi9cbiAgcmVhZG9ubHkgY29tbXVuaWNhdGlvbkFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIEFQSSBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgLyoqXG4gICAqIEhUVFAgbWV0aG9kcyB0byBhbGxvdyBpbiBDT1JTIHByZWZsaWdodCByZXNwb25zZXMuXG4gICAqIFVzZSB0aGlzIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1ldGhvZHMgKEdFVCwgREVMRVRFLCBQVVQpIGZvciBjdXN0b20gcm91dGVzXG4gICAqIGFkZGVkIHRvIHRoZSBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgWydQT1NUJywgJ09QVElPTlMnXVxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gbWVtb3J5IHNpemUgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcmVzZXJ2ZWQgY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGFtYmRhIGhvc3RpbmcgYWRhcHRlciBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBEZXBsb3lzIHRoZSBhZ2VudCBhcyBhIExhbWJkYSBmdW5jdGlvbiBiZWhpbmQgTGFtYmRhIFdlYiBBZGFwdGVyIGFuZCBBUEkgR2F0ZXdheVxuICogUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQgaG9zdGluZyBiYWNrZW5kLlxuICpcbiAqICMjIEFyY2hpdGVjdHVyZVxuICpcbiAqIGBgYFxuICogQ2xpZW50IOKGkiBQT1NUIC9jaGF0IOKGkiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAoU1RSRUFNKSDihpIgTGFtYmRhIChGYXN0QVBJICsgTFdBKSDihpIgQmVkcm9ja1xuICogQ2xpZW50IOKGkCBTU0Ugc3RyZWFtIOKGkCBBUEkgR2F0ZXdheSDihpAgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyDihpAgQWdlbnQgdG9rZW5zXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgLyoqIFRoZSBjb21tdW5pY2F0aW9uIGFkYXB0ZXIuICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcbiAgLyoqIFRoZSBhdXRoZW50aWNhdG9yLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHMgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIGdldCBzZXJ2aWNlUHJpbmNpcGFsKCkgeyByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IExhbWJkYSArIExXQSArIEFQSSBHYXRld2F5IGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhdXRoZW50aWNhdG9yXG4gICAgY29uc3QgYXV0aGVudGljYXRvciA9IHRoaXMucHJvcHMuYXV0aGVudGljYXRvciAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMucHJvcHMuYXV0aGVudGljYXRvclxuICAgICAgOiBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3IoKTtcbiAgICAodGhpcyBhcyBhbnkpLmF1dGhlbnRpY2F0b3IgPSBhdXRoZW50aWNhdG9yO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0b3IgaW5zdGFuY2VvZiBDb2duaXRvQXV0aGVudGljYXRvcikge1xuICAgICAgYXV0aGVudGljYXRvci5fc2V0U2NvcGUoc2NvcGUpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBhZGFwdGVyXG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMucHJvcHMuY29tbXVuaWNhdGlvbkFkYXB0ZXIgfHwgbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHtcbiAgICAgIGF1dGhlbnRpY2F0b3IsXG4gICAgICBjb3JzQWxsb3dNZXRob2RzOiB0aGlzLnByb3BzLmNvcnNBbGxvd01ldGhvZHMsXG4gICAgfSk7XG4gICAgKHRoaXMgYXMgYW55KS5jb21tdW5pY2F0aW9uQWRhcHRlciA9IGFkYXB0ZXI7XG5cbiAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0cmVhbWluZ0h0dHBBZGFwdGVyKSB7XG4gICAgICBhZGFwdGVyLl9zZXRTY29wZShzY29wZSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLi4uY29uZmlnLmVudmlyb25tZW50LFxuICAgICAgLy8gTGFtYmRhIFdlYiBBZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAgICAgIEFXU19MQU1CREFfRVhFQ19XUkFQUEVSOiAnL29wdC9ib290c3RyYXAnLFxuICAgICAgQVdTX0xXQV9JTlZPS0VfTU9ERTogJ3Jlc3BvbnNlX3N0cmVhbScsXG4gICAgICBBV1NfTFdBX1JFQURJTkVTU19DSEVDS19QQVRIOiAnL2hlYWx0aCcsXG4gICAgICBBV1NfTFdBX1BPUlQ6ICc4MDgwJyxcbiAgICAgIFBPUlQ6ICc4MDgwJyxcbiAgICAgIC4uLmF1dGhlbnRpY2F0b3IuZW52aXJvbm1lbnRWYXJpYWJsZXMoKSxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiB3aXRoIExhbWJkYSBXZWIgQWRhcHRlciBsYXllclxuICAgIGNvbnN0IHsgYWNjb3VudCwgcmVnaW9uIH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdCA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGUsXG4gICAgICBmdW5jdGlvbk5hbWU6IGNvbmZpZy5hZ2VudE5hbWUsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBjb25maWcuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICB9KTtcblxuICAgIC8vIExhbWJkYSBXZWIgQWRhcHRlciBsYXllclxuICAgIGNvbnN0IHdlYkFkYXB0ZXJMYXllciA9IExheWVyVmVyc2lvbi5mcm9tTGF5ZXJWZXJzaW9uQXJuKFxuICAgICAgc2NvcGUsXG4gICAgICAnTGFtYmRhV2ViQWRhcHRlckxheWVyJyxcbiAgICAgIGBhcm46YXdzOmxhbWJkYToke3JlZ2lvbn06NzUzMjQwNTk4MDc1OmxheWVyOkxhbWJkYUFkYXB0ZXJMYXllclg4NjoyNWAsXG4gICAgKTtcblxuICAgIGNvbnN0IGFsbExheWVyczogSUxheWVyVmVyc2lvbltdID0gW3dlYkFkYXB0ZXJMYXllcl07XG4gICAgaWYgKGNvbmZpZy5sYW1iZGFMYXllcnMpIHtcbiAgICAgIGFsbExheWVycy5wdXNoKC4uLmNvbmZpZy5sYW1iZGFMYXllcnMpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMgJiYgY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgYWxsTGF5ZXJzLnB1c2goLi4uY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9pbnRlcmFjdGl2ZS1hZ2VudC1oYW5kbGVyJyk7XG5cbiAgICAvLyBBbGwgUHl0aG9uIHZlcnNpb24gcmVmZXJlbmNlcyBkZXJpdmVkIGZyb20gRGVmYXVsdFJ1bnRpbWVzLlBZVEhPTlxuICAgIGNvbnN0IHB5dGhvblJ1bnRpbWUgPSBEZWZhdWx0UnVudGltZXMuUFlUSE9OO1xuICAgIGNvbnN0IHB5VmVyc2lvbiA9IHB5dGhvblJ1bnRpbWUubmFtZS5yZXBsYWNlKCdweXRob24nLCAnJyk7IC8vIGUuZy4gXCIzLjEzXCJcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IHRoaXMucHJvcHMuYXJjaGl0ZWN0dXJlIHx8IGNvbmZpZy5hcmNoaXRlY3R1cmUgfHwgQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICBjb25zdCBtZW1vcnlTaXplID0gdGhpcy5wcm9wcy5tZW1vcnlTaXplIHx8IGNvbmZpZy5tZW1vcnlTaXplIHx8IDEwMjQ7XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMucHJvcHMudGltZW91dCB8fCBjb25maWcudGltZW91dCB8fCBEdXJhdGlvbi5taW51dGVzKDE1KTtcbiAgICBjb25zdCByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID0gdGhpcy5wcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID8/IGNvbmZpZy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zO1xuXG4gICAgY29uc3QgYWdlbnRGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihzY29wZSwgJ0ludGVyYWN0aXZlQWdlbnRGdW5jdGlvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdC51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBhcmNoaXRlY3R1cmUsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChoYW5kbGVyUGF0aCwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBweXRob25SdW50aW1lLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ2Jhc2gnLCAnLWMnLFxuICAgICAgICAgICAgJ3BpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgL2Fzc2V0LW91dHB1dCAmJiBjcCAtYSAuIC9hc3NldC1vdXRwdXQnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICAgICAgICAgIGNvbnN0IHB5dGhvbkNhbmRpZGF0ZXMgPSBbYHB5dGhvbiR7cHlWZXJzaW9ufWAsICdweXRob24zJywgJ3B5dGhvbiddO1xuICAgICAgICAgICAgICAgIGxldCBweXRob25CaW4gPSAncHl0aG9uMyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgcHl0aG9uQ2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyID0gcHJvYy5leGVjU3luYyhgJHtjYW5kaWRhdGV9IC0tdmVyc2lvbiAyPiYxYCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmVyLm1hdGNoKC9QeXRob24gKFxcZCspXFwuKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiAocGFyc2VJbnQobWF0Y2hbMV0pID4gMyB8fCAocGFyc2VJbnQobWF0Y2hbMV0pID09PSAzICYmIHBhcnNlSW50KG1hdGNoWzJdKSA+PSAxMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHl0aG9uQmluID0gY2FuZGlkYXRlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2MuZXhlY1N5bmMoXG4gICAgICAgICAgICAgICAgICBgJHtweXRob25CaW59IC1tIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgXCIke291dHB1dERpcn1cIiAtLXBsYXRmb3JtIG1hbnlsaW51eDIwMTRfeDg2XzY0IC0tb25seS1iaW5hcnk9OmFsbDogLS1weXRob24tdmVyc2lvbiAke3B5VmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgeyBjd2Q6IGhhbmRsZXJQYXRoLCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9jLmV4ZWNTeW5jKFxuICAgICAgICAgICAgICAgICAgYGNwIC1yIC4gXCIke291dHB1dERpcn1cImAsXG4gICAgICAgICAgICAgICAgICB7IGN3ZDogaGFuZGxlclBhdGgsIHN0ZGlvOiAnaW5oZXJpdCcgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogY29uZmlnLmFnZW50Um9sZSxcbiAgICAgIGhhbmRsZXI6ICdydW4uc2gnLFxuICAgICAgcnVudGltZTogcHl0aG9uUnVudGltZSxcbiAgICAgIGxheWVyczogYWxsTGF5ZXJzLFxuICAgICAgdGltZW91dCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiBjb25maWcuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogY29uZmlnLm5ldHdvcmsgPyBjb25maWcubmV0d29yay52cGMgOiB1bmRlZmluZWQsXG4gICAgICB2cGNTdWJuZXRzOiBjb25maWcubmV0d29yayA/IGNvbmZpZy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgbG9nIHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBzIG9mIGFnZW50TGFtYmRhTG9nUGVybWlzc2lvbnNSZXN1bHQucG9saWN5U3RhdGVtZW50cykge1xuICAgICAgY29uZmlnLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBhdXRoZW50aWNhdG9yIHBlcm1pc3Npb25zXG4gICAgaWYgKGF1dGhlbnRpY2F0b3IpIHtcbiAgICAgIGF1dGhlbnRpY2F0b3IuZ3JhbnRBdXRoZW50aWNhdGUoYWdlbnRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGNvbW11bmljYXRpb24gYWRhcHRlciBhbmQgZ2V0IGVuZHBvaW50XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhZGFwdGVyLmF0dGFjaFRvRnVuY3Rpb24oYWdlbnRGdW5jdGlvbik7XG4gICAgYWRhcHRlci5ncmFudEludm9rZShhZ2VudEZ1bmN0aW9uKTtcblxuICAgIHJldHVybiB7IGVuZHBvaW50LCBhZ2VudEZ1bmN0aW9uIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDdXN0b20gSldUIGF1dGhvcml6ZXIgY29uZmlndXJhdGlvbiBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlSnd0QXV0aG9yaXplckNvbmZpZyB7XG4gIC8qKiBPSURDIGRpc2NvdmVyeSBVUkwuICovXG4gIHJlYWRvbmx5IGRpc2NvdmVyeVVybDogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBhdWRpZW5jZXMuICovXG4gIHJlYWRvbmx5IGFsbG93ZWRBdWRpZW5jZT86IHN0cmluZ1tdO1xuICAvKiogQWxsb3dlZCBjbGllbnQgSURzLiAqL1xuICByZWFkb25seSBhbGxvd2VkQ2xpZW50cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyLlxuICovXG4vKipcbiAqIE5ldHdvcmsgbW9kZSBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZy5cbiAqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEFnZW50Q29yZSBSdW50aW1lIHJ1bnMgb24gdGhlIHB1YmxpYyBpbnRlcm5ldFxuICogb3IgaW5zaWRlIGEgVlBDIHdpdGggcHJpdmF0ZSBuZXR3b3JraW5nLlxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrTW9kZSB7XG4gIC8qKlxuICAgKiBSdW50aW1lIGlzIHB1YmxpY2x5IGFjY2Vzc2libGUgKGRlZmF1bHQpLlxuICAgKiBObyBWUEMgY29uZmlndXJhdGlvbiByZXF1aXJlZC5cbiAgICovXG4gIFBVQkxJQyA9ICdQVUJMSUMnLFxuXG4gIC8qKlxuICAgKiBSdW50aW1lIHJ1bnMgaW5zaWRlIGEgVlBDLlxuICAgKlxuICAgKiBBZ2VudENvcmUgY3JlYXRlcyBFTklzIGluIHRoZSBzcGVjaWZpZWQgc3VibmV0cy4gWW91IG11c3QgcHJvdmlkZVxuICAgKiBlaXRoZXIgZXhwbGljaXQgYHZwY1N1Ym5ldHNgIGFuZCBgc2VjdXJpdHlHcm91cHNgLCBvciBwYXNzIGFcbiAgICogYE5ldHdvcmtgIGNvbnN0cnVjdCB2aWEgYEludGVyYWN0aXZlQWdlbnQubmV0d29ya2AuXG4gICAqXG4gICAqIFVzZSBwcml2YXRlIHN1Ym5ldHMgd2l0aCBhIE5BVCBHYXRld2F5IGZvciBpbnRlcm5ldCBhY2Nlc3MuXG4gICAqIFB1YmxpYyBzdWJuZXRzIGRvIE5PVCBwcm92aWRlIGludGVybmV0IGFjY2VzcyB0byBBZ2VudENvcmUgRU5Jcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL2FnZW50Y29yZS12cGMuaHRtbFxuICAgKi9cbiAgVlBDID0gJ1ZQQycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogRUNSIGNvbnRhaW5lciBpbWFnZSBVUkkuIElmIG5vdCBwcm92aWRlZCwgYnVpbGRzIGZyb20gdGhlIGJ1bmRsZWQgaGFuZGxlciBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IEJ1aWxkcyBmcm9tIGFnZW50Y29yZS1hZ2VudC1oYW5kbGVyIGRpcmVjdG9yeVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVySW1hZ2VVcmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgbW9kZSBmb3IgdGhlIEFnZW50Q29yZSBSdW50aW1lLlxuICAgKlxuICAgKiBXaGVuIHNldCB0byBgTmV0d29ya01vZGUuVlBDYCwgdGhlIHJ1bnRpbWUgcnVucyBpbnNpZGUgYSBWUEMgYW5kIEFnZW50Q29yZSBjcmVhdGVzXG4gICAqIEVOSXMgaW4gdGhlIHNwZWNpZmllZCBzdWJuZXRzLiBZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBleHBsaWNpdCBgdnBjU3VibmV0c2BcbiAgICogYW5kIGBzZWN1cml0eUdyb3Vwc2AsIG9yIHBhc3MgYSBgTmV0d29ya2AgY29uc3RydWN0IHZpYSBgQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmtgXG4gICAqICh3aGljaCBpcyBzZXQgYXV0b21hdGljYWxseSBieSBgSW50ZXJhY3RpdmVBZ2VudGAgd2hlbiBgbmV0d29ya2AgaXMgcHJvdmlkZWQpLlxuICAgKlxuICAgKiBGb3IgVlBDIG1vZGUsIHVzZSBwcml2YXRlIHN1Ym5ldHMgd2l0aCBhIE5BVCBHYXRld2F5IGZvciBpbnRlcm5ldCBhY2Nlc3MuXG4gICAqIFB1YmxpYyBzdWJuZXRzIGRvIE5PVCBwcm92aWRlIGludGVybmV0IGFjY2VzcyB0byBBZ2VudENvcmUgRU5Jcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL2FnZW50Y29yZS12cGMuaHRtbFxuICAgKiBAZGVmYXVsdCBOZXR3b3JrTW9kZS5QVUJMSUNcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlPzogTmV0d29ya01vZGU7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldCBzZWxlY3Rpb24gZm9yIFZQQyBuZXR3b3JrIG1vZGUuXG4gICAqXG4gICAqIFNlbGVjdHMgd2hpY2ggc3VibmV0cyB0aGUgQWdlbnRDb3JlIFJ1bnRpbWUgRU5JcyBhcmUgcGxhY2VkIGluLlxuICAgKiBSZXF1aXJlcyBhIFZQQyB0byBiZSBwcm92aWRlZCB2aWEgYEFnZW50SG9zdGluZ0NvbmZpZy5uZXR3b3JrYFxuICAgKiAoc2V0IGF1dG9tYXRpY2FsbHkgYnkgYEludGVyYWN0aXZlQWdlbnRgIHdoZW4gYG5ldHdvcmtgIGlzIHByb3ZpZGVkKVxuICAgKiBzbyB0aGF0IHN1Ym5ldHMgY2FuIGJlIHJlc29sdmVkLlxuICAgKlxuICAgKiBCZXN0IHByYWN0aWNlIGlzIHRvIHNlbGVjdCBwcml2YXRlIHN1Ym5ldHMgd2l0aCBhIE5BVCBHYXRld2F5XG4gICAqIGluIGF0IGxlYXN0IDIgQXZhaWxhYmlsaXR5IFpvbmVzLiBNYXhpbXVtIDE2IHN1Ym5ldHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBgdnBjU3VibmV0c2AgYW5kIGBBZ2VudEhvc3RpbmdDb25maWcubmV0d29ya2AgYXJlIHByb3ZpZGVkLFxuICAgKiBgdnBjU3VibmV0c2AgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBuZXR3b3JrJ3MgZGVmYXVsdCBhcHBsaWNhdGlvbiBzdWJuZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERlcml2ZWQgZnJvbSBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay5hcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbigpIGlmIGF2YWlsYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjU3VibmV0cz86IFN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIGZvciBWUEMgbmV0d29yayBtb2RlLlxuICAgKlxuICAgKiBBdHRhY2hlZCB0byB0aGUgQWdlbnRDb3JlIFJ1bnRpbWUgRU5Jcy4gTWF4aW11bSAxNiBzZWN1cml0eSBncm91cHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBgc2VjdXJpdHlHcm91cHNgIGFuZCBgQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmtgIGFyZSBwcm92aWRlZCxcbiAgICogYHNlY3VyaXR5R3JvdXBzYCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IHNlY3VyaXR5IGdyb3VwIGFsbG93aW5nIGFsbCBvdXRib3VuZCB0cmFmZmljIGlzIGNyZWF0ZWRcbiAgICogZnJvbSBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yayBpZiBhdmFpbGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogQ3VzdG9tIEpXVCBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIE9taXQgZm9yIElBTS1vbmx5IGF1dGguXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Kd3RBdXRob3JpemVyPzogQWdlbnRDb3JlSnd0QXV0aG9yaXplckNvbmZpZztcblxuICAvKipcbiAgICogUHJvdG9jb2wgY29uZmlndXJhdGlvbjogJ0hUVFAnIHwgJ01DUCcgfCAnQTJBJy5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0hUVFAnXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgZW5kcG9pbnQgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1nZW5lcmF0ZWQgZnJvbSBhZ2VudCBuYW1lXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZyBhZGFwdGVyIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIERlcGxveXMgdGhlIGFnZW50IGFzIGEgY29udGFpbmVyIHJ1bm5pbmcgb24gQWdlbnRDb3JlIFJ1bnRpbWUgKG1pY3JvVk0pLlxuICogVXNlcyBMMSBjb25zdHJ1Y3RzIGBDZm5SdW50aW1lYCBhbmQgYENmblJ1bnRpbWVFbmRwb2ludGAgZnJvbVxuICogYGF3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlYC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgQWdlbnRDb3JlIFJ1bnRpbWUgRW5kcG9pbnQg4oaSIENvbnRhaW5lciAoRmFzdEFQSSBvbiBwb3J0IDgwODApIOKGkiBCZWRyb2NrXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTZXNzaW9uIElzb2xhdGlvbioqOiBtaWNyb1ZNIHByb3ZpZGVzIHBlci1zZXNzaW9uIGlzb2xhdGlvbiAobm8gUzMgc2Vzc2lvbiBidWNrZXQgbmVlZGVkKVxuICogLSAqKk1hbmFnZWQgSW5mcmFzdHJ1Y3R1cmUqKjogTm8gTGFtYmRhIGNvbGQgc3RhcnRzIG9yIHRpbWVvdXQgbGltaXRzXG4gKiAtICoqTXVsdGlwbGUgUHJvdG9jb2xzKio6IEhUVFAsIE1DUCwgb3IgQTJBIHByb3RvY29sIHN1cHBvcnRcbiAqIC0gKipDb250YWluZXItQmFzZWQqKjogU3RhbmRhcmQgRG9ja2VyIGltYWdlIGRlcGxveW1lbnRcbiAqIC0gKipWUEMgU3VwcG9ydCoqOiBSdW4gaW5zaWRlIGEgVlBDIHdpdGggcHJpdmF0ZSBzdWJuZXRzIGZvciBuZXR3b3JrIGlzb2xhdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlciwgTmV0d29ya01vZGUgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogZGVjbGFyZSBjb25zdCBteVByb21wdDogQXNzZXQ7XG4gKlxuICogbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdNeUNoYXRib3QnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gKiAgICAgbmV0d29ya01vZGU6IE5ldHdvcmtNb2RlLlBVQkxJQyxcbiAqICAgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIH1cblxuICBnZXQgc2VydmljZVByaW5jaXBhbCgpIHsgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuICAgIGNvbnN0IG5ldHdvcmtNb2RlID0gdGhpcy5wcm9wcy5uZXR3b3JrTW9kZSB8fCBOZXR3b3JrTW9kZS5QVUJMSUM7XG5cbiAgICAvLyBSZXNvbHZlIFZQQyBjb25maWd1cmF0aW9uIGZvciBWUEMgbmV0d29yayBtb2RlXG4gICAgbGV0IHJlc29sdmVkU3VibmV0SWRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuVlBDKSB7XG4gICAgICAvLyBFeHBsaWNpdCBwcm9wcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBOZXR3b3JrIGNvbnN0cnVjdFxuICAgICAgaWYgKHRoaXMucHJvcHMudnBjU3VibmV0cyAmJiBjb25maWcubmV0d29yaykge1xuICAgICAgICByZXNvbHZlZFN1Ym5ldElkcyA9IGNvbmZpZy5uZXR3b3JrLnZwYy5zZWxlY3RTdWJuZXRzKHRoaXMucHJvcHMudnBjU3VibmV0cykuc3VibmV0SWRzO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcubmV0d29yaykge1xuICAgICAgICBjb25zdCBzdWJuZXRzID0gY29uZmlnLm5ldHdvcmsudnBjLnNlbGVjdFN1Ym5ldHMoXG4gICAgICAgICAgY29uZmlnLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSxcbiAgICAgICAgKS5zdWJuZXRJZHM7XG4gICAgICAgIHJlc29sdmVkU3VibmV0SWRzID0gc3VibmV0cztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzID0gdGhpcy5wcm9wcy5zZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuc2VjdXJpdHlHcm91cElkKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5ldHdvcmspIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBBZ2VudENvcmUgcnVudGltZSBFTklzXG4gICAgICAgIGNvbnN0IHNnID0gbmV3IFNlY3VyaXR5R3JvdXAoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lU0cnLCB7XG4gICAgICAgICAgdnBjOiBjb25maWcubmV0d29yay52cGMsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTZWN1cml0eSBncm91cCBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgRU5JcycsXG4gICAgICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyA9IFtzZy5zZWN1cml0eUdyb3VwSWRdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc29sdmVkU3VibmV0SWRzIHx8IHJlc29sdmVkU3VibmV0SWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZQQyBuZXR3b3JrIG1vZGUgcmVxdWlyZXMgc3VibmV0cyB0byBiZSBwcm92aWRlZCBlaXRoZXIgdmlhICcgK1xuICAgICAgICAgICdBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJQcm9wcy52cGNTdWJuZXRzICh3aXRoIGEgTmV0d29yayBjb25zdHJ1Y3QpICcgK1xuICAgICAgICAgICdvciB2aWEgYSBOZXR3b3JrIGNvbnN0cnVjdCBpbiBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNvbHZlZFNlY3VyaXR5R3JvdXBJZHMgfHwgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1ZQQyBuZXR3b3JrIG1vZGUgcmVxdWlyZXMgc2VjdXJpdHkgZ3JvdXBzIHRvIGJlIHByb3ZpZGVkIGVpdGhlciB2aWEgJyArXG4gICAgICAgICAgJ0FnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzLnNlY3VyaXR5R3JvdXBzIG9yIHZpYSBhIE5ldHdvcmsgY29uc3RydWN0ICcgK1xuICAgICAgICAgICdpbiBBZ2VudEhvc3RpbmdDb25maWcubmV0d29yay4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIG9yIHJlZmVyZW5jZSBjb250YWluZXIgaW1hZ2VcbiAgICBsZXQgY29udGFpbmVyVXJpOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmkpIHtcbiAgICAgIGNvbnRhaW5lclVyaSA9IHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9hZ2VudGNvcmUtYWdlbnQtaGFuZGxlcicpO1xuICAgICAgY29uc3QgaW1hZ2VBc3NldCA9IG5ldyBEb2NrZXJJbWFnZUFzc2V0KHNjb3BlLCAnQWdlbnRDb3JlSGFuZGxlckltYWdlJywge1xuICAgICAgICBkaXJlY3Rvcnk6IGhhbmRsZXJQYXRoLFxuICAgICAgfSk7XG4gICAgICBjb250YWluZXJVcmkgPSBpbWFnZUFzc2V0LmltYWdlVXJpO1xuICAgIH1cblxuICAgIC8vIFJldXNlIHRoZSBzaW5nbGUgYWdlbnRSb2xlIChhbHJlYWR5IGhhcyBiZWRyb2NrLWFnZW50Y29yZSB0cnVzdCBmcm9tIEJhc2VBZ2VudCkuXG4gICAgLy8gT25seSBhZGQgRUNSIHB1bGwgcGVybWlzc2lvbnMg4oCUIGFsbCBvdGhlciBwZXJtaXNzaW9ucyAoQmVkcm9jayBJbnZva2VNb2RlbCxcbiAgICAvLyBTMyB0b29sIGFzc2V0cywgS0IgYWNjZXNzLCBzZXNzaW9uIGJ1Y2tldCwgb2JzZXJ2YWJpbGl0eSkgYXJlIGFscmVhZHkgZ3JhbnRlZFxuICAgIC8vIGJ5IEJhc2VBZ2VudCBvbiBjb25maWcuYWdlbnRSb2xlLlxuICAgIGNvbnN0IGVjclBvbGljeVJlc3VsdCA9IGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIEFET1Qgb2JzZXJ2YWJpbGl0eSBwZXJtaXNzaW9ucyB3aGVuIGVuYWJsZWQuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBEb2NrZXJmaWxlIHVzZXMgYG9wZW50ZWxlbWV0cnktaW5zdHJ1bWVudGAgYXMgaXRzIENNRCB3cmFwcGVyO1xuICAgIC8vIEFET1QgbmVlZHMgdGhlc2UgcGVybWlzc2lvbnMgdG8gZXhwb3J0IHRyYWNlcywgbG9ncywgYW5kIG1ldHJpY3MgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgIC8vIE5vdGU6IFdlIHVzZSBleHBsaWNpdCBzdGF0ZW1lbnRzIGluc3RlYWQgb2YgQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3lcbiAgICAvLyBiZWNhdXNlIHRoYXQgbWFuYWdlZCBwb2xpY3kgb25seSBjb3ZlcnMgL2F3cy9hcHBsaWNhdGlvbi1zaWduYWxzL2RhdGEgbG9nIGdyb3VwXG4gICAgLy8gYW5kIG1pc3NlcyBwZXJtaXNzaW9ucyBBRE9UIG5lZWRzIChEZXNjcmliZUxvZ0dyb3VwcywgRGVzY3JpYmVMb2dTdHJlYW1zLCBQdXRNZXRyaWNEYXRhKS5cbiAgICBpZiAoY29uZmlnLmVuYWJsZU9ic2VydmFiaWxpdHkpIHtcbiAgICAgIGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG4gICAgICBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNvbnRhaW5lclxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIFVubGlrZSBMYW1iZGEsIEFnZW50Q29yZSBjb250YWluZXJzIGRvbid0IGdldCBBV1NfUkVHSU9OIGF1dG9tYXRpY2FsbHkuXG4gICAgICAvLyBib3RvMyBhbmQgb3RoZXIgQVdTIFNES3MgbmVlZCBpdCB0byBtYWtlIEFQSSBjYWxscy5cbiAgICAgIEFXU19SRUdJT046IHJlZ2lvbixcbiAgICAgIEFXU19ERUZBVUxUX1JFR0lPTjogcmVnaW9uLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudmlyb25tZW50KSkge1xuICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogQUdFTlRfT0JTRVJWQUJJTElUWV9FTkFCTEVEIGFuZCBPVEVMXyogZW52IHZhcnMgYXJlIE5PVCBzZXQgaGVyZS5cbiAgICAvLyBGb3IgQWdlbnRDb3JlLWhvc3RlZCBhZ2VudHMsIHRoZSBBRE9UIGF1dG8taW5zdHJ1bWVudGF0aW9uIHZpYVxuICAgIC8vIGBvcGVudGVsZW1ldHJ5LWluc3RydW1lbnRgIGluIHRoZSBEb2NrZXJmaWxlIENNRCBoYW5kbGVzIHRyYWNlL3NwYW5cbiAgICAvLyBleHBvcnQgYXV0b21hdGljYWxseS4gVGhlc2UgZW52IHZhcnMgYXJlIG9ubHkgbmVlZGVkIGZvciBhZ2VudHNcbiAgICAvLyBob3N0ZWQgb3V0c2lkZSBvZiBBZ2VudENvcmUuXG5cbiAgICAvLyBCdWlsZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBuZXR3b3JrQ29uZmlndXJhdGlvbjogYW55ID0ge1xuICAgICAgbmV0d29ya01vZGUsXG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBpZiBKV1QgYXV0aG9yaXplciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyID8ge1xuICAgICAgY3VzdG9tSnd0QXV0aG9yaXplcjoge1xuICAgICAgICBkaXNjb3ZlcnlVcmw6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5kaXNjb3ZlcnlVcmwsXG4gICAgICAgIGFsbG93ZWRBdWRpZW5jZTogdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyLmFsbG93ZWRBdWRpZW5jZSxcbiAgICAgICAgYWxsb3dlZENsaWVudHM6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5hbGxvd2VkQ2xpZW50cyxcbiAgICAgIH0sXG4gICAgfSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lXG4gICAgY29uc3QgcnVudGltZSA9IG5ldyBDZm5SdW50aW1lKHNjb3BlLCAnQWdlbnRDb3JlUnVudGltZScsIHtcbiAgICAgIGFnZW50UnVudGltZU5hbWU6IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9ydW50aW1lYCxcbiAgICAgIGFnZW50UnVudGltZUFydGlmYWN0OiB7XG4gICAgICAgIGNvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb250YWluZXJVcmksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcm9sZUFybjogY29uZmlnLmFnZW50Um9sZS5yb2xlQXJuLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb24sXG4gICAgICBhdXRob3JpemVyQ29uZmlndXJhdGlvbjogYXV0aENvbmZpZyxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBlbnZWYXJzLFxuICAgIH0pO1xuXG4gICAgcnVudGltZS5hcHBseVJlbW92YWxQb2xpY3koY29uZmlnLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgIC8vIFdoZW4gSldUIGF1dGggaXMgY29uZmlndXJlZCwgYWxsb3dsaXN0IHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBzbyB0aGVcbiAgICAvLyBjb250YWluZXIgY2FuIGV4dHJhY3QgdXNlciBpZGVudGl0eSBjbGFpbXMgZnJvbSB0aGUgZm9yd2FyZGVkIEpXVCB0b2tlbi5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1vYXV0aC5odG1sI29hdXRoLXByb3BhZ2F0ZS1qd3QtdG9rZW5cbiAgICBpZiAodGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ1JlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uJywge1xuICAgICAgICBSZXF1ZXN0SGVhZGVyQWxsb3dsaXN0OiBbJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gVlBDIG1vZGUgaXMgY29uZmlndXJlZCwgc2V0IHRoZSBOZXR3b3JrTW9kZUNvbmZpZyB3aXRoIHN1Ym5ldHMgYW5kXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXBzIHZpYSBwcm9wZXJ0eSBvdmVycmlkZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBDREsgMi4yMTguMFxuICAgIC8vIGRvZXMgbm90IHlldCBoYXZlIHR5cGVkIHN1cHBvcnQgZm9yIE5ldHdvcmtNb2RlQ29uZmlnIChhZGRlZCBpbiAyLjI0MC4wKS5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvYWdlbnRjb3JlLXZwYy5odG1sXG4gICAgaWYgKG5ldHdvcmtNb2RlID09PSBOZXR3b3JrTW9kZS5WUEMgJiYgcmVzb2x2ZWRTdWJuZXRJZHMgJiYgcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ05ldHdvcmtDb25maWd1cmF0aW9uLk5ldHdvcmtNb2RlQ29uZmlnJywge1xuICAgICAgICBTdWJuZXRzOiByZXNvbHZlZFN1Ym5ldElkcyxcbiAgICAgICAgU2VjdXJpdHlHcm91cHM6IHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBDZm5SdW50aW1lIHdhaXRzIGZvciB0aGUgcm9sZSBhbmQgaXRzIHBvbGljaWVzIHRvIGJlIGZ1bGx5IGNyZWF0ZWQvdXBkYXRlZC5cbiAgICAvLyBXaXRob3V0IHRoaXMsIENsb3VkRm9ybWF0aW9uIG1heSB2YWxpZGF0ZSB0aGUgcm9sZSBiZWZvcmU6XG4gICAgLy8gLSBUaGUgdHJ1c3QgcG9saWN5IGlzIHVwZGF0ZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbSAoZHVyaW5nIHN0YWNrIHVwZGF0ZXMpXG4gICAgLy8gLSBUaGUgRUNSIHBlcm1pc3Npb25zIHBvbGljeSBpcyBhdHRhY2hlZFxuICAgIHJ1bnRpbWUubm9kZS5hZGREZXBlbmRlbmN5KGNvbmZpZy5hZ2VudFJvbGUpO1xuICAgIGlmIChlY3JQb2xpY3lSZXN1bHQucG9saWN5RGVwZW5kYWJsZSkge1xuICAgICAgcnVudGltZS5ub2RlLmFkZERlcGVuZGVuY3koZWNyUG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUpO1xuICAgIH1cblxuICAgIC8vIEluIFZQQyBtb2RlLCB0aGUgQWdlbnRDb3JlIHJ1bnRpbWUgdGFrZXMgbG9uZ2VyIHRvIHByb3Zpc2lvbiAoRU5JIGNyZWF0aW9uLFxuICAgIC8vIHN1Ym5ldCBhdHRhY2htZW50KSBidXQgQ2xvdWRGb3JtYXRpb24gbWFya3MgQ2ZuUnVudGltZSBhcyBDUkVBVEVfQ09NUExFVEVcbiAgICAvLyBiZWZvcmUgdGhlIHJ1bnRpbWUgcmVhY2hlcyBSRUFEWSBzdGF0dXMuIEluc2VydCBhIGN1c3RvbSByZXNvdXJjZSB3YWl0ZXJcbiAgICAvLyB0aGF0IHBvbGxzIEdldEFnZW50UnVudGltZSB1bnRpbCBzdGF0dXMgaXMgUkVBRFkgYmVmb3JlIGNyZWF0aW5nIHRoZSBlbmRwb2ludC5cbiAgICBsZXQgcnVudGltZVdhaXRlcjogQ3VzdG9tUmVzb3VyY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG5ldHdvcmtNb2RlID09PSBOZXR3b3JrTW9kZS5WUEMpIHtcbiAgICAgIGNvbnN0IHVuaXF1ZVN1ZmZpeCA9IE5hbWVzLnVuaXF1ZUlkKHJ1bnRpbWUpLnNsaWNlKC04KS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjb25zdCB3YWl0ZXJGbiA9IG5ldyBGdW5jdGlvbihzY29wZSwgJ1J1bnRpbWVSZWFkeVdhaXRlckZuJywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGAke2NvbmZpZy5hZ2VudE5hbWV9LXJ0LXdhaXRlci0ke3VuaXF1ZVN1ZmZpeH1gLFxuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShbXG4gICAgICAgICAgJ2NvbnN0IGh0dHBzID0gcmVxdWlyZShcImh0dHBzXCIpOycsXG4gICAgICAgICAgJ2NvbnN0IHVybCA9IHJlcXVpcmUoXCJ1cmxcIik7JyxcbiAgICAgICAgICAnY29uc3QgeyBCZWRyb2NrQWdlbnRDb3JlQ29udHJvbENsaWVudCwgR2V0QWdlbnRSdW50aW1lQ29tbWFuZCB9ID0gcmVxdWlyZShcIkBhd3Mtc2RrL2NsaWVudC1iZWRyb2NrLWFnZW50Y29yZS1jb250cm9sXCIpOycsXG4gICAgICAgICAgJ2Z1bmN0aW9uIHNlbmRSZXNwb25zZShldmVudCwgY29udGV4dCwgc3RhdHVzLCBkYXRhLCByZWFzb24pIHsnLFxuICAgICAgICAgICcgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7JyxcbiAgICAgICAgICAnICAgIFN0YXR1czogc3RhdHVzLCcsXG4gICAgICAgICAgJyAgICBSZWFzb246IHJlYXNvbiB8fCBcIlNlZSBDbG91ZFdhdGNoIExvZyBTdHJlYW06IFwiICsgY29udGV4dC5sb2dTdHJlYW1OYW1lLCcsXG4gICAgICAgICAgJyAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5BZ2VudFJ1bnRpbWVJZCB8fCBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCwnLFxuICAgICAgICAgICcgICAgU3RhY2tJZDogZXZlbnQuU3RhY2tJZCwnLFxuICAgICAgICAgICcgICAgUmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsJyxcbiAgICAgICAgICAnICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCwnLFxuICAgICAgICAgICcgICAgRGF0YTogZGF0YSB8fCB7fSwnLFxuICAgICAgICAgICcgIH0pOycsXG4gICAgICAgICAgJyAgY29uc3QgcGFyc2VkID0gdXJsLnBhcnNlKGV2ZW50LlJlc3BvbnNlVVJMKTsnLFxuICAgICAgICAgICcgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7JyxcbiAgICAgICAgICAnICAgIGNvbnN0IHJlcSA9IGh0dHBzLnJlcXVlc3QoeyBob3N0bmFtZTogcGFyc2VkLmhvc3RuYW1lLCBwYXRoOiBwYXJzZWQucGF0aCwgbWV0aG9kOiBcIlBVVFwiLCcsXG4gICAgICAgICAgJyAgICAgIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJcIiwgXCJjb250ZW50LWxlbmd0aFwiOiBib2R5Lmxlbmd0aCB9IH0sIHJlc29sdmUpOycsXG4gICAgICAgICAgJyAgICByZXEub24oXCJlcnJvclwiLCByZWplY3QpOycsXG4gICAgICAgICAgJyAgICByZXEud3JpdGUoYm9keSk7JyxcbiAgICAgICAgICAnICAgIHJlcS5lbmQoKTsnLFxuICAgICAgICAgICcgIH0pOycsXG4gICAgICAgICAgJ30nLFxuICAgICAgICAgICdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsnLFxuICAgICAgICAgICcgIHRyeSB7JyxcbiAgICAgICAgICAnICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gXCJEZWxldGVcIikgeyBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIFwiU1VDQ0VTU1wiLCB7fSk7IHJldHVybjsgfScsXG4gICAgICAgICAgJyAgICBjb25zdCBjbGllbnQgPSBuZXcgQmVkcm9ja0FnZW50Q29yZUNvbnRyb2xDbGllbnQoKTsnLFxuICAgICAgICAgICcgICAgY29uc3QgcnVudGltZUlkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkFnZW50UnVudGltZUlkOycsXG4gICAgICAgICAgJyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwOyBpKyspIHsnLFxuICAgICAgICAgICcgICAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldEFnZW50UnVudGltZUNvbW1hbmQoeyBhZ2VudFJ1bnRpbWVJZDogcnVudGltZUlkIH0pKTsnLFxuICAgICAgICAgICcgICAgICBjb25zdCBzdGF0dXMgPSByZXNwLnN0YXR1cyB8fCByZXNwLmFnZW50UnVudGltZVN0YXR1czsnLFxuICAgICAgICAgICcgICAgICBjb25zb2xlLmxvZyhgQXR0ZW1wdCAke2kgKyAxfTogcnVudGltZSBzdGF0dXMgPSAke3N0YXR1c31gKTsnLFxuICAgICAgICAgICcgICAgICBpZiAoc3RhdHVzID09PSBcIlJFQURZXCIpIHsgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIlNVQ0NFU1NcIiwgeyBTdGF0dXM6IHN0YXR1cyB9KTsgcmV0dXJuOyB9JyxcbiAgICAgICAgICAnICAgICAgaWYgKHN0YXR1cyA9PT0gXCJGQUlMRURcIikgeyBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIFwiRkFJTEVEXCIsIHt9LCBcIlJ1bnRpbWUgZW50ZXJlZCBGQUlMRUQgc3RhdHVzXCIpOyByZXR1cm47IH0nLFxuICAgICAgICAgICcgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMTUwMDApKTsnLFxuICAgICAgICAgICcgICAgfScsXG4gICAgICAgICAgJyAgICBhd2FpdCBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIFwiRkFJTEVEXCIsIHt9LCBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBydW50aW1lIFJFQURZIHN0YXR1c1wiKTsnLFxuICAgICAgICAgICcgIH0gY2F0Y2ggKGUpIHsnLFxuICAgICAgICAgICcgICAgY29uc29sZS5lcnJvcihlKTsnLFxuICAgICAgICAgICcgICAgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIkZBSUxFRFwiLCB7fSwgZS5tZXNzYWdlKTsnLFxuICAgICAgICAgICcgIH0nLFxuICAgICAgICAgICd9OycsXG4gICAgICAgIF0uam9pbignXFxuJykpLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEyKSxcbiAgICAgIH0pO1xuXG4gICAgICB3YWl0ZXJGbi5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkdldEFnZW50UnVudGltZSddLFxuICAgICAgICByZXNvdXJjZXM6IFtTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgICBzZXJ2aWNlOiAnYmVkcm9jay1hZ2VudGNvcmUnLFxuICAgICAgICAgIHJlc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgcmVzb3VyY2VOYW1lOiAnKicsXG4gICAgICAgIH0pXSxcbiAgICAgIH0pKTtcblxuICAgICAgcnVudGltZVdhaXRlciA9IG5ldyBDdXN0b21SZXNvdXJjZShzY29wZSwgJ1J1bnRpbWVSZWFkeVdhaXRlcicsIHtcbiAgICAgICAgc2VydmljZVRva2VuOiB3YWl0ZXJGbi5mdW5jdGlvbkFybixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIEFnZW50UnVudGltZUlkOiBydW50aW1lLnJlZixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcnVudGltZVdhaXRlci5ub2RlLmFkZERlcGVuZGVuY3kocnVudGltZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENmblJ1bnRpbWVFbmRwb2ludFxuICAgIGNvbnN0IGVuZHBvaW50TmFtZSA9IHRoaXMucHJvcHMuZW5kcG9pbnROYW1lIHx8IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9lbmRwb2ludGA7XG4gICAgY29uc3QgcnVudGltZUVuZHBvaW50ID0gbmV3IENmblJ1bnRpbWVFbmRwb2ludChzY29wZSwgJ0FnZW50Q29yZVJ1bnRpbWVFbmRwb2ludCcsIHtcbiAgICAgIGFnZW50UnVudGltZUlkOiBydW50aW1lLnJlZixcbiAgICAgIGFnZW50UnVudGltZVZlcnNpb246IHJ1bnRpbWUuYXR0ckFnZW50UnVudGltZVZlcnNpb24sXG4gICAgICBuYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICAuLi4odGhpcy5wcm9wcy5wcm90b2NvbENvbmZpZ3VyYXRpb24gJiYge1xuICAgICAgICBwcm90b2NvbENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBzZXJ2ZXJQcm90b2NvbDogdGhpcy5wcm9wcy5wcm90b2NvbENvbmZpZ3VyYXRpb24sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBydW50aW1lRW5kcG9pbnQuYXBwbHlSZW1vdmFsUG9saWN5KGNvbmZpZy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVuZHBvaW50IHdhaXRzIGZvciB0aGUgcnVudGltZSB0byBiZSBSRUFEWSBpbiBWUEMgbW9kZVxuICAgIGlmIChydW50aW1lV2FpdGVyKSB7XG4gICAgICBydW50aW1lRW5kcG9pbnQubm9kZS5hZGREZXBlbmRlbmN5KHJ1bnRpbWVXYWl0ZXIpO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZnVsbCBpbnZvY2F0aW9uIFVSTCBmb3IgZGlyZWN0IEhUVFBTIGFjY2VzcyAocmVxdWlyZWQgZm9yIEpXVCBhdXRoKS5cbiAgICAvLyBGb3JtYXQ6IGh0dHBzOi8vYmVkcm9jay1hZ2VudGNvcmUue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS9ydW50aW1lcy97VVJMLWVuY29kZWQtQVJOfS9pbnZvY2F0aW9ucz9xdWFsaWZpZXI9e2VuZHBvaW50TmFtZX1cbiAgICBjb25zdCBlbmNvZGVkQXJuID0gRm4uam9pbignJywgW1xuICAgICAgJ2FybiUzQWF3cyUzQWJlZHJvY2stYWdlbnRjb3JlJTNBJyxcbiAgICAgIHJlZ2lvbixcbiAgICAgICclM0EnLFxuICAgICAgYWNjb3VudCxcbiAgICAgICclM0FydW50aW1lJTJGJyxcbiAgICAgIHJ1bnRpbWUuYXR0ckFnZW50UnVudGltZUlkLFxuICAgIF0pO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gRm4uam9pbignJywgW1xuICAgICAgJ2h0dHBzOi8vYmVkcm9jay1hZ2VudGNvcmUuJyxcbiAgICAgIHJlZ2lvbixcbiAgICAgICcuYW1hem9uYXdzLmNvbS9ydW50aW1lcy8nLFxuICAgICAgZW5jb2RlZEFybixcbiAgICAgICcvaW52b2NhdGlvbnM/cXVhbGlmaWVyPScsXG4gICAgICBlbmRwb2ludE5hbWUsXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyBlbmRwb2ludCwgY2ZuUnVudGltZTogcnVudGltZSB9O1xuICB9XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBJbnRlcmFjdGl2ZUFnZW50LlxuICpcbiAqIEV4dGVuZHMgQmFzZUFnZW50UHJvcHMgd2l0aCBjb21tdW5pY2F0aW9uLCBzZXNzaW9uLCBjb250ZXh0LCBhbmQgYXV0aGVudGljYXRpb25cbiAqIHN0cmF0ZWd5IGludGVyZmFjZXMgZm9yIGJ1aWxkaW5nIHJlYWwtdGltZSBjb252ZXJzYXRpb25hbCBBSSBhZ2VudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3RpdmVBZ2VudFByb3BzIGV4dGVuZHMgQmFzZUFnZW50UHJvcHMge1xuICAvKipcbiAgICogSG9zdGluZyBhZGFwdGVyIGZvciBkZXBsb3lpbmcgdGhlIGFnZW50IHJ1bnRpbWUuXG4gICAqXG4gICAqIFVzZSBgTGFtYmRhSG9zdGluZ0FkYXB0ZXJgIGZvciBMYW1iZGEgKyBBUEkgR2F0ZXdheSAoZGVmYXVsdCkgb3JcbiAgICogYEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcmAgZm9yIEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGBjb21tdW5pY2F0aW9uQWRhcHRlcmAsIGBhdXRoZW50aWNhdG9yYCwgYG1lbW9yeVNpemVgLFxuICAgKiBgdGltZW91dGAsIGBhcmNoaXRlY3R1cmVgLCBhbmQgYHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnNgIHByb3BzXG4gICAqIGFyZSBpZ25vcmVkIChjb25maWd1cmUgdGhlbSBvbiB0aGUgYWRhcHRlciBkaXJlY3RseSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IExhbWJkYUhvc3RpbmdBZGFwdGVyXG4gICAqL1xuICByZWFkb25seSBob3N0aW5nQWRhcHRlcj86IElIb3N0aW5nQWRhcHRlcjtcbiAgLyoqXG4gICAqIENvbW11bmljYXRpb24gYWRhcHRlciBmb3IgY2xpZW50LWFnZW50IGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdHJlYW1pbmdIdHRwQWRhcHRlciB3aXRoIENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcblxuICAvKipcbiAgICogU2Vzc2lvbiBzdG9yZSBmb3IgcGVyc2lzdGluZyBjb252ZXJzYXRpb24gc3RhdGUuXG4gICAqIFNldCB0byB1bmRlZmluZWQgdG8gZGlzYWJsZSBzZXNzaW9uIHBlcnNpc3RlbmNlIChzdGF0ZWxlc3MgbW9kZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFMzU2Vzc2lvbk1hbmFnZXIgd2l0aCAyNC1ob3VyIFRUTFxuICAgKiBAZGVwcmVjYXRlZCBTZXNzaW9uIG1hbmFnZW1lbnQgaXMgbm93IGhhbmRsZWQgYnkgU3RyYW5kcy1uYXRpdmUgYFMzU2Vzc2lvbk1hbmFnZXJgLlxuICAgKiBBbiBTMyBidWNrZXQgaXMgYWx3YXlzIGNyZWF0ZWQgYW5kIHBhc3NlZCBhcyBgU0VTU0lPTl9CVUNLRVRgIGVudiB2YXIuXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uU3RvcmU/OiBJU2Vzc2lvblN0b3JlO1xuXG4gIC8qKlxuICAgKiBTMyBidWNrZXQgZm9yIHNlc3Npb24gc3RvcmFnZSAoc2hvcnRoYW5kIGZvciBTM1Nlc3Npb25NYW5hZ2VyKS5cbiAgICogSWdub3JlZCBpZiBzZXNzaW9uU3RvcmUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBidWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25CdWNrZXQ/OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgZm9yIHNlc3Npb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5ob3VycygyNClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogU2Vzc2lvbiBpbmRleCBmb3IgZmFzdCB1c2VyIHRvIHNlc3Npb24gbG9va3Vwcy5cbiAgICogUHJvdmlkZXMgZWZmaWNpZW50IHF1ZXJ5aW5nIG9mIGEgdXNlcidzIHNlc3Npb25zIGZvciBsaXN0aW5nIGFuZCBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEeW5hbW9EQlNlc3Npb25JbmRleCAoYXV0by1jcmVhdGVkKVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkluZGV4PzogSVNlc3Npb25JbmRleDtcblxuICAvKipcbiAgICogQ29udGV4dCBzdHJhdGVneSBmb3IgY29udmVyc2F0aW9uIGhpc3RvcnkgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgd2l0aCAyMCBtZXNzYWdlc1xuICAgKiBAZGVwcmVjYXRlZCBDb252ZXJzYXRpb24gbWFuYWdlbWVudCBpcyBub3cgaGFuZGxlZCBieSBTdHJhbmRzLW5hdGl2ZVxuICAgKiBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGluIHRoZSBQeXRob24gaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRTdHJhdGVneT86IElDb250ZXh0U3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXAgaW4gY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gICAqIFNob3J0aGFuZCBmb3IgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgd2luZG93U2l6ZS5cbiAgICogSWdub3JlZCBpZiBjb250ZXh0U3RyYXRlZ3kgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwXG4gICAqIEBkZXByZWNhdGVkIENvbnZlcnNhdGlvbiB3aW5kb3dpbmcgaXMgbm93IGhhbmRsZWQgYnkgU3RyYW5kcy1uYXRpdmVcbiAgICogYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBpbiB0aGUgUHl0aG9uIGhhbmRsZXIgKGRlZmF1bHQ6IDIwKS5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2VIaXN0b3J5TGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIEFQSSBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG5cbiAgLyoqXG4gICAqIEhUVFAgbWV0aG9kcyB0byBhbGxvdyBpbiBDT1JTIHByZWZsaWdodCByZXNwb25zZXMuXG4gICAqIFVzZSB0aGlzIHRvIGVuYWJsZSBhZGRpdGlvbmFsIG1ldGhvZHMgKEdFVCwgREVMRVRFLCBQVVQpIGZvciBjdXN0b20gcm91dGVzXG4gICAqIGFkZGVkIHRvIHRoZSBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgWydQT1NUJywgJ09QVElPTlMnXVxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gbWVtb3J5IHNpemUgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcmVzZXJ2ZWQgY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJhY3RpdmUgQWdlbnQgZm9yIHJlYWwtdGltZSBjb252ZXJzYXRpb25hbCBBSSB3aXRoIFNTRSBzdHJlYW1pbmcuXG4gKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHNlcnZlcmxlc3MgaW5mcmFzdHJ1Y3R1cmUgZm9yIGludGVyYWN0aXZlIEFJIGNvbnZlcnNhdGlvbnNcbiAqIHVzaW5nIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nLCBMYW1iZGEgV2ViIEFkYXB0ZXIsXG4gKiBGYXN0QVBJLCBhbmQgc3RhbmRhcmQgU3RyYW5kcyBBZ2VudC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCAoZmV0Y2ggKyBSZWFkYWJsZVN0cmVhbSlcbiAqICAgICDihpMgUE9TVCAvY2hhdCAoQXV0aG9yaXphdGlvbjogQmVhcmVyIEpXVClcbiAqIEFQSSBHYXRld2F5IFJFU1QgQVBJIChyZXNwb25zZVRyYW5zZmVyTW9kZTogU1RSRUFNKVxuICogICAgIOKGkyBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW1cbiAqIExhbWJkYSAoUHl0aG9uICsgTGFtYmRhIFdlYiBBZGFwdGVyICsgRmFzdEFQSSlcbiAqICAgICDihpMgc3RyYW5kcy5BZ2VudCBzdHJlYW1pbmdcbiAqIEFtYXpvbiBCZWRyb2NrIChDbGF1ZGUpXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTU0UgU3RyZWFtaW5nKio6IFJlYWwtdGltZSB0b2tlbi1ieS10b2tlbiByZXNwb25zZSBzdHJlYW1pbmdcbiAqIC0gKioxNS1NaW51dGUgVGltZW91dCoqOiBFeHRlbmRlZCB0aW1lb3V0IGZvciBsb25nIGNvbnZlcnNhdGlvbnNcbiAqIC0gKipTZXNzaW9uIE1hbmFnZW1lbnQqKjogUzMtYmFzZWQgY29udmVyc2F0aW9uIHBlcnNpc3RlbmNlXG4gKiAtICoqQ29udGV4dCBXaW5kb3dpbmcqKjogU2xpZGluZyB3aW5kb3cgY29udmVyc2F0aW9uIGhpc3RvcnlcbiAqIC0gKipDb2duaXRvIEF1dGgqKjogTmF0aXZlIEpXVCB2YWxpZGF0aW9uIG9uIFJFU1QgQVBJXG4gKiAtICoqU3RyYXRlZ3kgSW50ZXJmYWNlcyoqOiBQbHVnZ2FibGUgYWRhcHRlcnMgZm9yIGFsbCBjb21wb25lbnRzXG4gKiAtICoqT2JzZXJ2YWJpbGl0eSoqOiBMYW1iZGEgUG93ZXJ0b29scyBpbnRlZ3JhdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3Qgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0NoYXRBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnTXlDaGF0Ym90JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7XG4gKiAgICAgYmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gKiAgICAgc3lzdGVtUHJvbXB0OiBzeXN0ZW1Qcm9tcHQsXG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3Mgb3V0cHV0c1xuICogYWdlbnQuYXBpRW5kcG9pbnQ7ICAgICAgIC8vIFJFU1QgQVBJIGVuZHBvaW50IFVSTFxuICogYWdlbnQuc2Vzc2lvbkJ1Y2tldDsgICAgIC8vIFMzIHNlc3Npb24gYnVja2V0XG4gKiBhZ2VudC5hdXRoZW50aWNhdG9yOyAgICAgLy8gQ29nbml0byBhdXRoZW50aWNhdG9yIChmb3IgVXNlciBQb29sIGluZm8pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyYWN0aXZlQWdlbnQgZXh0ZW5kcyBCYXNlQWdlbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRGdW5jdGlvbj86IElGdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uU3RvcmU/OiBJU2Vzc2lvblN0b3JlO1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dFN0cmF0ZWd5PzogSUNvbnRleHRTdHJhdGVneTtcbiAgcHVibGljIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcbiAgcHVibGljIHJlYWRvbmx5IGFwaUVuZHBvaW50OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcbiAgcHVibGljIHJlYWRvbmx5IGNmblJ1bnRpbWU/OiBDZm5SdW50aW1lO1xuICAvKipcbiAgICogVGhlIHNlc3Npb24gaW5kZXggZm9yIGZhc3QgdXNlciB0byBzZXNzaW9uIGxvb2t1cHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbkluZGV4PzogSVNlc3Npb25JbmRleDtcbiAgLyoqXG4gICAqIFRoZSBSRVNUIEFQSSBHYXRld2F5IChvbmx5IGF2YWlsYWJsZSB3aGVuIHVzaW5nIExhbWJkYUhvc3RpbmdBZGFwdGVyIHdpdGggU3RyZWFtaW5nSHR0cEFkYXB0ZXIpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGk/OiBSZXN0QXBpO1xuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29scyBhdXRob3JpemVyIChvbmx5IGF2YWlsYWJsZSB3aGVuIHVzaW5nIExhbWJkYUhvc3RpbmdBZGFwdGVyIHdpdGggQ29nbml0b0F1dGhlbnRpY2F0b3IpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvZ25pdG9BdXRob3JpemVyPzogQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEludGVyYWN0aXZlQWdlbnRQcm9wcykge1xuICAgIC8vIERldGVybWluZSBob3N0aW5nIGFkYXB0ZXIgQkVGT1JFIHN1cGVyKCkgc28gd2UgY2FuIHBhc3MgaXRzIHRydXN0IHByaW5jaXBhbFxuICAgIGNvbnN0IGhvc3RpbmdBZGFwdGVyID0gcHJvcHMuaG9zdGluZ0FkYXB0ZXIgfHwgbmV3IExhbWJkYUhvc3RpbmdBZGFwdGVyKHtcbiAgICAgIGNvbW11bmljYXRpb25BZGFwdGVyOiBwcm9wcy5jb21tdW5pY2F0aW9uQWRhcHRlcixcbiAgICAgIGF1dGhlbnRpY2F0b3I6IHByb3BzLmF1dGhlbnRpY2F0b3IsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogcHJvcHMucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICB9KTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwgeyAuLi5wcm9wcywgc2VydmljZVByaW5jaXBhbDogaG9zdGluZ0FkYXB0ZXIuc2VydmljZVByaW5jaXBhbCB9KTtcblxuICAgIC8vIFZhbGlkYXRlIHByb3BzXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcblxuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja01vZGVsKTtcbiAgICBjb25zdCBtZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5tZXRyaWNOYW1lc3BhY2UgfHwgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcuREVGQVVMVF9NRVRSSUNfTkFNRVNQQUNFO1xuICAgIGNvbnN0IG1ldHJpY1NlcnZpY2VOYW1lID0gcHJvcHMubWV0cmljU2VydmljZU5hbWUgfHwgRGVmYXVsdEFnZW50Q29uZmlnLkRFRkFVTFRfT0JTRVJWQUJJTElUWV9NRVRSSUNfU1ZDX05BTUU7XG5cbiAgICAvLyBJbml0aWFsaXplIHNlc3Npb24gc3RvcmUgKFMzIGJ1Y2tldCBmb3IgU3RyYW5kcy1uYXRpdmUgUzNTZXNzaW9uTWFuYWdlcilcbiAgICBpZiAocHJvcHMuc2Vzc2lvblN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gcHJvcHMuc2Vzc2lvblN0b3JlO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuc2Vzc2lvblN0b3JlID09PSB1bmRlZmluZWQgJiYgcHJvcHMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gICAgICAgIGJ1Y2tldDogcHJvcHMuc2Vzc2lvbkJ1Y2tldCxcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBjcmVhdGUgUzNTZXNzaW9uTWFuYWdlciAoYnVja2V0IHVzZWQgYnkgU3RyYW5kcy1uYXRpdmUgc2Vzc2lvbiBtYW5hZ2VyKVxuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXNzaW9uQnVja2V0ID0gdGhpcy5zZXNzaW9uU3RvcmU/LnNlc3Npb25CdWNrZXQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHNlc3Npb24gaW5kZXggKER5bmFtb0RCIHRhYmxlIGZvciB1c2Vy4oaSc2Vzc2lvbiBsb29rdXBzKVxuICAgIGlmIChwcm9wcy5zZXNzaW9uSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBwcm9wcy5zZXNzaW9uSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IGNyZWF0ZSBEeW5hbW9EQlNlc3Npb25JbmRleFxuICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBuZXcgRHluYW1vREJTZXNzaW9uSW5kZXgodGhpcywgJ1Nlc3Npb25JbmRleCcsIHtcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbnRleHQgc3RyYXRlZ3kgaXMgZGVwcmVjYXRlZCDigJQgU3RyYW5kcy1uYXRpdmUgY29udmVyc2F0aW9uIG1hbmFnZXIgaGFuZGxlcyB0aGlzLlxuICAgIC8vIEtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGRvIG5vdCB1c2UgZW52IHZhcnMuXG4gICAgaWYgKHByb3BzLmNvbnRleHRTdHJhdGVneSkge1xuICAgICAgdGhpcy5jb250ZXh0U3RyYXRlZ3kgPSBwcm9wcy5jb250ZXh0U3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dFN0cmF0ZWd5ID0gbmV3IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyKHtcbiAgICAgICAgd2luZG93U2l6ZTogcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGJhc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTU9ERUxfSUQ6IG1vZGVsSWQsXG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0JVQ0tFVF9OQU1FOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIFNZU1RFTV9QUk9NUFRfUzNfS0VZOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzT2JqZWN0S2V5LFxuICAgICAgVE9PTFNfQ09ORklHOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICBtZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIG1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAnREVCVUcnLFxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNlc3Npb24gYnVja2V0IGVudiB2YXIgaWYgc2Vzc2lvbiBzdG9yZSBleGlzdHNcbiAgICBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICBlbnYuU0VTU0lPTl9CVUNLRVQgPSB0aGlzLnNlc3Npb25CdWNrZXQuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Vzc2lvbiBpbmRleCBlbnYgdmFycyBpZiBzZXNzaW9uIGluZGV4IGV4aXN0c1xuICAgIGlmICh0aGlzLnNlc3Npb25JbmRleCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihlbnYsIHRoaXMuc2Vzc2lvbkluZGV4LmVudmlyb25tZW50VmFyaWFibGVzKCkpO1xuICAgIH1cblxuICAgIC8vIEFkZCBrbm93bGVkZ2UgYmFzZSBjb25maWd1cmF0aW9uIGlmIEtCcyBhcmUgY29uZmlndXJlZFxuICAgIGlmICh0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVudi5LTk9XTEVER0VfQkFTRVNfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncyk7XG4gICAgICBlbnYuS05PV0xFREdFX0JBU0VfU1lTVEVNX1BST01QVF9BRERJVElPTiA9IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uKHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpO1xuICAgIH1cblxuICAgIC8vIERlcGxveSB2aWEgaG9zdGluZyBhZGFwdGVyXG4gICAgY29uc3QgaG9zdGluZ1Jlc3VsdCA9IGhvc3RpbmdBZGFwdGVyLmRlcGxveSh7XG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGFnZW50TmFtZTogcHJvcHMuYWdlbnROYW1lLFxuICAgICAgYWdlbnRSb2xlOiB0aGlzLmFnZW50Um9sZSxcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBlbmNyeXB0aW9uS2V5OiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICBuZXR3b3JrOiBwcm9wcy5uZXR3b3JrLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IHByb3BzLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICBsYW1iZGFMYXllcnM6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5sYW1iZGFMYXllcnMsXG4gICAgICBrbm93bGVkZ2VCYXNlTGF5ZXJzOiB0aGlzLmtub3dsZWRnZUJhc2VMYXllcnMsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgdG9vbHNDb25maWc6IEpTT04uc3RyaW5naWZ5KHRoaXMuYWdlbnRUb29sc0xvY2F0aW9uRGVmaW5pdGlvbnMpLFxuICAgICAgc3lzdGVtUHJvbXB0QnVja2V0OiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIHN5c3RlbVByb21wdEtleTogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM09iamVjdEtleSxcbiAgICAgIGtub3dsZWRnZUJhc2VDb25maWdzOiB0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzLmxlbmd0aCA+IDAgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKSA6IHVuZGVmaW5lZCxcbiAgICAgIGtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbjogdGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwXG4gICAgICAgID8gZ2VuZXJhdGVLbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb24odGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncylcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcGlFbmRwb2ludCA9IGhvc3RpbmdSZXN1bHQuZW5kcG9pbnQ7XG4gICAgdGhpcy5hZ2VudEZ1bmN0aW9uID0gaG9zdGluZ1Jlc3VsdC5hZ2VudEZ1bmN0aW9uO1xuICAgIHRoaXMuY2ZuUnVudGltZSA9IGhvc3RpbmdSZXN1bHQuY2ZuUnVudGltZTtcblxuICAgIC8vIFNldCBhZGFwdGVyIGFuZCBhdXRoZW50aWNhdG9yIHJlZmVyZW5jZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoaG9zdGluZ0FkYXB0ZXIgaW5zdGFuY2VvZiBMYW1iZGFIb3N0aW5nQWRhcHRlcikge1xuICAgICAgdGhpcy5hZGFwdGVyID0gaG9zdGluZ0FkYXB0ZXIuY29tbXVuaWNhdGlvbkFkYXB0ZXI7XG4gICAgICB0aGlzLmF1dGhlbnRpY2F0b3IgPSBob3N0aW5nQWRhcHRlci5hdXRoZW50aWNhdG9yO1xuXG4gICAgICAvLyBFeHBvc2UgUkVTVCBBUEkgYW5kIENvZ25pdG8gYXV0aG9yaXplciBmcm9tIHRoZSBjb21tdW5pY2F0aW9uIGFkYXB0ZXJcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIgaW5zdGFuY2VvZiBTdHJlYW1pbmdIdHRwQWRhcHRlcikge1xuICAgICAgICB0aGlzLnJlc3RBcGkgPSB0aGlzLmFkYXB0ZXIucmVzdEFwaTtcbiAgICAgICAgdGhpcy5jb2duaXRvQXV0aG9yaXplciA9IHRoaXMuYWRhcHRlci5jb2duaXRvQXV0aG9yaXplcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcmFudCBzeXN0ZW0gcHJvbXB0IHJlYWQgYWNjZXNzXG4gICAgcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5ncmFudFJlYWQodGhpcy5hZ2VudFJvbGUpO1xuXG4gICAgLy8gR3JhbnQgc2Vzc2lvbiBzdG9yZSBhY2Nlc3NcbiAgICBpZiAodGhpcy5zZXNzaW9uU3RvcmUpIHtcbiAgICAgIGlmICh0aGlzLmFnZW50RnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmUuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudEZ1bmN0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICAgIC8vIEZvciBBZ2VudENvcmUgaG9zdGluZywgZ3JhbnQgdGhlIGFnZW50IHJvbGUgZGlyZWN0IFMzIGFjY2Vzc1xuICAgICAgICB0aGlzLnNlc3Npb25CdWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudFJvbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyYW50IHNlc3Npb24gaW5kZXggYWNjZXNzXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZGV4KSB7XG4gICAgICB0aGlzLnNlc3Npb25JbmRleC5ncmFudFJlYWRXcml0ZSh0aGlzLmFnZW50Um9sZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBJbnRlcmFjdGl2ZUFnZW50IHByb3BzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3BzKHByb3BzOiBJbnRlcmFjdGl2ZUFnZW50UHJvcHMpOiB2b2lkIHtcbiAgICBpZiAoIXByb3BzLmFnZW50TmFtZSB8fCBwcm9wcy5hZ2VudE5hbWUudHJpbSgpID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZ2VudE5hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lbW9yeVNpemUgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWVtb3J5U2l6ZSA8IDEyOCB8fCBwcm9wcy5tZW1vcnlTaXplID4gMTAyNDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lbW9yeVNpemUgbXVzdCBiZSBiZXR3ZWVuIDEyOCBhbmQgMTAyNDAgTUInKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHByb3BzLnRpbWVvdXQudG9TZWNvbmRzKCk7XG4gICAgICBpZiAodGltZW91dFNlY29uZHMgPCAxIHx8IHRpbWVvdXRTZWNvbmRzID4gOTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGltZW91dCBtdXN0IGJlIGJldHdlZW4gMSBzZWNvbmQgYW5kIDE1IG1pbnV0ZXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCAhPT0gdW5kZWZpbmVkICYmIChwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0IDwgMSB8fCBwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0ID4gMTAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZUhpc3RvcnlMaW1pdCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcpO1xuICAgIH1cbiAgfVxufVxuIl19
1371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0QywyQ0FBNkI7QUFDN0IsNkNBQXdGO0FBQ3hGLCtEQVNvQztBQUNwQywyRUFBa0Y7QUFDbEYseURBQXlIO0FBQ3pILDJEQUFzSDtBQUN0SCxpREFBcUY7QUFDckYsK0RBQThEO0FBQzlELGlEQUFrRztBQUVsRyx1REFBdUg7QUFDdkgsK0NBQTBGO0FBRTFGLDZDQUF5RDtBQUN6RCwrQ0FBMEU7QUFDMUUsaUVBQTREO0FBQzVELCtDQUFtRTtBQUNuRSxpRUFBMkU7QUFDM0Usd0NBQStDO0FBQy9DLHdEQUFxRDtBQXNFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFhLG9CQUFvQjs7SUFDL0I7O09BRUc7SUFDYSxPQUFPLENBQVc7SUFFbEM7O09BRUc7SUFDYSxpQkFBaUIsQ0FBOEI7SUFFL0Q7O09BRUc7SUFDYSxXQUFXLENBQVU7SUFFcEIsS0FBSyxDQUE0QjtJQUMxQyxLQUFLLENBQWE7SUFFMUIsWUFBWSxRQUFtQyxFQUFFO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxjQUF5QjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUZBQXVGLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDO1FBQ2pE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SUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuSCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7O0FBbE1ILDRDQW1NQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiwgRm4sIE5hbWVzLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25UeXBlLFxuICBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcixcbiAgQ29ycyxcbiAgRW5kcG9pbnRUeXBlLFxuICBHYXRld2F5UmVzcG9uc2UsXG4gIExhbWJkYUludGVncmF0aW9uLFxuICBSZXNwb25zZVR5cGUsXG4gIFJlc3RBcGksXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCB7IENmblJ1bnRpbWUsIENmblJ1bnRpbWVFbmRwb2ludCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCB7IFVzZXJQb29sLCBVc2VyUG9vbENsaWVudCwgTWZhLCBBY2NvdW50UmVjb3ZlcnksIFVzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2duaXRvJztcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmdNb2RlLCBJVGFibGUsIFN0cmVhbVZpZXdUeXBlLCBUYWJsZSwgVGFibGVFbmNyeXB0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiJztcbmltcG9ydCB7IElTZWN1cml0eUdyb3VwLCBTZWN1cml0eUdyb3VwLCBTdWJuZXRTZWxlY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IERvY2tlckltYWdlQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBJR3JhbnRhYmxlLCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsLCBQb2xpY3lTdGF0ZW1lbnQsIEVmZmVjdCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgSUtleSwgS2V5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBJRnVuY3Rpb24sIEFyY2hpdGVjdHVyZSwgSUxheWVyVmVyc2lvbiwgTGF5ZXJWZXJzaW9uLCBGdW5jdGlvbiwgQ29kZSwgUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgSUJ1Y2tldCwgQnVja2V0LCBCdWNrZXRFbmNyeXB0aW9uLCBCbG9ja1B1YmxpY0FjY2VzcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJhc2VBZ2VudCwgQmFzZUFnZW50UHJvcHMgfSBmcm9tICcuL2Jhc2UtYWdlbnQnO1xuaW1wb3J0IHsgZ2VuZXJhdGVLbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb24gfSBmcm9tICcuL2JhdGNoLWFnZW50JztcbmltcG9ydCB7IERlZmF1bHRBZ2VudENvbmZpZyB9IGZyb20gJy4vZGVmYXVsdC1hZ2VudC1jb25maWcnO1xuaW1wb3J0IHsgTGFtYmRhSWFtVXRpbHMsIFBvd2VydG9vbHNDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvb2JzZXJ2YWJpbGl0eSc7XG5pbXBvcnQgeyBCZWRyb2NrTW9kZWxVdGlscyB9IGZyb20gJy4uL2JlZHJvY2snO1xuaW1wb3J0IHsgRGVmYXVsdFJ1bnRpbWVzIH0gZnJvbSAnLi4vY3VzdG9tLXJlc291cmNlJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuLi9mb3VuZGF0aW9uJztcblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHBsdWdnYWJsZSBjb21tdW5pY2F0aW9uIG1lY2hhbmlzbXMuXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIFN0cmVhbWluZ0h0dHBBZGFwdGVyIChBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbW11bmljYXRpb25BZGFwdGVyIHtcbiAgLyoqXG4gICAqIEF0dGFjaCB0aGUgYWRhcHRlciB0byBhIExhbWJkYSBmdW5jdGlvbiBhbmQgY3JlYXRlIGNvbW11bmljYXRpb24gaW5mcmFzdHJ1Y3R1cmUuXG4gICAqIFJldHVybnMgdGhlIHB1YmxpYyBlbmRwb2ludCBVUkwgZm9yIGNsaWVudCBjb25uZWN0aW9ucy5cbiAgICovXG4gIGF0dGFjaFRvRnVuY3Rpb24obGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgdGhlIExhbWJkYSBmdW5jdGlvbiBwZXJtaXNzaW9uIHRvIHNlbmQgcmVzcG9uc2VzIGJhY2sgdG8gY2xpZW50cy5cbiAgICovXG4gIGdyYW50SW52b2tlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkO1xufVxuXG4vKipcbiAqIFRocm90dGxlIHNldHRpbmdzIGZvciBSRVNUIEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJvdHRsZVNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFJhdGUgbGltaXQgKHJlcXVlc3RzIHBlciBzZWNvbmQpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF0ZUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCdXJzdCBsaW1pdCAobWF4aW11bSBjb25jdXJyZW50IHJlcXVlc3RzKS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1cnN0TGltaXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBTdHJlYW1pbmdIdHRwQWRhcHRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1pbmdIdHRwQWRhcHRlclByb3BzIHtcbiAgLyoqXG4gICAqIFJFU1QgQVBJIHN0YWdlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwcm9kJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaHJvdHRsZSBzZXR0aW5ncyBmb3IgUkVTVCBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIHRocm90dGxpbmdcbiAgICovXG4gIHJlYWRvbmx5IHRocm90dGxlPzogVGhyb3R0bGVTZXR0aW5ncztcblxuICAvKipcbiAgICogQXV0aGVudGljYXRvciBmb3Igc2VjdXJpbmcgQVBJIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgVXNlcyBhdXRoZW50aWNhdG9yIGZyb20gSW50ZXJhY3RpdmVBZ2VudFxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIC8qKlxuICAgKiBIVFRQIG1ldGhvZHMgdG8gYWxsb3cgaW4gQ09SUyBwcmVmbGlnaHQgcmVzcG9uc2VzLlxuICAgKiBVc2UgdGhpcyB0byBlbmFibGUgYWRkaXRpb25hbCBtZXRob2RzIChHRVQsIERFTEVURSwgUFVUKSBmb3IgY3VzdG9tIHJvdXRlc1xuICAgKiBhZGRlZCB0byB0aGUgUkVTVCBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnUE9TVCcsICdPUFRJT05TJ11cbiAgICovXG4gIHJlYWRvbmx5IGNvcnNBbGxvd01ldGhvZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTdHJlYW1pbmcgSFRUUCBhZGFwdGVyIGZvciByZWFsLXRpbWUgYWdlbnQgY29tbXVuaWNhdGlvbiB2aWEgU1NFLlxuICpcbiAqIFRoaXMgYWRhcHRlciBjcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nIGVuYWJsZWQsXG4gKiBhbGxvd2luZyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHN0cmVhbSBTU0UgKFNlcnZlci1TZW50IEV2ZW50cykgcmVzcG9uc2VzXG4gKiBiYWNrIHRvIGNsaWVudHMgYXMgdGhlIFN0cmFuZHMgQWdlbnQgZ2VuZXJhdGVzIHRva2Vucy5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgUE9TVCAvY2hhdCDihpIgQVBJIEdhdGV3YXkgUkVTVCBBUEkgKFNUUkVBTSBtb2RlKSDihpIgTGFtYmRhIChGYXN0QVBJICsgTFdBKSDihpIgQmVkcm9ja1xuICogQ2xpZW50IOKGkCBTU0Ugc3RyZWFtIOKGkCBBUEkgR2F0ZXdheSDihpAgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyDihpAgQWdlbnQgdG9rZW5zXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipSZXNwb25zZSBTdHJlYW1pbmcqKjogUHJvZ3Jlc3NpdmUgU1NFIGRlbGl2ZXJ5IHZpYSBBUEkgR2F0ZXdheSByZXNwb25zZSBzdHJlYW1pbmdcbiAqIC0gKioxNS1NaW51dGUgVGltZW91dCoqOiBFeHRlbmRlZCB0aW1lb3V0IGZvciBsb25nLXJ1bm5pbmcgYWdlbnQgY29udmVyc2F0aW9uc1xuICogLSAqKkNvZ25pdG8gQXV0aCoqOiBOYXRpdmUgQ09HTklUT19VU0VSX1BPT0xTIGF1dGhvcml6ZXIgb24gUkVTVCBBUElcbiAqIC0gKipDT1JTKio6IEJ1aWx0LWluIENPUlMgc3VwcG9ydCBmb3IgYnJvd3NlciBjbGllbnRzXG4gKiAtICoqVGhyb3R0bGluZyoqOiBDb25maWd1cmFibGUgcmF0ZSBhbmQgYnVyc3QgbGltaXRzXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBTdHJlYW1pbmdIdHRwQWRhcHRlciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoe1xuICogICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAqICAgdGhyb3R0bGU6IHsgcmF0ZUxpbWl0OiAxMDAsIGJ1cnN0TGltaXQ6IDIwMCB9XG4gKiB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgY29tbXVuaWNhdGlvbkFkYXB0ZXI6IGFkYXB0ZXJcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1pbmdIdHRwQWRhcHRlciBpbXBsZW1lbnRzIElDb21tdW5pY2F0aW9uQWRhcHRlciB7XG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgR2F0ZXdheS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0QXBpPzogUmVzdEFwaTtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29scyBhdXRob3JpemVyIChpZiBDb2duaXRvIGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvZ25pdG9BdXRob3JpemVyPzogQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBUEkgZW5kcG9pbnQgVVJMLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaUVuZHBvaW50Pzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHM7XG4gIHByaXZhdGUgc2NvcGU/OiBDb25zdHJ1Y3Q7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHMgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIGFkYXB0ZXIgdG8gYSBMYW1iZGEgZnVuY3Rpb24gYW5kIGNyZWF0ZSBSRVNUIEFQSSBpbmZyYXN0cnVjdHVyZS5cbiAgICogQ3JlYXRlcyBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIFBPU1QgL2NoYXQgZW5kcG9pbnQgYW5kIHJlc3BvbnNlIHN0cmVhbWluZy5cbiAgICovXG4gIGF0dGFjaFRvRnVuY3Rpb24obGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNjb3BlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0cmVhbWluZ0h0dHBBZGFwdGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHNjb3BlIGJlZm9yZSBjYWxsaW5nIGF0dGFjaFRvRnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFnZU5hbWUgPSB0aGlzLnByb3BzLnN0YWdlTmFtZSB8fCAncHJvZCc7XG4gICAgY29uc3QgY29yc0FsbG93TWV0aG9kcyA9IHRoaXMucHJvcHMuY29yc0FsbG93TWV0aG9kcyB8fCBbJ1BPU1QnLCAnT1BUSU9OUyddO1xuICAgIGNvbnN0IGNvcnNBbGxvd01ldGhvZHNTdHJpbmcgPSBjb3JzQWxsb3dNZXRob2RzLmpvaW4oJywnKTtcblxuICAgIC8vIENyZWF0ZSBSRVNUIEFQSSB3aXRoIENPUlNcbiAgICAvLyBVc2UgUkVHSU9OQUwgZW5kcG9pbnQgZm9yIDUtbWludXRlIGlkbGUgdGltZW91dCAodnMgMzBzIGZvciBFREdFKS5cbiAgICAvLyBUaGlzIGFsbG93cyByZXNwb25zZSBzdHJlYW1pbmcgdG8gZXhjZWVkIEFQSSBHYXRld2F5J3MgMjlzIGxpbWl0LlxuICAgIGNvbnN0IHJlc3RBcGkgPSBuZXcgUmVzdEFwaSh0aGlzLnNjb3BlLCAnQ2hhdEFwaScsIHtcbiAgICAgIHJlc3RBcGlOYW1lOiBgJHtTdGFjay5vZih0aGlzLnNjb3BlKS5zdGFja05hbWV9LUNoYXRBcGlgLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmFjdGl2ZSBBZ2VudCBDaGF0IEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZycsXG4gICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgIGRlcGxveU9wdGlvbnM6IHtcbiAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICB0aHJvdHRsaW5nUmF0ZUxpbWl0OiB0aGlzLnByb3BzLnRocm90dGxlPy5yYXRlTGltaXQsXG4gICAgICAgIHRocm90dGxpbmdCdXJzdExpbWl0OiB0aGlzLnByb3BzLnRocm90dGxlPy5idXJzdExpbWl0LFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRDb3JzUHJlZmxpZ2h0T3B0aW9uczoge1xuICAgICAgICBhbGxvd09yaWdpbnM6IENvcnMuQUxMX09SSUdJTlMsXG4gICAgICAgIGFsbG93TWV0aG9kczogY29yc0FsbG93TWV0aG9kcyxcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBbJ0NvbnRlbnQtVHlwZScsICdBdXRob3JpemF0aW9uJ10sXG4gICAgICB9LFxuICAgIH0pO1xuICAgICh0aGlzIGFzIGFueSkucmVzdEFwaSA9IHJlc3RBcGk7XG5cbiAgICAvLyBBZGQgQ09SUyBoZWFkZXJzIHRvIEFQSSBHYXRld2F5IGVycm9yIHJlc3BvbnNlcyAoNFhYLzVYWCkuXG4gICAgLy8gV2l0aG91dCB0aGVzZSwgdGhlIENvZ25pdG8gYXV0aG9yaXplcidzIDQwMSByZXNwb25zZSB3b24ndCBpbmNsdWRlXG4gICAgLy8gQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luIGFuZCB0aGUgYnJvd3NlciB3aWxsIGJsb2NrIGl0IGFzIGEgQ09SUyBlcnJvci5cbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHRoaXMuc2NvcGUsICdHYXRld2F5RGVmYXVsdDRYWCcsIHtcbiAgICAgIHJlc3RBcGksXG4gICAgICB0eXBlOiBSZXNwb25zZVR5cGUuREVGQVVMVF80WFgsXG4gICAgICByZXNwb25zZUhlYWRlcnM6IHtcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6IFwiJyonXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogXCInQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24nXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogYCcke2NvcnNBbGxvd01ldGhvZHNTdHJpbmd9J2AsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIG5ldyBHYXRld2F5UmVzcG9uc2UodGhpcy5zY29wZSwgJ0dhdGV3YXlEZWZhdWx0NVhYJywge1xuICAgICAgcmVzdEFwaSxcbiAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5ERUZBVUxUXzVYWCxcbiAgICAgIHJlc3BvbnNlSGVhZGVyczoge1xuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogXCInKidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiBcIidDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiBgJyR7Y29yc0FsbG93TWV0aG9kc1N0cmluZ30nYCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgTGFtYmRhIGludGVncmF0aW9uXG4gICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgTGFtYmRhSW50ZWdyYXRpb24obGFtYmRhRnVuY3Rpb24sIHtcbiAgICAgIHByb3h5OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIC9jaGF0IHJlc291cmNlIHdpdGggUE9TVCBtZXRob2RcbiAgICBjb25zdCBjaGF0UmVzb3VyY2UgPSByZXN0QXBpLnJvb3QuYWRkUmVzb3VyY2UoJ2NoYXQnKTtcblxuICAgIC8vIERldGVybWluZSBhdXRob3JpemF0aW9uIHR5cGVcbiAgICBsZXQgYXV0aG9yaXphdGlvblR5cGUgPSBBdXRob3JpemF0aW9uVHlwZS5OT05FO1xuICAgIGxldCBhdXRob3JpemVyOiBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3IgaW5zdGFuY2VvZiBDb2duaXRvQXV0aGVudGljYXRvciAmJiB0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3IudXNlclBvb2wpIHtcbiAgICAgIGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXIodGhpcy5zY29wZSwgJ0NvZ25pdG9BdXRob3JpemVyJywge1xuICAgICAgICBjb2duaXRvVXNlclBvb2xzOiBbdGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yLnVzZXJQb29sXSxcbiAgICAgICAgYXV0aG9yaXplck5hbWU6ICdDb2duaXRvQXV0aG9yaXplcicsXG4gICAgICB9KTtcbiAgICAgICh0aGlzIGFzIGFueSkuY29nbml0b0F1dGhvcml6ZXIgPSBhdXRob3JpemVyO1xuICAgICAgYXV0aG9yaXphdGlvblR5cGUgPSBBdXRob3JpemF0aW9uVHlwZS5DT0dOSVRPO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RNZXRob2QgPSBjaGF0UmVzb3VyY2UuYWRkTWV0aG9kKCdQT1NUJywgbGFtYmRhSW50ZWdyYXRpb24sIHtcbiAgICAgIGF1dGhvcml6YXRpb25UeXBlLFxuICAgICAgYXV0aG9yaXplcixcbiAgICB9KTtcblxuICAgIC8vIENvbmZpZ3VyZSByZXNwb25zZSBzdHJlYW1pbmcgdmlhIENmbk1ldGhvZCBlc2NhcGUgaGF0Y2hcbiAgICAvLyBBUEkgR2F0ZXdheSBSRVNUIEFQSSByZXNwb25zZSBzdHJlYW1pbmcgcmVxdWlyZXM6XG4gICAgLy8gMS4gcmVzcG9uc2VUcmFuc2Zlck1vZGU6IFNUUkVBTSBvbiB0aGUgaW50ZWdyYXRpb25cbiAgICAvLyAyLiBJbnRlZ3JhdGlvbiBVUkkgcG9pbnRpbmcgdG8gL3Jlc3BvbnNlLXN0cmVhbWluZy1pbnZvY2F0aW9uc1xuICAgIGNvbnN0IGNmbk1ldGhvZCA9IHBvc3RNZXRob2Qubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55O1xuICAgIGlmIChjZm5NZXRob2QpIHtcbiAgICAgIGNmbk1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdJbnRlZ3JhdGlvbi5SZXNwb25zZVRyYW5zZmVyTW9kZScsICdTVFJFQU0nKTtcbiAgICAgIC8vIE92ZXJyaWRlIHRoZSBpbnRlZ3JhdGlvbiBVUkkgdG8gdXNlIHJlc3BvbnNlLXN0cmVhbWluZy1pbnZvY2F0aW9ucyBwYXRoXG4gICAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzLnNjb3BlKS5yZWdpb247XG4gICAgICBjZm5NZXRob2QuYWRkUHJvcGVydHlPdmVycmlkZShcbiAgICAgICAgJ0ludGVncmF0aW9uLlVyaScsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OmxhbWJkYTpwYXRoLzIwMjEtMTEtMTUvZnVuY3Rpb25zLyR7bGFtYmRhRnVuY3Rpb24uZnVuY3Rpb25Bcm59L3Jlc3BvbnNlLXN0cmVhbWluZy1pbnZvY2F0aW9uc2AsXG4gICAgICApO1xuICAgICAgLy8gU2V0IGludGVncmF0aW9uIHRpbWVvdXQgdG8gMTUgbWludXRlcyAoOTAwMDAwIG1zKVxuICAgICAgY2ZuTWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ0ludGVncmF0aW9uLlRpbWVvdXRJbk1pbGxpcycsIDkwMDAwMCk7XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgQVBJIEdhdGV3YXkgcGVybWlzc2lvbiB0byBpbnZva2UgTGFtYmRhIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nXG4gICAgbGFtYmRhRnVuY3Rpb24uYWRkUGVybWlzc2lvbignQXBpR2F0ZXdheUludm9rZScsIHtcbiAgICAgIHByaW5jaXBhbDogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgc291cmNlQXJuOiByZXN0QXBpLmFybkZvckV4ZWN1dGVBcGkoKSxcbiAgICB9KTtcblxuICAgIC8vIEFsc28gZ3JhbnQgSW52b2tlV2l0aFJlc3BvbnNlU3RyZWFtIHBlcm1pc3Npb25cbiAgICBsYW1iZGFGdW5jdGlvbi5hZGRQZXJtaXNzaW9uKCdBcGlHYXRld2F5U3RyZWFtSW52b2tlJywge1xuICAgICAgcHJpbmNpcGFsOiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyksXG4gICAgICBzb3VyY2VBcm46IHJlc3RBcGkuYXJuRm9yRXhlY3V0ZUFwaSgnUE9TVCcsICcvY2hhdCcpLFxuICAgICAgYWN0aW9uOiAnbGFtYmRhOkludm9rZUZ1bmN0aW9uVXJsJyxcbiAgICB9KTtcblxuICAgIC8vIENvbnN0cnVjdCBlbmRwb2ludCBVUkxcbiAgICBjb25zdCB1cmwgPSByZXN0QXBpLnVybEZvclBhdGgoJy9jaGF0Jyk7XG4gICAgKHRoaXMgYXMgYW55KS5hcGlFbmRwb2ludCA9IHVybDtcblxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIExhbWJkYSBmdW5jdGlvbiBwZXJtaXNzaW9ucyBmb3IgQVBJIEdhdGV3YXkgaW50ZWdyYXRpb24uXG4gICAqIEZvciBSRVNUIEFQSSBzdHJlYW1pbmcsIG5vIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIG5lZWRlZCBiZXlvbmQgdGhlIGludm9rZSBwZXJtaXNzaW9uLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UoX2xhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBSRVNUIEFQSSBzdHJlYW1pbmcgZG9lc24ndCBuZWVkIHBvc3RfdG9fY29ubmVjdGlvbiBsaWtlIFdlYlNvY2tldC5cbiAgICAvLyBUaGUgTGFtYmRhIGludm9rZSBwZXJtaXNzaW9uIGlzIGFscmVhZHkgZ3JhbnRlZCBpbiBhdHRhY2hUb0Z1bmN0aW9uLlxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGFkYXB0ZXIgd2l0aCBhIENESyBzY29wZS5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGF0dGFjaFRvRnVuY3Rpb24gb3IgZ3JhbnRJbnZva2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zZXRTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICB9XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBzZXNzaW9uIHBlcnNpc3RlbmNlLlxuICpcbiAqIFNlc3Npb24gc3RvcmVzIG1hbmFnZSBjb252ZXJzYXRpb24gc3RhdGUgcGVyc2lzdGVuY2UgYWNyb3NzIEhUVFAgcmVxdWVzdHMuXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAoUzNTZXNzaW9uTWFuYWdlcikgdXNlcyBTMyBmb3IgZHVyYWJsZSBzdG9yYWdlLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAgZnJvbSBgc3RyYW5kcy5zZXNzaW9uLnMzX3Nlc3Npb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlcyBTdHJhbmRzLW5hdGl2ZSBzZXNzaW9uIG1hbmFnZW1lbnQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvblN0b3JlIHtcbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgdXNlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIChpZiBTMy1iYXNlZCkuXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUZ1bmN0aW9uIC0gVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgc2Vzc2lvbiBzdG9yZVxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBTM1Nlc3Npb25NYW5hZ2VyLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAgZnJvbSBgc3RyYW5kcy5zZXNzaW9uLnMzX3Nlc3Npb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM1Nlc3Npb25NYW5hZ2VyUHJvcHMge1xuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBidWNrZXQgd2l0aCBLTVMgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9ucy5cbiAgICogU2Vzc2lvbnMgb2xkZXIgdGhhbiB0aGlzIGR1cmF0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5ob3VycygyNClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5IGZvciB0aGUgc2Vzc2lvbiBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBLTVMga2V5IHdpdGggcm90YXRpb24gZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IElLZXk7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciB0aGUgc2Vzc2lvbiBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogUzMtYmFzZWQgc2Vzc2lvbiBtYW5hZ2VyIGZvciBwZXJzaXN0aW5nIGNvbnZlcnNhdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2VzIFMzIGZvciBkdXJhYmxlIHN0b3JhZ2Ugb2Ygc2Vzc2lvbiBkYXRhIHdpdGggYXV0b21hdGljIGV4cGlyYXRpb25cbiAqIHZpYSBsaWZlY3ljbGUgcG9saWNpZXMuIEVhY2ggSFRUUCByZXF1ZXN0IGxvYWRzL3NhdmVzIHNlc3Npb24gc3RhdGUsXG4gKiBlbmFibGluZyBtdWx0aS10dXJuIGNvbnZlcnNhdGlvbnMgb3ZlciBzdGF0ZWxlc3MgSFRUUC5cbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipEdXJhYmxlIFN0b3JhZ2UqKjogU2Vzc2lvbnMgcGVyc2lzdGVkIHRvIFMzIHN1cnZpdmUgTGFtYmRhIHJlc3RhcnRzXG4gKiAtICoqQXV0b21hdGljIEV4cGlyYXRpb24qKjogTGlmZWN5Y2xlIHBvbGljeSByZW1vdmVzIG9sZCBzZXNzaW9uc1xuICogLSAqKkVuY3J5cHRpb24qKjogS01TIGVuY3J5cHRpb24gYXQgcmVzdFxuICogLSAqKkNvc3QgT3B0aW1pemF0aW9uKio6IFMzIFN0YW5kYXJkIHN0b3JhZ2Ugd2l0aCBsaWZlY3ljbGUgbWFuYWdlbWVudFxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFMzU2Vzc2lvbk1hbmFnZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKiBpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IHNlc3Npb25NYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICogICBzZXNzaW9uVFRMOiBEdXJhdGlvbi5ob3Vycyg0OClcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBzZXNzaW9uU3RvcmU6IHNlc3Npb25NYW5hZ2VyXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAgZnJvbSBgc3RyYW5kcy5zZXNzaW9uLnMzX3Nlc3Npb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlcyBTdHJhbmRzLW5hdGl2ZSBzZXNzaW9uIG1hbmFnZW1lbnQgYXV0b21hdGljYWxseS5cbiAqIEFuIFMzIGJ1Y2tldCBpcyBzdGlsbCBjcmVhdGVkIGZvciB0aGUgU3RyYW5kcyBzZXNzaW9uIG1hbmFnZXI7IHRoaXMgQ0RLIGNsYXNzXG4gKiBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGNvbmZpZ3VyZSBzZXNzaW9uIHBlcnNpc3RlbmNlLlxuICovXG5leHBvcnQgY2xhc3MgUzNTZXNzaW9uTWFuYWdlciBpbXBsZW1lbnRzIElTZXNzaW9uU3RvcmUge1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB1c2VkIGZvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vzc2lvbiBUVEwgZHVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblRUTDogRHVyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzU2Vzc2lvbk1hbmFnZXJQcm9wcyA9IHt9KSB7XG4gICAgY29uc3QgcmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICAgIGNvbnN0IHNlc3Npb25UVEwgPSBwcm9wcy5zZXNzaW9uVFRMIHx8IER1cmF0aW9uLmhvdXJzKDI0KTtcblxuICAgIC8vIFVzZSBwcm92aWRlZCBidWNrZXQgb3IgY3JlYXRlIG5ldyBvbmVcbiAgICB0aGlzLmJ1Y2tldCA9IHByb3BzLmJ1Y2tldCB8fCBuZXcgQnVja2V0KHNjb3BlLCBgJHtpZH1CdWNrZXRgLCB7XG4gICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICByZW1vdmFsUG9saWN5OiByZW1vdmFsUG9saWN5LFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHJlbW92YWxQb2xpY3kgPT09IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0RlbGV0ZU9sZFNlc3Npb25zJyxcbiAgICAgICAgICBleHBpcmF0aW9uOiBzZXNzaW9uVFRMLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIHZlcnNpb25lZDogZmFsc2UsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXNzaW9uVFRMID0gc2Vzc2lvblRUTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZSAoSVNlc3Npb25TdG9yZSBpbnRlcmZhY2UpLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXNzaW9uQnVja2V0KCk6IElCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGxhbWJkYUZ1bmN0aW9uKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgY29udmVyc2F0aW9uIGhpc3RvcnkgbWFuYWdlbWVudC5cbiAqXG4gKiBDb250ZXh0IHN0cmF0ZWdpZXMgY29udHJvbCBob3cgY29udmVyc2F0aW9uIGhpc3RvcnkgaXMgbWFpbnRhaW5lZCBhbmQgcHJvdmlkZWRcbiAqIHRvIHRoZSBhZ2VudC4gRGlmZmVyZW50IHN0cmF0ZWdpZXMgZW5hYmxlIGRpZmZlcmVudCBjb252ZXJzYXRpb24gcGF0dGVybnMuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgZnJvbVxuICogYHN0cmFuZHMuYWdlbnQuY29udmVyc2F0aW9uX21hbmFnZXJgIGluc3RlYWQuIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlc1xuICogU3RyYW5kcy1uYXRpdmUgY29udmVyc2F0aW9uIG1hbmFnZW1lbnQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gY29uZmlndXJlIHRoZSBjb250ZXh0IG1hbmFnZXJcbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBmcm9tXG4gKiBgc3RyYW5kcy5hZ2VudC5jb252ZXJzYXRpb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlclByb3BzIHtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXAgaW4gY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwIG1lc3NhZ2VzXG4gICAqL1xuICByZWFkb25seSB3aW5kb3dTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNsaWRpbmcgd2luZG93IGNvbnZlcnNhdGlvbiBtYW5hZ2VyIGZvciBtYWludGFpbmluZyByZWNlbnQgY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gKlxuICogS2VlcHMgYSBmaXhlZC1zaXplIHdpbmRvdyBvZiByZWNlbnQgbWVzc2FnZXMsIGF1dG9tYXRpY2FsbHkgZGlzY2FyZGluZyBvbGRlclxuICogbWVzc2FnZXMgYXMgbmV3IG9uZXMgYXJyaXZlLiBQcm92aWRlcyBjb25zaXN0ZW50IGNvbnRleHQgc2l6ZSBmb3IgdGhlIGFnZW50LlxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3QgY29udGV4dE1hbmFnZXIgPSBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoeyB3aW5kb3dTaXplOiAzMCB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgY29udGV4dFN0cmF0ZWd5OiBjb250ZXh0TWFuYWdlclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBmcm9tXG4gKiBgc3RyYW5kcy5hZ2VudC5jb252ZXJzYXRpb25fbWFuYWdlcmAgaW5zdGVhZC4gVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyBoYW5kbGVzXG4gKiBjb252ZXJzYXRpb24gd2luZG93aW5nIG5hdGl2ZWx5LlxuICovXG5leHBvcnQgY2xhc3MgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29udGV4dFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIFRoZSB3aW5kb3cgc2l6ZSAobnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdpbmRvd1NpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJQcm9wcyA9IHt9KSB7XG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IHByb3BzLndpbmRvd1NpemUgIT09IHVuZGVmaW5lZCA/IHByb3BzLndpbmRvd1NpemUgOiAyMDtcblxuICAgIGlmICh3aW5kb3dTaXplIDwgMSB8fCB3aW5kb3dTaXplID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3aW5kb3dTaXplIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAwJyk7XG4gICAgfVxuXG4gICAgdGhpcy53aW5kb3dTaXplID0gd2luZG93U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBDT05URVhUX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgIENPTlRFWFRfU1RSQVRFR1k6ICdTbGlkaW5nV2luZG93JyxcbiAgICAgIENPTlRFWFRfV0lORE9XX1NJWkU6IHRoaXMud2luZG93U2l6ZS50b1N0cmluZygpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBOdWxsIGNvbnZlcnNhdGlvbiBtYW5hZ2VyIGZvciBzdGF0ZWxlc3MgaW50ZXJhY3Rpb25zLlxuICpcbiAqIERpc2FibGVzIGNvbnZlcnNhdGlvbiBoaXN0b3J5LCB0cmVhdGluZyBlYWNoIG1lc3NhZ2UgYXMgaW5kZXBlbmRlbnQuXG4gKiBVc2VmdWwgZm9yIHN0YXRlbGVzcyB1c2UgY2FzZXMgd2hlcmUgY29udGV4dCBpcyBub3QgbmVlZGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlcyBTdHJhbmRzLW5hdGl2ZSBjb252ZXJzYXRpb24gbWFuYWdlbWVudC5cbiAqIFRvIGRpc2FibGUgY29udmVyc2F0aW9uIGhpc3RvcnksIG9taXQgdGhlIHNlc3Npb24gYnVja2V0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOdWxsQ29udmVyc2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ09OVEVYVF9FTkFCTEVEOiAnZmFsc2UnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ051bGwnLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMuXG4gKlxuICogQXV0aGVudGljYXRvcnMgY29udHJvbCBob3cgQVBJIGVuZHBvaW50cyBhcmUgc2VjdXJlZC5cbiAqIERpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogR3JhbnQgYXV0aGVudGljYXRpb24gcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQ29nbml0b0F1dGhlbnRpY2F0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nbml0b0F1dGhlbnRpY2F0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBDb2duaXRvIFVzZXIgUG9vbCBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBVc2VyIFBvb2wgd2l0aCBzZWN1cmUgZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQb29sPzogVXNlclBvb2w7XG5cbiAgLyoqXG4gICAqIENvZ25pdG8gVXNlciBQb29sIENsaWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGNsaWVudCB3aXRoIGFwcHJvcHJpYXRlIGF1dGggZmxvd3NcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQb29sQ2xpZW50PzogVXNlclBvb2xDbGllbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciBDb2duaXRvIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBDb2duaXRvLWJhc2VkIGF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIFJFU1QgQVBJIGVuZHBvaW50cy5cbiAqXG4gKiBDcmVhdGVzIGEgQ29nbml0byBVc2VyIFBvb2wgYW5kIGludGVncmF0ZXMgd2l0aCBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICogdXNpbmcgdGhlIG5hdGl2ZSBDT0dOSVRPX1VTRVJfUE9PTFMgYXV0aG9yaXplciB0eXBlLiBDbGllbnRzIHNlbmRcbiAqIEpXVCB0b2tlbnMgaW4gdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKk5hdGl2ZSBKV1QgVmFsaWRhdGlvbioqOiBBUEkgR2F0ZXdheSB2YWxpZGF0ZXMgdG9rZW5zIHdpdGhvdXQgY3VzdG9tIExhbWJkYVxuICogLSAqKlVzZXIgTWFuYWdlbWVudCoqOiBCdWlsdC1pbiB1c2VyIHJlZ2lzdHJhdGlvbiBhbmQgbWFuYWdlbWVudFxuICogLSAqKlBhc3N3b3JkIFBvbGljaWVzKio6IEVuZm9yY2VzIHN0cm9uZyBwYXNzd29yZCByZXF1aXJlbWVudHNcbiAqIC0gKipBY2NvdW50IFJlY292ZXJ5Kio6IEVtYWlsLWJhc2VkIGFjY291bnQgcmVjb3ZlcnlcbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgQ29nbml0b0F1dGhlbnRpY2F0b3IgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBhdXRoZW50aWNhdG9yID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKHtcbiAqICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBhdXRoZW50aWNhdG9yXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29nbml0b0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2wuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2w/OiBVc2VyUG9vbDtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29sIENsaWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbENsaWVudD86IFVzZXJQb29sQ2xpZW50O1xuXG4gIHByaXZhdGUgc2NvcGU/OiBDb25zdHJ1Y3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ29nbml0b0F1dGhlbnRpY2F0b3JQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy51c2VyUG9vbCA9IHByb3BzLnVzZXJQb29sO1xuICAgIHRoaXMudXNlclBvb2xDbGllbnQgPSBwcm9wcy51c2VyUG9vbENsaWVudDtcbiAgICB0aGlzLnJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICogR3JhbnRzIHBlcm1pc3Npb25zIHRvIHZlcmlmeSBDb2duaXRvIHRva2Vucy5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2NvcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29nbml0b0F1dGhlbnRpY2F0b3IgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgc2NvcGUgYmVmb3JlIGNhbGxpbmcgZ3JhbnRBdXRoZW50aWNhdGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBQb29sIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgZ3JhbnRpbmcgcGVybWlzc2lvbnMuIENhbGwgX3NldFNjb3BlIGZpcnN0LicpO1xuICAgIH1cblxuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjb2duaXRvLWlkcDpHZXRVc2VyJyxcbiAgICAgICAgICAnY29nbml0by1pZHA6QWRtaW5HZXRVc2VyJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy51c2VyUG9vbC51c2VyUG9vbEFybl0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFVVEhfVFlQRTogJ0NvZ25pdG8nLFxuICAgICAgVVNFUl9QT09MX0lEOiB0aGlzLnVzZXJQb29sPy51c2VyUG9vbElkIHx8ICcnLFxuICAgICAgVVNFUl9QT09MX0NMSUVOVF9JRDogdGhpcy51c2VyUG9vbENsaWVudD8udXNlclBvb2xDbGllbnRJZCB8fCAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0b3Igd2l0aCBhIENESyBzY29wZS5cbiAgICogQ3JlYXRlcyBVc2VyIFBvb2wgYW5kIENsaWVudCBpZiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zZXRTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLnVzZXJQb29sID0gbmV3IFVzZXJQb29sKHNjb3BlLCAnVXNlclBvb2wnLCB7XG4gICAgICAgIHVzZXJQb29sTmFtZTogYCR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX0tVXNlclBvb2xgLFxuICAgICAgICBzZWxmU2lnblVwRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc2lnbkluQWxpYXNlczoge1xuICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgIHVzZXJuYW1lOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBhdXRvVmVyaWZ5OiB7XG4gICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHBhc3N3b3JkUG9saWN5OiB7XG4gICAgICAgICAgbWluTGVuZ3RoOiA4LFxuICAgICAgICAgIHJlcXVpcmVMb3dlcmNhc2U6IHRydWUsXG4gICAgICAgICAgcmVxdWlyZVVwcGVyY2FzZTogdHJ1ZSxcbiAgICAgICAgICByZXF1aXJlRGlnaXRzOiB0cnVlLFxuICAgICAgICAgIHJlcXVpcmVTeW1ib2xzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBtZmE6IE1mYS5PUFRJT05BTCxcbiAgICAgICAgbWZhU2Vjb25kRmFjdG9yOiB7XG4gICAgICAgICAgc21zOiB0cnVlLFxuICAgICAgICAgIG90cDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgYWNjb3VudFJlY292ZXJ5OiBBY2NvdW50UmVjb3ZlcnkuRU1BSUxfT05MWSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5yZW1vdmFsUG9saWN5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sQ2xpZW50ICYmIHRoaXMudXNlclBvb2wpIHtcbiAgICAgICh0aGlzIGFzIGFueSkudXNlclBvb2xDbGllbnQgPSBuZXcgVXNlclBvb2xDbGllbnQoc2NvcGUsICdVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgICAgdXNlclBvb2w6IHRoaXMudXNlclBvb2wsXG4gICAgICAgIHVzZXJQb29sQ2xpZW50TmFtZTogYCR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX0tVXNlclBvb2xDbGllbnRgLFxuICAgICAgICBhdXRoRmxvd3M6IHtcbiAgICAgICAgICB1c2VyUGFzc3dvcmQ6IHRydWUsXG4gICAgICAgICAgdXNlclNycDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXQ6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0ZWRJZGVudGl0eVByb3ZpZGVyczogW1xuICAgICAgICAgIFVzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlci5DT0dOSVRPLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBzZXNzaW9uIGluZGV4IHN0b3JhZ2UuXG4gKlxuICogU2Vzc2lvbiBpbmRleGVzIHByb3ZpZGUgZmFzdCB1c2VyIHRvIHNlc3Npb24gbG9va3VwcyBmb3IgbGlzdGluZyBhbmQgbWFuYWdpbmcgc2Vzc2lvbnMuXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAoRHluYW1vREJTZXNzaW9uSW5kZXgpIHVzZXMgRHluYW1vREIgZm9yIGVmZmljaWVudCBxdWVyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uSW5kZXgge1xuICAvKipcbiAgICogR3JhbnQgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyB0byBhIGdyYW50ZWUuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIHByaW5jaXBhbCB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgc2Vzc2lvbiBpbmRleFxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gY29uZmlndXJlIHRoZSBzZXNzaW9uIGluZGV4XG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgRHluYW1vREJTZXNzaW9uSW5kZXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1vREJTZXNzaW9uSW5kZXhQcm9wcyB7XG4gIC8qKlxuICAgKiBFeGlzdGluZyBEeW5hbW9EQiB0YWJsZSB0byB1c2UuXG4gICAqIFRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5ICd1c2VyX2lkJyAoU3RyaW5nKSBhbmQgc29ydCBrZXkgJ3Nlc3Npb25faWQnIChTdHJpbmcpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlPzogSVRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgZm9yIHNlc3Npb24gaW5kZXggcmVjb3Jkcy5cbiAgICogV2hlbiBzZXQsIGV4cGlyZWQgcmVjb3JkcyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkIGJ5IER5bmFtb0RCIFRUTC5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gVFRMIChzZXNzaW9ucyBwZXJzaXN0IHVudGlsIGV4cGxpY2l0bHkgZGVsZXRlZClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogS01TIGtleSBmb3IgdGFibGUgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgQVdTIG1hbmFnZWQgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IElLZXk7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciB0aGUgRHluYW1vREIgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogRHluYW1vREItYmFzZWQgc2Vzc2lvbiBpbmRleCBmb3IgZmFzdCB1c2VyIHRvIHNlc3Npb24gbG9va3Vwcy5cbiAqXG4gKiBDcmVhdGVzIGEgRHluYW1vREIgdGFibGUgaW5kZXhlZCBieSB1c2VyX2lkIChwYXJ0aXRpb24ga2V5KSBhbmQgc2Vzc2lvbl9pZCAoc29ydCBrZXkpXG4gKiBmb3IgZWZmaWNpZW50IHF1ZXJ5aW5nIG9mIGEgdXNlcidzIHNlc3Npb25zLiBUaGUgdGFibGUgc3RvcmVzIHNlc3Npb24gbWV0YWRhdGFcbiAqIGluY2x1ZGluZyBjcmVhdGlvbiB0aW1lLCBsYXN0IHVwZGF0ZSB0aW1lLCBhbmQgb3B0aW9uYWwgVFRMIGZvciBhdXRvbWF0aWMgY2xlYW51cC5cbiAqXG4gKiAjIyBUYWJsZSBTY2hlbWFcbiAqXG4gKiAtICoqUGFydGl0aW9uIEtleSoqOiB1c2VyX2lkIChTdHJpbmcpIC0gVXNlciBpZGVudGlmaWVyIGZyb20gYXV0aGVudGljYXRpb25cbiAqIC0gKipTb3J0IEtleSoqOiBzZXNzaW9uX2lkIChTdHJpbmcpIC0gVW5pcXVlIHNlc3Npb24gaWRlbnRpZmllclxuICogLSAqKkF0dHJpYnV0ZXMqKjogY3JlYXRlZF9hdCwgdXBkYXRlZF9hdCwgbGFzdF9tZXNzYWdlLCBleHBpcmVzX2F0IChvcHRpb25hbClcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipGYXN0IExvb2t1cHMqKjogUXVlcnkgYWxsIHNlc3Npb25zIGZvciBhIHVzZXIgaW4gTygxKSB1c2luZyBwYXJ0aXRpb24ga2V5XG4gKiAtICoqQXV0b21hdGljIEV4cGlyYXRpb24qKjogT3B0aW9uYWwgVFRMIHJlbW92ZXMgc3RhbGUgc2Vzc2lvbnMgYXV0b21hdGljYWxseVxuICogLSAqKk9uLURlbWFuZCBDYXBhY2l0eSoqOiBQYXktcGVyLXJlcXVlc3QgYmlsbGluZywgbm8gY2FwYWNpdHkgcGxhbm5pbmcgbmVlZGVkXG4gKiAtICoqRW5jcnlwdGlvbioqOiBBV1MgbWFuYWdlZCBvciBjdXN0b21lci1tYW5hZ2VkIEtNUyBlbmNyeXB0aW9uXG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBEeW5hbW9EQlNlc3Npb25JbmRleCB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IHNlc3Npb25JbmRleCA9IG5ldyBEeW5hbW9EQlNlc3Npb25JbmRleCh0aGlzLCAnU2Vzc2lvbkluZGV4Jywge1xuICogICBzZXNzaW9uVFRMOiBEdXJhdGlvbi5kYXlzKDcpXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgc2Vzc2lvbkluZGV4XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRHluYW1vREJTZXNzaW9uSW5kZXggaW1wbGVtZW50cyBJU2Vzc2lvbkluZGV4IHtcbiAgLyoqXG4gICAqIFRoZSBEeW5hbW9EQiB0YWJsZSB1c2VkIGZvciBzZXNzaW9uIGluZGV4IHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGU6IElUYWJsZTtcblxuICAvKipcbiAgICogVGhlIHNlc3Npb24gVFRMIGR1cmF0aW9uIChpZiBjb25maWd1cmVkKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uVFRMPzogRHVyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IER5bmFtb0RCU2Vzc2lvbkluZGV4UHJvcHMgPSB7fSkge1xuICAgIGNvbnN0IHJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWTtcblxuICAgIC8vIFVzZSBwcm92aWRlZCB0YWJsZSBvciBjcmVhdGUgbmV3IG9uZVxuICAgIGlmIChwcm9wcy50YWJsZSkge1xuICAgICAgdGhpcy50YWJsZSA9IHByb3BzLnRhYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YWJsZVByb3BzOiBhbnkgPSB7XG4gICAgICAgIHBhcnRpdGlvbktleTogeyBuYW1lOiAndXNlcl9pZCcsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICAgIHNvcnRLZXk6IHsgbmFtZTogJ3Nlc3Npb25faWQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICBiaWxsaW5nTW9kZTogQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uS2V5ID8gVGFibGVFbmNyeXB0aW9uLkNVU1RPTUVSX01BTkFHRUQgOiBUYWJsZUVuY3J5cHRpb24uQVdTX01BTkFHRUQsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHJlbW92YWxQb2xpY3ksXG4gICAgICAgIHBvaW50SW5UaW1lUmVjb3Zlcnk6IHRydWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgICAgfTtcblxuICAgICAgLy8gRW5hYmxlIFRUTCBpZiBzZXNzaW9uVFRMIGlzIHNwZWNpZmllZFxuICAgICAgaWYgKHByb3BzLnNlc3Npb25UVEwpIHtcbiAgICAgICAgdGFibGVQcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlID0gJ2V4cGlyZXNfYXQnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRhYmxlID0gbmV3IFRhYmxlKHNjb3BlLCBgJHtpZH1UYWJsZWAsIHRhYmxlUHJvcHMpO1xuICAgIH1cblxuICAgIHRoaXMuc2Vzc2lvblRUTCA9IHByb3BzLnNlc3Npb25UVEw7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyB0byBhIGdyYW50ZWUuXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogdm9pZCB7XG4gICAgdGhpcy50YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBTRVNTSU9OX0lOREVYX1RBQkxFOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc2Vzc2lvblRUTCkge1xuICAgICAgZW52LlNFU1NJT05fSU5ERVhfVFRMX1NFQ09ORFMgPSB0aGlzLnNlc3Npb25UVEwudG9TZWNvbmRzKCkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW52O1xuICB9XG59XG5cbi8qKlxuICogTm8tYXV0aGVudGljYXRpb24gYXV0aGVudGljYXRvciBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuXG4gKlxuICogRGlzYWJsZXMgYXV0aGVudGljYXRpb24gZW50aXJlbHksIGFsbG93aW5nIGFueSBjbGllbnQgdG8gY29ubmVjdFxuICogd2l0aG91dCBjcmVkZW50aWFscy4gVGhpcyBzaG91bGQgT05MWSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudFxuICogYW5kIHRlc3RpbmcgZW52aXJvbm1lbnRzLlxuICpcbiAqICMjIFNlY3VyaXR5IFdhcm5pbmdcbiAqXG4gKiBUaGlzIGF1dGhlbnRpY2F0b3IgcHJvdmlkZXMgTk8gc2VjdXJpdHkuIE5ldmVyIHVzZSBpbiBwcm9kdWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgTm9BdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogTm8tb3AgZm9yIE5vQXV0aGVudGljYXRvciBzaW5jZSBubyBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShfbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIE5vIHBlcm1pc3Npb25zIG5lZWRlZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFVVEhfVFlQRTogJ05vbmUnLFxuICAgIH07XG4gIH1cbn1cblxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGEgaG9zdGluZyBhZGFwdGVyJ3MgZGVwbG95IG1ldGhvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudEhvc3RpbmdDb25maWcge1xuICAvKiogQ0RLIHNjb3BlIGZvciBjcmVhdGluZyByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIC8qKiBBZ2VudCBuYW1lIGlkZW50aWZpZXIuICovXG4gIHJlYWRvbmx5IGFnZW50TmFtZTogc3RyaW5nO1xuICAvKiogSUFNIHJvbGUgZm9yIHRoZSBhZ2VudCBydW50aW1lLiAqL1xuICByZWFkb25seSBhZ2VudFJvbGU6IFJvbGU7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IG9uIHRoZSBydW50aW1lLiAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIEtNUyBlbmNyeXB0aW9uIGtleS4gKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogS2V5O1xuICAvKiogT3B0aW9uYWwgVlBDIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gKi9cbiAgcmVhZG9ubHkgbmV0d29yaz86IE5ldHdvcms7XG4gIC8qKiBMYW1iZGEgYXJjaGl0ZWN0dXJlIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAvKiogTGFtYmRhIG1lbW9yeSBzaXplIGluIE1CIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqIExhbWJkYSB0aW1lb3V0IChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuICAvKiogUmVzZXJ2ZWQgY29uY3VycmVudCBleGVjdXRpb25zIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgLyoqIExhbWJkYSBsYXllcnMgZnJvbSBhZ2VudCBkZWZpbml0aW9uIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbGFtYmRhTGF5ZXJzPzogSUxheWVyVmVyc2lvbltdO1xuICAvKiogTGFtYmRhIGxheWVycyBmcm9tIGtub3dsZWRnZSBiYXNlcyAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VMYXllcnM/OiBJTGF5ZXJWZXJzaW9uW107XG4gIC8qKiBXaGV0aGVyIG9ic2VydmFiaWxpdHkgaXMgZW5hYmxlZC4gKi9cbiAgcmVhZG9ubHkgZW5hYmxlT2JzZXJ2YWJpbGl0eT86IGJvb2xlYW47XG4gIC8qKiBBZ2VudCB0b29scyBsb2NhdGlvbiBkZWZpbml0aW9ucyAoSlNPTiBzZXJpYWxpemVkKS4gKi9cbiAgcmVhZG9ubHkgdG9vbHNDb25maWc6IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgUzMgYnVja2V0IG5hbWUuICovXG4gIHJlYWRvbmx5IHN5c3RlbVByb21wdEJ1Y2tldDogc3RyaW5nO1xuICAvKiogU3lzdGVtIHByb21wdCBTMyBrZXkuICovXG4gIHJlYWRvbmx5IHN5c3RlbVByb21wdEtleTogc3RyaW5nO1xuICAvKiogS25vd2xlZGdlIGJhc2UgY29uZmlncyAoSlNPTiBzZXJpYWxpemVkKS4gKi9cbiAgcmVhZG9ubHkga25vd2xlZGdlQmFzZUNvbmZpZ3M/OiBzdHJpbmc7XG4gIC8qKiBLbm93bGVkZ2UgYmFzZSBzeXN0ZW0gcHJvbXB0IGFkZGl0aW9uLiAqL1xuICByZWFkb25seSBrbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb24/OiBzdHJpbmc7XG4gIC8qKiBSZW1vdmFsIHBvbGljeSBmb3IgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgYSBob3N0aW5nIGFkYXB0ZXIncyBkZXBsb3kgbWV0aG9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50SG9zdGluZ1Jlc3VsdCB7XG4gIC8qKiBUaGUgYWdlbnQgZW5kcG9pbnQgVVJMIG9yIEFSTi4gKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgLyoqIFRoZSBMYW1iZGEgZnVuY3Rpb24gKGlmIExhbWJkYS1ob3N0ZWQpLiAqL1xuICByZWFkb25seSBhZ2VudEZ1bmN0aW9uPzogSUZ1bmN0aW9uO1xuICAvKiogVGhlIEFnZW50Q29yZSBDZm5SdW50aW1lIChpZiBBZ2VudENvcmUtaG9zdGVkKS4gKi9cbiAgcmVhZG9ubHkgY2ZuUnVudGltZT86IENmblJ1bnRpbWU7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBwbHVnZ2FibGUgaG9zdGluZyBiYWNrZW5kcy5cbiAqXG4gKiBIb3N0aW5nIGFkYXB0ZXJzIGVuY2Fwc3VsYXRlIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gcnVuIGFuIGFnZW50LlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYExhbWJkYUhvc3RpbmdBZGFwdGVyYCAoTGFtYmRhICsgTFdBICsgQVBJIEdhdGV3YXkpLlxuICogYEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcmAgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdXNpbmcgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvc3RpbmdBZGFwdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBJQU0gc2VydmljZSBwcmluY2lwYWwgdGhhdCB0aGlzIGhvc3RpbmcgYmFja2VuZCByZXF1aXJlcy5cbiAgICpcbiAgICogQmFzZUFnZW50IHVzZXMgdGhpcyB0byBjcmVhdGUgdGhlIGFnZW50IHJvbGUgd2l0aCB0aGUgY29ycmVjdCB0cnVzdCBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCBMYW1iZGEgaG9zdGluZyByZXF1aXJlcyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdoaWxlIEFnZW50Q29yZVxuICAgKiBob3N0aW5nIHJlcXVpcmVzIGBiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tYC5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VQcmluY2lwYWw6IFNlcnZpY2VQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIERlcGxveSB0aGUgYWdlbnQgaG9zdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBob3N0aW5nXG4gICAqIEByZXR1cm5zIFRoZSBob3N0aW5nIHJlc3VsdCBpbmNsdWRpbmcgZW5kcG9pbnQgYW5kIG9wdGlvbmFsIHJlc291cmNlc1xuICAgKi9cbiAgZGVwbG95KGNvbmZpZzogQWdlbnRIb3N0aW5nQ29uZmlnKTogQWdlbnRIb3N0aW5nUmVzdWx0O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgTGFtYmRhSG9zdGluZ0FkYXB0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhSG9zdGluZ0FkYXB0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBDb21tdW5pY2F0aW9uIGFkYXB0ZXIgZm9yIGNsaWVudC1hZ2VudCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RyZWFtaW5nSHR0cEFkYXB0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGNvbW11bmljYXRpb25BZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIC8qKlxuICAgKiBIVFRQIG1ldGhvZHMgdG8gYWxsb3cgaW4gQ09SUyBwcmVmbGlnaHQgcmVzcG9uc2VzLlxuICAgKiBVc2UgdGhpcyB0byBlbmFibGUgYWRkaXRpb25hbCBtZXRob2RzIChHRVQsIERFTEVURSwgUFVUKSBmb3IgY3VzdG9tIHJvdXRlc1xuICAgKiBhZGRlZCB0byB0aGUgUkVTVCBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnUE9TVCcsICdPUFRJT05TJ11cbiAgICovXG4gIHJlYWRvbmx5IGNvcnNBbGxvd01ldGhvZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIG1lbW9yeSBzaXplIGluIE1CLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDI0XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gdGltZW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygxNSlcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBSZXNlcnZlZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIHJlc2VydmVkIGNvbmN1cnJlbmN5XG4gICAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIExhbWJkYSBob3N0aW5nIGFkYXB0ZXIgZm9yIEludGVyYWN0aXZlQWdlbnQuXG4gKlxuICogRGVwbG95cyB0aGUgYWdlbnQgYXMgYSBMYW1iZGEgZnVuY3Rpb24gYmVoaW5kIExhbWJkYSBXZWIgQWRhcHRlciBhbmQgQVBJIEdhdGV3YXlcbiAqIFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGhvc3RpbmcgYmFja2VuZC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgUE9TVCAvY2hhdCDihpIgQVBJIEdhdGV3YXkgUkVTVCBBUEkgKFNUUkVBTSkg4oaSIExhbWJkYSAoRmFzdEFQSSArIExXQSkg4oaSIEJlZHJvY2tcbiAqIENsaWVudCDihpAgU1NFIHN0cmVhbSDihpAgQVBJIEdhdGV3YXkg4oaQIExhbWJkYSByZXNwb25zZSBzdHJlYW1pbmcg4oaQIEFnZW50IHRva2Vuc1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFIb3N0aW5nQWRhcHRlciBpbXBsZW1lbnRzIElIb3N0aW5nQWRhcHRlciB7XG4gIC8qKiBUaGUgY29tbXVuaWNhdGlvbiBhZGFwdGVyLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbXVuaWNhdGlvbkFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG4gIC8qKiBUaGUgYXV0aGVudGljYXRvci4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBMYW1iZGFIb3N0aW5nQWRhcHRlclByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBMYW1iZGFIb3N0aW5nQWRhcHRlclByb3BzID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIH1cblxuICBnZXQgc2VydmljZVByaW5jaXBhbCgpIHsgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpOyB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBMYW1iZGEgKyBMV0EgKyBBUEkgR2F0ZXdheSBob3N0aW5nIGluZnJhc3RydWN0dXJlLlxuICAgKi9cbiAgZGVwbG95KGNvbmZpZzogQWdlbnRIb3N0aW5nQ29uZmlnKTogQWdlbnRIb3N0aW5nUmVzdWx0IHtcbiAgICBjb25zdCBzY29wZSA9IGNvbmZpZy5zY29wZTtcblxuICAgIC8vIEluaXRpYWxpemUgYXV0aGVudGljYXRvclxuICAgIGNvbnN0IGF1dGhlbnRpY2F0b3IgPSB0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3IgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3JcbiAgICAgIDogbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKCk7XG4gICAgKHRoaXMgYXMgYW55KS5hdXRoZW50aWNhdG9yID0gYXV0aGVudGljYXRvcjtcblxuICAgIGlmIChhdXRoZW50aWNhdG9yIGluc3RhbmNlb2YgQ29nbml0b0F1dGhlbnRpY2F0b3IpIHtcbiAgICAgIGF1dGhlbnRpY2F0b3IuX3NldFNjb3BlKHNjb3BlKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbW11bmljYXRpb24gYWRhcHRlclxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLnByb3BzLmNvbW11bmljYXRpb25BZGFwdGVyIHx8IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcih7XG4gICAgICBhdXRoZW50aWNhdG9yLFxuICAgICAgY29yc0FsbG93TWV0aG9kczogdGhpcy5wcm9wcy5jb3JzQWxsb3dNZXRob2RzLFxuICAgIH0pO1xuICAgICh0aGlzIGFzIGFueSkuY29tbXVuaWNhdGlvbkFkYXB0ZXIgPSBhZGFwdGVyO1xuXG4gICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBTdHJlYW1pbmdIdHRwQWRhcHRlcikge1xuICAgICAgYWRhcHRlci5fc2V0U2NvcGUoc2NvcGUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC4uLmNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIC8vIExhbWJkYSBXZWIgQWRhcHRlciBjb25maWd1cmF0aW9uXG4gICAgICBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUjogJy9vcHQvYm9vdHN0cmFwJyxcbiAgICAgIEFXU19MV0FfSU5WT0tFX01PREU6ICdyZXNwb25zZV9zdHJlYW0nLFxuICAgICAgQVdTX0xXQV9SRUFESU5FU1NfQ0hFQ0tfUEFUSDogJy9oZWFsdGgnLFxuICAgICAgQVdTX0xXQV9QT1JUOiAnODA4MCcsXG4gICAgICBQT1JUOiAnODA4MCcsXG4gICAgICAuLi5hdXRoZW50aWNhdG9yLmVudmlyb25tZW50VmFyaWFibGVzKCksXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb24gd2l0aCBMYW1iZGEgV2ViIEFkYXB0ZXIgbGF5ZXJcbiAgICBjb25zdCB7IGFjY291bnQsIHJlZ2lvbiB9ID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGNvbnN0IGFnZW50TGFtYmRhTG9nUGVybWlzc2lvbnNSZXN1bHQgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIHNjb3BlLFxuICAgICAgZnVuY3Rpb25OYW1lOiBjb25maWcuYWdlbnROYW1lLFxuICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogY29uZmlnLmVuYWJsZU9ic2VydmFiaWxpdHksXG4gICAgfSk7XG5cbiAgICAvLyBMYW1iZGEgV2ViIEFkYXB0ZXIgbGF5ZXJcbiAgICBjb25zdCB3ZWJBZGFwdGVyTGF5ZXIgPSBMYXllclZlcnNpb24uZnJvbUxheWVyVmVyc2lvbkFybihcbiAgICAgIHNjb3BlLFxuICAgICAgJ0xhbWJkYVdlYkFkYXB0ZXJMYXllcicsXG4gICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259Ojc1MzI0MDU5ODA3NTpsYXllcjpMYW1iZGFBZGFwdGVyTGF5ZXJYODY6MjVgLFxuICAgICk7XG5cbiAgICBjb25zdCBhbGxMYXllcnM6IElMYXllclZlcnNpb25bXSA9IFt3ZWJBZGFwdGVyTGF5ZXJdO1xuICAgIGlmIChjb25maWcubGFtYmRhTGF5ZXJzKSB7XG4gICAgICBhbGxMYXllcnMucHVzaCguLi5jb25maWcubGFtYmRhTGF5ZXJzKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5rbm93bGVkZ2VCYXNlTGF5ZXJzICYmIGNvbmZpZy5rbm93bGVkZ2VCYXNlTGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFsbExheWVycy5wdXNoKC4uLmNvbmZpZy5rbm93bGVkZ2VCYXNlTGF5ZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvaW50ZXJhY3RpdmUtYWdlbnQtaGFuZGxlcicpO1xuXG4gICAgLy8gQWxsIFB5dGhvbiB2ZXJzaW9uIHJlZmVyZW5jZXMgZGVyaXZlZCBmcm9tIERlZmF1bHRSdW50aW1lcy5QWVRIT05cbiAgICBjb25zdCBweXRob25SdW50aW1lID0gRGVmYXVsdFJ1bnRpbWVzLlBZVEhPTjtcbiAgICBjb25zdCBweVZlcnNpb24gPSBweXRob25SdW50aW1lLm5hbWUucmVwbGFjZSgncHl0aG9uJywgJycpOyAvLyBlLmcuIFwiMy4xM1wiXG5cbiAgICBjb25zdCBhcmNoaXRlY3R1cmUgPSB0aGlzLnByb3BzLmFyY2hpdGVjdHVyZSB8fCBjb25maWcuYXJjaGl0ZWN0dXJlIHx8IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgY29uc3QgbWVtb3J5U2l6ZSA9IHRoaXMucHJvcHMubWVtb3J5U2l6ZSB8fCBjb25maWcubWVtb3J5U2l6ZSB8fCAxMDI0O1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnByb3BzLnRpbWVvdXQgfHwgY29uZmlnLnRpbWVvdXQgfHwgRHVyYXRpb24ubWludXRlcygxNSk7XG4gICAgY29uc3QgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyA9IHRoaXMucHJvcHMucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyA/PyBjb25maWcucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucztcblxuICAgIGNvbnN0IGFnZW50RnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oc2NvcGUsICdJbnRlcmFjdGl2ZUFnZW50RnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGFnZW50TGFtYmRhTG9nUGVybWlzc2lvbnNSZXN1bHQudW5pcXVlRnVuY3Rpb25OYW1lLFxuICAgICAgYXJjaGl0ZWN0dXJlLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoaGFuZGxlclBhdGgsIHtcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBpbWFnZTogcHl0aG9uUnVudGltZS5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgIGNvbW1hbmQ6IFtcbiAgICAgICAgICAgICdiYXNoJywgJy1jJyxcbiAgICAgICAgICAgICdwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IC10IC9hc3NldC1vdXRwdXQgJiYgY3AgLWEgLiAvYXNzZXQtb3V0cHV0JyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9jID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgICAgICAgICBjb25zdCBweXRob25DYW5kaWRhdGVzID0gW2BweXRob24ke3B5VmVyc2lvbn1gLCAncHl0aG9uMycsICdweXRob24nXTtcbiAgICAgICAgICAgICAgICBsZXQgcHl0aG9uQmluID0gJ3B5dGhvbjMnO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHB5dGhvbkNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlciA9IHByb2MuZXhlY1N5bmMoYCR7Y2FuZGlkYXRlfSAtLXZlcnNpb24gMj4mMWAsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZlci5tYXRjaCgvUHl0aG9uIChcXGQrKVxcLihcXGQrKS8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgKHBhcnNlSW50KG1hdGNoWzFdKSA+IDMgfHwgKHBhcnNlSW50KG1hdGNoWzFdKSA9PT0gMyAmJiBwYXJzZUludChtYXRjaFsyXSkgPj0gMTEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHB5dGhvbkJpbiA9IGNhbmRpZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jLmV4ZWNTeW5jKFxuICAgICAgICAgICAgICAgICAgYCR7cHl0aG9uQmlufSAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IC10IFwiJHtvdXRwdXREaXJ9XCIgLS1wbGF0Zm9ybSBtYW55bGludXgyMDE0X3g4Nl82NCAtLW9ubHktYmluYXJ5PTphbGw6IC0tcHl0aG9uLXZlcnNpb24gJHtweVZlcnNpb259YCxcbiAgICAgICAgICAgICAgICAgIHsgY3dkOiBoYW5kbGVyUGF0aCwgc3RkaW86ICdpbmhlcml0JyB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcHJvYy5leGVjU3luYyhcbiAgICAgICAgICAgICAgICAgIGBjcCAtciAuIFwiJHtvdXRwdXREaXJ9XCJgLFxuICAgICAgICAgICAgICAgICAgeyBjd2Q6IGhhbmRsZXJQYXRoLCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHJvbGU6IGNvbmZpZy5hZ2VudFJvbGUsXG4gICAgICBoYW5kbGVyOiAncnVuLnNoJyxcbiAgICAgIHJ1bnRpbWU6IHB5dGhvblJ1bnRpbWUsXG4gICAgICBsYXllcnM6IGFsbExheWVycyxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBtZW1vcnlTaXplLFxuICAgICAgZW52aXJvbm1lbnQ6IGVudixcbiAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogY29uZmlnLmVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IGNvbmZpZy5uZXR3b3JrID8gY29uZmlnLm5ldHdvcmsudnBjIDogdW5kZWZpbmVkLFxuICAgICAgdnBjU3VibmV0czogY29uZmlnLm5ldHdvcmsgPyBjb25maWcubmV0d29yay5hcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbigpIDogdW5kZWZpbmVkLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIEdyYW50IGxvZyBwZXJtaXNzaW9uc1xuICAgIGZvciAoY29uc3QgcyBvZiBhZ2VudExhbWJkYUxvZ1Blcm1pc3Npb25zUmVzdWx0LnBvbGljeVN0YXRlbWVudHMpIHtcbiAgICAgIGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kocyk7XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgYXV0aGVudGljYXRvciBwZXJtaXNzaW9uc1xuICAgIGlmIChhdXRoZW50aWNhdG9yKSB7XG4gICAgICBhdXRoZW50aWNhdG9yLmdyYW50QXV0aGVudGljYXRlKGFnZW50RnVuY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBjb21tdW5pY2F0aW9uIGFkYXB0ZXIgYW5kIGdldCBlbmRwb2ludFxuICAgIGNvbnN0IGVuZHBvaW50ID0gYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKGFnZW50RnVuY3Rpb24pO1xuICAgIGFkYXB0ZXIuZ3JhbnRJbnZva2UoYWdlbnRGdW5jdGlvbik7XG5cbiAgICByZXR1cm4geyBlbmRwb2ludCwgYWdlbnRGdW5jdGlvbiB9O1xuICB9XG59XG5cbi8qKlxuICogQ3VzdG9tIEpXVCBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24gZm9yIEFnZW50Q29yZSBSdW50aW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50Q29yZUp3dEF1dGhvcml6ZXJDb25maWcge1xuICAvKiogT0lEQyBkaXNjb3ZlcnkgVVJMLiAqL1xuICByZWFkb25seSBkaXNjb3ZlcnlVcmw6IHN0cmluZztcbiAgLyoqIEFsbG93ZWQgYXVkaWVuY2VzLiAqL1xuICByZWFkb25seSBhbGxvd2VkQXVkaWVuY2U/OiBzdHJpbmdbXTtcbiAgLyoqIEFsbG93ZWQgY2xpZW50IElEcy4gKi9cbiAgcmVhZG9ubHkgYWxsb3dlZENsaWVudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlci5cbiAqL1xuLyoqXG4gKiBOZXR3b3JrIG1vZGUgZm9yIEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcuXG4gKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBBZ2VudENvcmUgUnVudGltZSBydW5zIG9uIHRoZSBwdWJsaWMgaW50ZXJuZXRcbiAqIG9yIGluc2lkZSBhIFZQQyB3aXRoIHByaXZhdGUgbmV0d29ya2luZy5cbiAqL1xuZXhwb3J0IGVudW0gTmV0d29ya01vZGUge1xuICAvKipcbiAgICogUnVudGltZSBpcyBwdWJsaWNseSBhY2Nlc3NpYmxlIChkZWZhdWx0KS5cbiAgICogTm8gVlBDIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQuXG4gICAqL1xuICBQVUJMSUMgPSAnUFVCTElDJyxcblxuICAvKipcbiAgICogUnVudGltZSBydW5zIGluc2lkZSBhIFZQQy5cbiAgICpcbiAgICogQWdlbnRDb3JlIGNyZWF0ZXMgRU5JcyBpbiB0aGUgc3BlY2lmaWVkIHN1Ym5ldHMuIFlvdSBtdXN0IHByb3ZpZGVcbiAgICogZWl0aGVyIGV4cGxpY2l0IGB2cGNTdWJuZXRzYCBhbmQgYHNlY3VyaXR5R3JvdXBzYCwgb3IgcGFzcyBhXG4gICAqIGBOZXR3b3JrYCBjb25zdHJ1Y3QgdmlhIGBJbnRlcmFjdGl2ZUFnZW50Lm5ldHdvcmtgLlxuICAgKlxuICAgKiBVc2UgcHJpdmF0ZSBzdWJuZXRzIHdpdGggYSBOQVQgR2F0ZXdheSBmb3IgaW50ZXJuZXQgYWNjZXNzLlxuICAgKiBQdWJsaWMgc3VibmV0cyBkbyBOT1QgcHJvdmlkZSBpbnRlcm5ldCBhY2Nlc3MgdG8gQWdlbnRDb3JlIEVOSXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9hZ2VudGNvcmUtdnBjLmh0bWxcbiAgICovXG4gIFZQQyA9ICdWUEMnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzIHtcbiAgLyoqXG4gICAqIEVDUiBjb250YWluZXIgaW1hZ2UgVVJJLiBJZiBub3QgcHJvdmlkZWQsIGJ1aWxkcyBmcm9tIHRoZSBidW5kbGVkIGhhbmRsZXIgc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBCdWlsZHMgZnJvbSBhZ2VudGNvcmUtYWdlbnQtaGFuZGxlciBkaXJlY3RvcnlcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lckltYWdlVXJpPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIG1vZGUgZm9yIHRoZSBBZ2VudENvcmUgUnVudGltZS5cbiAgICpcbiAgICogV2hlbiBzZXQgdG8gYE5ldHdvcmtNb2RlLlZQQ2AsIHRoZSBydW50aW1lIHJ1bnMgaW5zaWRlIGEgVlBDIGFuZCBBZ2VudENvcmUgY3JlYXRlc1xuICAgKiBFTklzIGluIHRoZSBzcGVjaWZpZWQgc3VibmV0cy4gWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgZXhwbGljaXQgYHZwY1N1Ym5ldHNgXG4gICAqIGFuZCBgc2VjdXJpdHlHcm91cHNgLCBvciBwYXNzIGEgYE5ldHdvcmtgIGNvbnN0cnVjdCB2aWEgYEFnZW50SG9zdGluZ0NvbmZpZy5uZXR3b3JrYFxuICAgKiAod2hpY2ggaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkgYEludGVyYWN0aXZlQWdlbnRgIHdoZW4gYG5ldHdvcmtgIGlzIHByb3ZpZGVkKS5cbiAgICpcbiAgICogRm9yIFZQQyBtb2RlLCB1c2UgcHJpdmF0ZSBzdWJuZXRzIHdpdGggYSBOQVQgR2F0ZXdheSBmb3IgaW50ZXJuZXQgYWNjZXNzLlxuICAgKiBQdWJsaWMgc3VibmV0cyBkbyBOT1QgcHJvdmlkZSBpbnRlcm5ldCBhY2Nlc3MgdG8gQWdlbnRDb3JlIEVOSXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9hZ2VudGNvcmUtdnBjLmh0bWxcbiAgICogQGRlZmF1bHQgTmV0d29ya01vZGUuUFVCTElDXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrTW9kZT86IE5ldHdvcmtNb2RlO1xuXG4gIC8qKlxuICAgKiBTdWJuZXQgc2VsZWN0aW9uIGZvciBWUEMgbmV0d29yayBtb2RlLlxuICAgKlxuICAgKiBTZWxlY3RzIHdoaWNoIHN1Ym5ldHMgdGhlIEFnZW50Q29yZSBSdW50aW1lIEVOSXMgYXJlIHBsYWNlZCBpbi5cbiAgICogUmVxdWlyZXMgYSBWUEMgdG8gYmUgcHJvdmlkZWQgdmlhIGBBZ2VudEhvc3RpbmdDb25maWcubmV0d29ya2BcbiAgICogKHNldCBhdXRvbWF0aWNhbGx5IGJ5IGBJbnRlcmFjdGl2ZUFnZW50YCB3aGVuIGBuZXR3b3JrYCBpcyBwcm92aWRlZClcbiAgICogc28gdGhhdCBzdWJuZXRzIGNhbiBiZSByZXNvbHZlZC5cbiAgICpcbiAgICogQmVzdCBwcmFjdGljZSBpcyB0byBzZWxlY3QgcHJpdmF0ZSBzdWJuZXRzIHdpdGggYSBOQVQgR2F0ZXdheVxuICAgKiBpbiBhdCBsZWFzdCAyIEF2YWlsYWJpbGl0eSBab25lcy4gTWF4aW11bSAxNiBzdWJuZXRzLlxuICAgKlxuICAgKiBXaGVuIGJvdGggYHZwY1N1Ym5ldHNgIGFuZCBgQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmtgIGFyZSBwcm92aWRlZCxcbiAgICogYHZwY1N1Ym5ldHNgIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmV0d29yaydzIGRlZmF1bHQgYXBwbGljYXRpb24gc3VibmV0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZXJpdmVkIGZyb20gQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKSBpZiBhdmFpbGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwcyBmb3IgVlBDIG5ldHdvcmsgbW9kZS5cbiAgICpcbiAgICogQXR0YWNoZWQgdG8gdGhlIEFnZW50Q29yZSBSdW50aW1lIEVOSXMuIE1heGltdW0gMTYgc2VjdXJpdHkgZ3JvdXBzLlxuICAgKlxuICAgKiBXaGVuIGJvdGggYHNlY3VyaXR5R3JvdXBzYCBhbmQgYEFnZW50SG9zdGluZ0NvbmZpZy5uZXR3b3JrYCBhcmUgcHJvdmlkZWQsXG4gICAqIGBzZWN1cml0eUdyb3Vwc2AgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIG5ldyBzZWN1cml0eSBncm91cCBhbGxvd2luZyBhbGwgb3V0Ym91bmQgdHJhZmZpYyBpcyBjcmVhdGVkXG4gICAqIGZyb20gQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmsgaWYgYXZhaWxhYmxlXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBKV1QgYXV0aG9yaXplciBjb25maWd1cmF0aW9uLlxuICAgKiBPbWl0IGZvciBJQU0tb25seSBhdXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tSnd0QXV0aG9yaXplcj86IEFnZW50Q29yZUp3dEF1dGhvcml6ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb3RvY29sIGNvbmZpZ3VyYXRpb246ICdIVFRQJyB8ICdNQ1AnIHwgJ0EyQScuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdIVFRQJ1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW50aW1lIGVuZHBvaW50IG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tZ2VuZXJhdGVkIGZyb20gYWdlbnQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcgYWRhcHRlciBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBEZXBsb3lzIHRoZSBhZ2VudCBhcyBhIGNvbnRhaW5lciBydW5uaW5nIG9uIEFnZW50Q29yZSBSdW50aW1lIChtaWNyb1ZNKS5cbiAqIFVzZXMgTDEgY29uc3RydWN0cyBgQ2ZuUnVudGltZWAgYW5kIGBDZm5SdW50aW1lRW5kcG9pbnRgIGZyb21cbiAqIGBhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZWAuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQg4oaSIEFnZW50Q29yZSBSdW50aW1lIEVuZHBvaW50IOKGkiBDb250YWluZXIgKEZhc3RBUEkgb24gcG9ydCA4MDgwKSDihpIgQmVkcm9ja1xuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqU2Vzc2lvbiBJc29sYXRpb24qKjogbWljcm9WTSBwcm92aWRlcyBwZXItc2Vzc2lvbiBpc29sYXRpb24gKG5vIFMzIHNlc3Npb24gYnVja2V0IG5lZWRlZClcbiAqIC0gKipNYW5hZ2VkIEluZnJhc3RydWN0dXJlKio6IE5vIExhbWJkYSBjb2xkIHN0YXJ0cyBvciB0aW1lb3V0IGxpbWl0c1xuICogLSAqKk11bHRpcGxlIFByb3RvY29scyoqOiBIVFRQLCBNQ1AsIG9yIEEyQSBwcm90b2NvbCBzdXBwb3J0XG4gKiAtICoqQ29udGFpbmVyLUJhc2VkKio6IFN0YW5kYXJkIERvY2tlciBpbWFnZSBkZXBsb3ltZW50XG4gKiAtICoqVlBDIFN1cHBvcnQqKjogUnVuIGluc2lkZSBhIFZQQyB3aXRoIHByaXZhdGUgc3VibmV0cyBmb3IgbmV0d29yayBpc29sYXRpb25cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIsIE5ldHdvcmtNb2RlIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGRlY2xhcmUgY29uc3QgbXlQcm9tcHQ6IEFzc2V0O1xuICpcbiAqIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnTXlDaGF0Ym90JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgaG9zdGluZ0FkYXB0ZXI6IG5ldyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIoe1xuICogICAgIG5ldHdvcmtNb2RlOiBOZXR3b3JrTW9kZS5QVUJMSUMsXG4gKiAgIH0pLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlciBpbXBsZW1lbnRzIElIb3N0aW5nQWRhcHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgZ2V0IHNlcnZpY2VQcmluY2lwYWwoKSB7IHJldHVybiBuZXcgU2VydmljZVByaW5jaXBhbCgnYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbScpOyB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBBZ2VudENvcmUgUnVudGltZSBob3N0aW5nIGluZnJhc3RydWN0dXJlLlxuICAgKi9cbiAgZGVwbG95KGNvbmZpZzogQWdlbnRIb3N0aW5nQ29uZmlnKTogQWdlbnRIb3N0aW5nUmVzdWx0IHtcbiAgICBjb25zdCBzY29wZSA9IGNvbmZpZy5zY29wZTtcbiAgICBjb25zdCBuZXR3b3JrTW9kZSA9IHRoaXMucHJvcHMubmV0d29ya01vZGUgfHwgTmV0d29ya01vZGUuUFVCTElDO1xuXG4gICAgLy8gUmVzb2x2ZSBWUEMgY29uZmlndXJhdGlvbiBmb3IgVlBDIG5ldHdvcmsgbW9kZVxuICAgIGxldCByZXNvbHZlZFN1Ym5ldElkczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc29sdmVkU2VjdXJpdHlHcm91cElkczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmV0d29ya01vZGUgPT09IE5ldHdvcmtNb2RlLlZQQykge1xuICAgICAgLy8gRXhwbGljaXQgcHJvcHMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgTmV0d29yayBjb25zdHJ1Y3RcbiAgICAgIGlmICh0aGlzLnByb3BzLnZwY1N1Ym5ldHMgJiYgY29uZmlnLm5ldHdvcmspIHtcbiAgICAgICAgcmVzb2x2ZWRTdWJuZXRJZHMgPSBjb25maWcubmV0d29yay52cGMuc2VsZWN0U3VibmV0cyh0aGlzLnByb3BzLnZwY1N1Ym5ldHMpLnN1Ym5ldElkcztcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5ldHdvcmspIHtcbiAgICAgICAgY29uc3Qgc3VibmV0cyA9IGNvbmZpZy5uZXR3b3JrLnZwYy5zZWxlY3RTdWJuZXRzKFxuICAgICAgICAgIGNvbmZpZy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCksXG4gICAgICAgICkuc3VibmV0SWRzO1xuICAgICAgICByZXNvbHZlZFN1Ym5ldElkcyA9IHN1Ym5ldHM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLnNlY3VyaXR5R3JvdXBzKSB7XG4gICAgICAgIHJlc29sdmVkU2VjdXJpdHlHcm91cElkcyA9IHRoaXMucHJvcHMuc2VjdXJpdHlHcm91cHMubWFwKHNnID0+IHNnLnNlY3VyaXR5R3JvdXBJZCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZy5uZXR3b3JrKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNlY3VyaXR5IGdyb3VwIGZvciB0aGUgQWdlbnRDb3JlIHJ1bnRpbWUgRU5Jc1xuICAgICAgICBjb25zdCBzZyA9IG5ldyBTZWN1cml0eUdyb3VwKHNjb3BlLCAnQWdlbnRDb3JlUnVudGltZVNHJywge1xuICAgICAgICAgIHZwYzogY29uZmlnLm5ldHdvcmsudnBjLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2VjdXJpdHkgZ3JvdXAgZm9yIEFnZW50Q29yZSBSdW50aW1lIEVOSXMnLFxuICAgICAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXNvbHZlZFNlY3VyaXR5R3JvdXBJZHMgPSBbc2cuc2VjdXJpdHlHcm91cElkXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNvbHZlZFN1Ym5ldElkcyB8fCByZXNvbHZlZFN1Ym5ldElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdWUEMgbmV0d29yayBtb2RlIHJlcXVpcmVzIHN1Ym5ldHMgdG8gYmUgcHJvdmlkZWQgZWl0aGVyIHZpYSAnICtcbiAgICAgICAgICAnQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHMudnBjU3VibmV0cyAod2l0aCBhIE5ldHdvcmsgY29uc3RydWN0KSAnICtcbiAgICAgICAgICAnb3IgdmlhIGEgTmV0d29yayBjb25zdHJ1Y3QgaW4gQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmsuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzb2x2ZWRTZWN1cml0eUdyb3VwSWRzIHx8IHJlc29sdmVkU2VjdXJpdHlHcm91cElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdWUEMgbmV0d29yayBtb2RlIHJlcXVpcmVzIHNlY3VyaXR5IGdyb3VwcyB0byBiZSBwcm92aWRlZCBlaXRoZXIgdmlhICcgK1xuICAgICAgICAgICdBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJQcm9wcy5zZWN1cml0eUdyb3VwcyBvciB2aWEgYSBOZXR3b3JrIGNvbnN0cnVjdCAnICtcbiAgICAgICAgICAnaW4gQWdlbnRIb3N0aW5nQ29uZmlnLm5ldHdvcmsuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvciByZWZlcmVuY2UgY29udGFpbmVyIGltYWdlXG4gICAgbGV0IGNvbnRhaW5lclVyaTogc3RyaW5nO1xuICAgIGlmICh0aGlzLnByb3BzLmNvbnRhaW5lckltYWdlVXJpKSB7XG4gICAgICBjb250YWluZXJVcmkgPSB0aGlzLnByb3BzLmNvbnRhaW5lckltYWdlVXJpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYW5kbGVyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdyZXNvdXJjZXMvYWdlbnRjb3JlLWFnZW50LWhhbmRsZXInKTtcbiAgICAgIGNvbnN0IGltYWdlQXNzZXQgPSBuZXcgRG9ja2VySW1hZ2VBc3NldChzY29wZSwgJ0FnZW50Q29yZUhhbmRsZXJJbWFnZScsIHtcbiAgICAgICAgZGlyZWN0b3J5OiBoYW5kbGVyUGF0aCxcbiAgICAgIH0pO1xuICAgICAgY29udGFpbmVyVXJpID0gaW1hZ2VBc3NldC5pbWFnZVVyaTtcbiAgICB9XG5cbiAgICAvLyBSZXVzZSB0aGUgc2luZ2xlIGFnZW50Um9sZSAoYWxyZWFkeSBoYXMgYmVkcm9jay1hZ2VudGNvcmUgdHJ1c3QgZnJvbSBCYXNlQWdlbnQpLlxuICAgIC8vIE9ubHkgYWRkIEVDUiBwdWxsIHBlcm1pc3Npb25zIOKAlCBhbGwgb3RoZXIgcGVybWlzc2lvbnMgKEJlZHJvY2sgSW52b2tlTW9kZWwsXG4gICAgLy8gUzMgdG9vbCBhc3NldHMsIEtCIGFjY2Vzcywgc2Vzc2lvbiBidWNrZXQsIG9ic2VydmFiaWxpdHkpIGFyZSBhbHJlYWR5IGdyYW50ZWRcbiAgICAvLyBieSBCYXNlQWdlbnQgb24gY29uZmlnLmFnZW50Um9sZS5cbiAgICBjb25zdCBlY3JQb2xpY3lSZXN1bHQgPSBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdlY3I6R2V0RG93bmxvYWRVcmxGb3JMYXllcicsXG4gICAgICAgICdlY3I6QmF0Y2hHZXRJbWFnZScsXG4gICAgICAgICdlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcblxuICAgIC8vIEFkZCBBRE9UIG9ic2VydmFiaWxpdHkgcGVybWlzc2lvbnMgd2hlbiBlbmFibGVkLlxuICAgIC8vIFRoZSBjb250YWluZXIgRG9ja2VyZmlsZSB1c2VzIGBvcGVudGVsZW1ldHJ5LWluc3RydW1lbnRgIGFzIGl0cyBDTUQgd3JhcHBlcjtcbiAgICAvLyBBRE9UIG5lZWRzIHRoZXNlIHBlcm1pc3Npb25zIHRvIGV4cG9ydCB0cmFjZXMsIGxvZ3MsIGFuZCBtZXRyaWNzIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICAvLyBOb3RlOiBXZSB1c2UgZXhwbGljaXQgc3RhdGVtZW50cyBpbnN0ZWFkIG9mIENsb3VkV2F0Y2hMYW1iZGFBcHBsaWNhdGlvblNpZ25hbHNFeGVjdXRpb25Sb2xlUG9saWN5XG4gICAgLy8gYmVjYXVzZSB0aGF0IG1hbmFnZWQgcG9saWN5IG9ubHkgY292ZXJzIC9hd3MvYXBwbGljYXRpb24tc2lnbmFscy9kYXRhIGxvZyBncm91cFxuICAgIC8vIGFuZCBtaXNzZXMgcGVybWlzc2lvbnMgQURPVCBuZWVkcyAoRGVzY3JpYmVMb2dHcm91cHMsIERlc2NyaWJlTG9nU3RyZWFtcywgUHV0TWV0cmljRGF0YSkuXG4gICAgaWYgKGNvbmZpZy5lbmFibGVPYnNlcnZhYmlsaXR5KSB7XG4gICAgICBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICAgICAgICAnbG9nczpEZXNjcmliZUxvZ1N0cmVhbXMnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgICAgY29uZmlnLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnY2xvdWR3YXRjaDpQdXRNZXRyaWNEYXRhJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBjb250YWluZXJcbiAgICBjb25zdCB7IHJlZ2lvbiwgYWNjb3VudCB9ID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAvLyBVbmxpa2UgTGFtYmRhLCBBZ2VudENvcmUgY29udGFpbmVycyBkb24ndCBnZXQgQVdTX1JFR0lPTiBhdXRvbWF0aWNhbGx5LlxuICAgICAgLy8gYm90bzMgYW5kIG90aGVyIEFXUyBTREtzIG5lZWQgaXQgdG8gbWFrZSBBUEkgY2FsbHMuXG4gICAgICBBV1NfUkVHSU9OOiByZWdpb24sXG4gICAgICBBV1NfREVGQVVMVF9SRUdJT046IHJlZ2lvbixcbiAgICB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5lbnZpcm9ubWVudCkpIHtcbiAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IEFHRU5UX09CU0VSVkFCSUxJVFlfRU5BQkxFRCBhbmQgT1RFTF8qIGVudiB2YXJzIGFyZSBOT1Qgc2V0IGhlcmUuXG4gICAgLy8gRm9yIEFnZW50Q29yZS1ob3N0ZWQgYWdlbnRzLCB0aGUgQURPVCBhdXRvLWluc3RydW1lbnRhdGlvbiB2aWFcbiAgICAvLyBgb3BlbnRlbGVtZXRyeS1pbnN0cnVtZW50YCBpbiB0aGUgRG9ja2VyZmlsZSBDTUQgaGFuZGxlcyB0cmFjZS9zcGFuXG4gICAgLy8gZXhwb3J0IGF1dG9tYXRpY2FsbHkuIFRoZXNlIGVudiB2YXJzIGFyZSBvbmx5IG5lZWRlZCBmb3IgYWdlbnRzXG4gICAgLy8gaG9zdGVkIG91dHNpZGUgb2YgQWdlbnRDb3JlLlxuXG4gICAgLy8gQnVpbGQgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgbmV0d29ya0NvbmZpZ3VyYXRpb246IGFueSA9IHtcbiAgICAgIG5ldHdvcmtNb2RlLFxuICAgIH07XG5cbiAgICAvLyBCdWlsZCBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24gaWYgSldUIGF1dGhvcml6ZXIgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgYXV0aENvbmZpZyA9IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplciA/IHtcbiAgICAgIGN1c3RvbUp3dEF1dGhvcml6ZXI6IHtcbiAgICAgICAgZGlzY292ZXJ5VXJsOiB0aGlzLnByb3BzLmN1c3RvbUp3dEF1dGhvcml6ZXIuZGlzY292ZXJ5VXJsLFxuICAgICAgICBhbGxvd2VkQXVkaWVuY2U6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5hbGxvd2VkQXVkaWVuY2UsXG4gICAgICAgIGFsbG93ZWRDbGllbnRzOiB0aGlzLnByb3BzLmN1c3RvbUp3dEF1dGhvcml6ZXIuYWxsb3dlZENsaWVudHMsXG4gICAgICB9LFxuICAgIH0gOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgQ2ZuUnVudGltZVxuICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgQ2ZuUnVudGltZShzY29wZSwgJ0FnZW50Q29yZVJ1bnRpbWUnLCB7XG4gICAgICBhZ2VudFJ1bnRpbWVOYW1lOiBgJHtjb25maWcuYWdlbnROYW1lLnJlcGxhY2UoLy0vZywgJ18nKX1fcnVudGltZWAsXG4gICAgICBhZ2VudFJ1bnRpbWVBcnRpZmFjdDoge1xuICAgICAgICBjb250YWluZXJDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgY29udGFpbmVyVXJpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJvbGVBcm46IGNvbmZpZy5hZ2VudFJvbGUucm9sZUFybixcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uLFxuICAgICAgYXV0aG9yaXplckNvbmZpZ3VyYXRpb246IGF1dGhDb25maWcsXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogZW52VmFycyxcbiAgICB9KTtcblxuICAgIHJ1bnRpbWUuYXBwbHlSZW1vdmFsUG9saWN5KGNvbmZpZy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAvLyBXaGVuIEpXVCBhdXRoIGlzIGNvbmZpZ3VyZWQsIGFsbG93bGlzdCB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgc28gdGhlXG4gICAgLy8gY29udGFpbmVyIGNhbiBleHRyYWN0IHVzZXIgaWRlbnRpdHkgY2xhaW1zIGZyb20gdGhlIGZvcndhcmRlZCBKV1QgdG9rZW4uXG4gICAgLy8gU2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL3J1bnRpbWUtb2F1dGguaHRtbCNvYXV0aC1wcm9wYWdhdGUtand0LXRva2VuXG4gICAgaWYgKHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplcikge1xuICAgICAgcnVudGltZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbicsIHtcbiAgICAgICAgUmVxdWVzdEhlYWRlckFsbG93bGlzdDogWydBdXRob3JpemF0aW9uJ10sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIFZQQyBtb2RlIGlzIGNvbmZpZ3VyZWQsIHNldCB0aGUgTmV0d29ya01vZGVDb25maWcgd2l0aCBzdWJuZXRzIGFuZFxuICAgIC8vIHNlY3VyaXR5IGdyb3VwcyB2aWEgcHJvcGVydHkgb3ZlcnJpZGUuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgQ0RLIDIuMjE4LjBcbiAgICAvLyBkb2VzIG5vdCB5ZXQgaGF2ZSB0eXBlZCBzdXBwb3J0IGZvciBOZXR3b3JrTW9kZUNvbmZpZyAoYWRkZWQgaW4gMi4yNDAuMCkuXG4gICAgLy8gU2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL2FnZW50Y29yZS12cGMuaHRtbFxuICAgIGlmIChuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuVlBDICYmIHJlc29sdmVkU3VibmV0SWRzICYmIHJlc29sdmVkU2VjdXJpdHlHcm91cElkcykge1xuICAgICAgcnVudGltZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdOZXR3b3JrQ29uZmlndXJhdGlvbi5OZXR3b3JrTW9kZUNvbmZpZycsIHtcbiAgICAgICAgU3VibmV0czogcmVzb2x2ZWRTdWJuZXRJZHMsXG4gICAgICAgIFNlY3VyaXR5R3JvdXBzOiByZXNvbHZlZFNlY3VyaXR5R3JvdXBJZHMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgQ2ZuUnVudGltZSB3YWl0cyBmb3IgdGhlIHJvbGUgYW5kIGl0cyBwb2xpY2llcyB0byBiZSBmdWxseSBjcmVhdGVkL3VwZGF0ZWQuXG4gICAgLy8gV2l0aG91dCB0aGlzLCBDbG91ZEZvcm1hdGlvbiBtYXkgdmFsaWRhdGUgdGhlIHJvbGUgYmVmb3JlOlxuICAgIC8vIC0gVGhlIHRydXN0IHBvbGljeSBpcyB1cGRhdGVkIHRvIGJlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20gKGR1cmluZyBzdGFjayB1cGRhdGVzKVxuICAgIC8vIC0gVGhlIEVDUiBwZXJtaXNzaW9ucyBwb2xpY3kgaXMgYXR0YWNoZWRcbiAgICBydW50aW1lLm5vZGUuYWRkRGVwZW5kZW5jeShjb25maWcuYWdlbnRSb2xlKTtcbiAgICBpZiAoZWNyUG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUpIHtcbiAgICAgIHJ1bnRpbWUubm9kZS5hZGREZXBlbmRlbmN5KGVjclBvbGljeVJlc3VsdC5wb2xpY3lEZXBlbmRhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBJbiBWUEMgbW9kZSwgdGhlIEFnZW50Q29yZSBydW50aW1lIHRha2VzIGxvbmdlciB0byBwcm92aXNpb24gKEVOSSBjcmVhdGlvbixcbiAgICAvLyBzdWJuZXQgYXR0YWNobWVudCkgYnV0IENsb3VkRm9ybWF0aW9uIG1hcmtzIENmblJ1bnRpbWUgYXMgQ1JFQVRFX0NPTVBMRVRFXG4gICAgLy8gYmVmb3JlIHRoZSBydW50aW1lIHJlYWNoZXMgUkVBRFkgc3RhdHVzLiBJbnNlcnQgYSBjdXN0b20gcmVzb3VyY2Ugd2FpdGVyXG4gICAgLy8gdGhhdCBwb2xscyBHZXRBZ2VudFJ1bnRpbWUgdW50aWwgc3RhdHVzIGlzIFJFQURZIGJlZm9yZSBjcmVhdGluZyB0aGUgZW5kcG9pbnQuXG4gICAgbGV0IHJ1bnRpbWVXYWl0ZXI6IEN1c3RvbVJlc291cmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChuZXR3b3JrTW9kZSA9PT0gTmV0d29ya01vZGUuVlBDKSB7XG4gICAgICBjb25zdCB1bmlxdWVTdWZmaXggPSBOYW1lcy51bmlxdWVJZChydW50aW1lKS5zbGljZSgtOCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgY29uc3Qgd2FpdGVyRm4gPSBuZXcgRnVuY3Rpb24oc2NvcGUsICdSdW50aW1lUmVhZHlXYWl0ZXJGbicsIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBgJHtjb25maWcuYWdlbnROYW1lfS1ydC13YWl0ZXItJHt1bmlxdWVTdWZmaXh9YCxcbiAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoW1xuICAgICAgICAgICdjb25zdCBodHRwcyA9IHJlcXVpcmUoXCJodHRwc1wiKTsnLFxuICAgICAgICAgICdjb25zdCB1cmwgPSByZXF1aXJlKFwidXJsXCIpOycsXG4gICAgICAgICAgJ2NvbnN0IHsgQmVkcm9ja0FnZW50Q29yZUNvbnRyb2xDbGllbnQsIEdldEFnZW50UnVudGltZUNvbW1hbmQgfSA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtYmVkcm9jay1hZ2VudGNvcmUtY29udHJvbFwiKTsnLFxuICAgICAgICAgICdmdW5jdGlvbiBzZW5kUmVzcG9uc2UoZXZlbnQsIGNvbnRleHQsIHN0YXR1cywgZGF0YSwgcmVhc29uKSB7JyxcbiAgICAgICAgICAnICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeycsXG4gICAgICAgICAgJyAgICBTdGF0dXM6IHN0YXR1cywnLFxuICAgICAgICAgICcgICAgUmVhc29uOiByZWFzb24gfHwgXCJTZWUgQ2xvdWRXYXRjaCBMb2cgU3RyZWFtOiBcIiArIGNvbnRleHQubG9nU3RyZWFtTmFtZSwnLFxuICAgICAgICAgICcgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuQWdlbnRSdW50aW1lSWQgfHwgZXZlbnQuTG9naWNhbFJlc291cmNlSWQsJyxcbiAgICAgICAgICAnICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsJyxcbiAgICAgICAgICAnICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLCcsXG4gICAgICAgICAgJyAgICBMb2dpY2FsUmVzb3VyY2VJZDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQsJyxcbiAgICAgICAgICAnICAgIERhdGE6IGRhdGEgfHwge30sJyxcbiAgICAgICAgICAnICB9KTsnLFxuICAgICAgICAgICcgIGNvbnN0IHBhcnNlZCA9IHVybC5wYXJzZShldmVudC5SZXNwb25zZVVSTCk7JyxcbiAgICAgICAgICAnICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geycsXG4gICAgICAgICAgJyAgICBjb25zdCByZXEgPSBodHRwcy5yZXF1ZXN0KHsgaG9zdG5hbWU6IHBhcnNlZC5ob3N0bmFtZSwgcGF0aDogcGFyc2VkLnBhdGgsIG1ldGhvZDogXCJQVVRcIiwnLFxuICAgICAgICAgICcgICAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiXCIsIFwiY29udGVudC1sZW5ndGhcIjogYm9keS5sZW5ndGggfSB9LCByZXNvbHZlKTsnLFxuICAgICAgICAgICcgICAgcmVxLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTsnLFxuICAgICAgICAgICcgICAgcmVxLndyaXRlKGJvZHkpOycsXG4gICAgICAgICAgJyAgICByZXEuZW5kKCk7JyxcbiAgICAgICAgICAnICB9KTsnLFxuICAgICAgICAgICd9JyxcbiAgICAgICAgICAnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7JyxcbiAgICAgICAgICAnICB0cnkgeycsXG4gICAgICAgICAgJyAgICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHsgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIlNVQ0NFU1NcIiwge30pOyByZXR1cm47IH0nLFxuICAgICAgICAgICcgICAgY29uc3QgY2xpZW50ID0gbmV3IEJlZHJvY2tBZ2VudENvcmVDb250cm9sQ2xpZW50KCk7JyxcbiAgICAgICAgICAnICAgIGNvbnN0IHJ1bnRpbWVJZCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5BZ2VudFJ1bnRpbWVJZDsnLFxuICAgICAgICAgICcgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MDsgaSsrKSB7JyxcbiAgICAgICAgICAnICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRBZ2VudFJ1bnRpbWVDb21tYW5kKHsgYWdlbnRSdW50aW1lSWQ6IHJ1bnRpbWVJZCB9KSk7JyxcbiAgICAgICAgICAnICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcC5zdGF0dXMgfHwgcmVzcC5hZ2VudFJ1bnRpbWVTdGF0dXM7JyxcbiAgICAgICAgICAnICAgICAgY29uc29sZS5sb2coYEF0dGVtcHQgJHtpICsgMX06IHJ1bnRpbWUgc3RhdHVzID0gJHtzdGF0dXN9YCk7JyxcbiAgICAgICAgICAnICAgICAgaWYgKHN0YXR1cyA9PT0gXCJSRUFEWVwiKSB7IGF3YWl0IHNlbmRSZXNwb25zZShldmVudCwgY29udGV4dCwgXCJTVUNDRVNTXCIsIHsgU3RhdHVzOiBzdGF0dXMgfSk7IHJldHVybjsgfScsXG4gICAgICAgICAgJyAgICAgIGlmIChzdGF0dXMgPT09IFwiRkFJTEVEXCIpIHsgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIkZBSUxFRFwiLCB7fSwgXCJSdW50aW1lIGVudGVyZWQgRkFJTEVEIHN0YXR1c1wiKTsgcmV0dXJuOyB9JyxcbiAgICAgICAgICAnICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDE1MDAwKSk7JyxcbiAgICAgICAgICAnICAgIH0nLFxuICAgICAgICAgICcgICAgYXdhaXQgc2VuZFJlc3BvbnNlKGV2ZW50LCBjb250ZXh0LCBcIkZBSUxFRFwiLCB7fSwgXCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcnVudGltZSBSRUFEWSBzdGF0dXNcIik7JyxcbiAgICAgICAgICAnICB9IGNhdGNoIChlKSB7JyxcbiAgICAgICAgICAnICAgIGNvbnNvbGUuZXJyb3IoZSk7JyxcbiAgICAgICAgICAnICAgIGF3YWl0IHNlbmRSZXNwb25zZShldmVudCwgY29udGV4dCwgXCJGQUlMRURcIiwge30sIGUubWVzc2FnZSk7JyxcbiAgICAgICAgICAnICB9JyxcbiAgICAgICAgICAnfTsnLFxuICAgICAgICBdLmpvaW4oJ1xcbicpKSxcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxMiksXG4gICAgICB9KTtcblxuICAgICAgd2FpdGVyRm4uYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpHZXRBZ2VudFJ1bnRpbWUnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICAgICAgc2VydmljZTogJ2JlZHJvY2stYWdlbnRjb3JlJyxcbiAgICAgICAgICByZXNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgIHJlc291cmNlTmFtZTogJyonLFxuICAgICAgICB9KV0sXG4gICAgICB9KSk7XG5cbiAgICAgIHJ1bnRpbWVXYWl0ZXIgPSBuZXcgQ3VzdG9tUmVzb3VyY2Uoc2NvcGUsICdSdW50aW1lUmVhZHlXYWl0ZXInLCB7XG4gICAgICAgIHNlcnZpY2VUb2tlbjogd2FpdGVyRm4uZnVuY3Rpb25Bcm4sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBBZ2VudFJ1bnRpbWVJZDogcnVudGltZS5yZWYsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJ1bnRpbWVXYWl0ZXIubm9kZS5hZGREZXBlbmRlbmN5KHJ1bnRpbWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lRW5kcG9pbnRcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSB0aGlzLnByb3BzLmVuZHBvaW50TmFtZSB8fCBgJHtjb25maWcuYWdlbnROYW1lLnJlcGxhY2UoLy0vZywgJ18nKX1fZW5kcG9pbnRgO1xuICAgIGNvbnN0IHJ1bnRpbWVFbmRwb2ludCA9IG5ldyBDZm5SdW50aW1lRW5kcG9pbnQoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lRW5kcG9pbnQnLCB7XG4gICAgICBhZ2VudFJ1bnRpbWVJZDogcnVudGltZS5yZWYsXG4gICAgICBhZ2VudFJ1bnRpbWVWZXJzaW9uOiBydW50aW1lLmF0dHJBZ2VudFJ1bnRpbWVWZXJzaW9uLFxuICAgICAgbmFtZTogZW5kcG9pbnROYW1lLFxuICAgICAgLi4uKHRoaXMucHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uICYmIHtcbiAgICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgc2VydmVyUHJvdG9jb2w6IHRoaXMucHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgcnVudGltZUVuZHBvaW50LmFwcGx5UmVtb3ZhbFBvbGljeShjb25maWcucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBlbmRwb2ludCB3YWl0cyBmb3IgdGhlIHJ1bnRpbWUgdG8gYmUgUkVBRFkgaW4gVlBDIG1vZGVcbiAgICBpZiAocnVudGltZVdhaXRlcikge1xuICAgICAgcnVudGltZUVuZHBvaW50Lm5vZGUuYWRkRGVwZW5kZW5jeShydW50aW1lV2FpdGVyKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGZ1bGwgaW52b2NhdGlvbiBVUkwgZm9yIGRpcmVjdCBIVFRQUyBhY2Nlc3MgKHJlcXVpcmVkIGZvciBKV1QgYXV0aCkuXG4gICAgLy8gRm9ybWF0OiBodHRwczovL2JlZHJvY2stYWdlbnRjb3JlLntyZWdpb259LmFtYXpvbmF3cy5jb20vcnVudGltZXMve1VSTC1lbmNvZGVkLUFSTn0vaW52b2NhdGlvbnM/cXVhbGlmaWVyPXtlbmRwb2ludE5hbWV9XG4gICAgY29uc3QgZW5jb2RlZEFybiA9IEZuLmpvaW4oJycsIFtcbiAgICAgICdhcm4lM0Fhd3MlM0FiZWRyb2NrLWFnZW50Y29yZSUzQScsXG4gICAgICByZWdpb24sXG4gICAgICAnJTNBJyxcbiAgICAgIGFjY291bnQsXG4gICAgICAnJTNBcnVudGltZSUyRicsXG4gICAgICBydW50aW1lLmF0dHJBZ2VudFJ1bnRpbWVJZCxcbiAgICBdKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IEZuLmpvaW4oJycsIFtcbiAgICAgICdodHRwczovL2JlZHJvY2stYWdlbnRjb3JlLicsXG4gICAgICByZWdpb24sXG4gICAgICAnLmFtYXpvbmF3cy5jb20vcnVudGltZXMvJyxcbiAgICAgIGVuY29kZWRBcm4sXG4gICAgICAnL2ludm9jYXRpb25zP3F1YWxpZmllcj0nLFxuICAgICAgZW5kcG9pbnROYW1lLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHsgZW5kcG9pbnQsIGNmblJ1bnRpbWU6IHJ1bnRpbWUgfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBFeHRlbmRzIEJhc2VBZ2VudFByb3BzIHdpdGggY29tbXVuaWNhdGlvbiwgc2Vzc2lvbiwgY29udGV4dCwgYW5kIGF1dGhlbnRpY2F0aW9uXG4gKiBzdHJhdGVneSBpbnRlcmZhY2VzIGZvciBidWlsZGluZyByZWFsLXRpbWUgY29udmVyc2F0aW9uYWwgQUkgYWdlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aXZlQWdlbnRQcm9wcyBleHRlbmRzIEJhc2VBZ2VudFByb3BzIHtcbiAgLyoqXG4gICAqIEhvc3RpbmcgYWRhcHRlciBmb3IgZGVwbG95aW5nIHRoZSBhZ2VudCBydW50aW1lLlxuICAgKlxuICAgKiBVc2UgYExhbWJkYUhvc3RpbmdBZGFwdGVyYCBmb3IgTGFtYmRhICsgQVBJIEdhdGV3YXkgKGRlZmF1bHQpIG9yXG4gICAqIGBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXJgIGZvciBBZ2VudENvcmUgUnVudGltZSBob3N0aW5nLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBgY29tbXVuaWNhdGlvbkFkYXB0ZXJgLCBgYXV0aGVudGljYXRvcmAsIGBtZW1vcnlTaXplYCxcbiAgICogYHRpbWVvdXRgLCBgYXJjaGl0ZWN0dXJlYCwgYW5kIGByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zYCBwcm9wc1xuICAgKiBhcmUgaWdub3JlZCAoY29uZmlndXJlIHRoZW0gb24gdGhlIGFkYXB0ZXIgZGlyZWN0bHkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBMYW1iZGFIb3N0aW5nQWRhcHRlclxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGluZ0FkYXB0ZXI/OiBJSG9zdGluZ0FkYXB0ZXI7XG4gIC8qKlxuICAgKiBDb21tdW5pY2F0aW9uIGFkYXB0ZXIgZm9yIGNsaWVudC1hZ2VudCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgd2l0aCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgY29tbXVuaWNhdGlvbkFkYXB0ZXI/OiBJQ29tbXVuaWNhdGlvbkFkYXB0ZXI7XG5cbiAgLyoqXG4gICAqIFNlc3Npb24gc3RvcmUgZm9yIHBlcnNpc3RpbmcgY29udmVyc2F0aW9uIHN0YXRlLlxuICAgKiBTZXQgdG8gdW5kZWZpbmVkIHRvIGRpc2FibGUgc2Vzc2lvbiBwZXJzaXN0ZW5jZSAoc3RhdGVsZXNzIG1vZGUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTM1Nlc3Npb25NYW5hZ2VyIHdpdGggMjQtaG91ciBUVExcbiAgICogQGRlcHJlY2F0ZWQgU2Vzc2lvbiBtYW5hZ2VtZW50IGlzIG5vdyBoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlIGBTM1Nlc3Npb25NYW5hZ2VyYC5cbiAgICogQW4gUzMgYnVja2V0IGlzIGFsd2F5cyBjcmVhdGVkIGFuZCBwYXNzZWQgYXMgYFNFU1NJT05fQlVDS0VUYCBlbnYgdmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblN0b3JlPzogSVNlc3Npb25TdG9yZTtcblxuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBzZXNzaW9uIHN0b3JhZ2UgKHNob3J0aGFuZCBmb3IgUzNTZXNzaW9uTWFuYWdlcikuXG4gICAqIElnbm9yZWQgaWYgc2Vzc2lvblN0b3JlIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uaG91cnMoMjQpXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uVFRMPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFNlc3Npb24gaW5kZXggZm9yIGZhc3QgdXNlciB0byBzZXNzaW9uIGxvb2t1cHMuXG4gICAqIFByb3ZpZGVzIGVmZmljaWVudCBxdWVyeWluZyBvZiBhIHVzZXIncyBzZXNzaW9ucyBmb3IgbGlzdGluZyBhbmQgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHluYW1vREJTZXNzaW9uSW5kZXggKGF1dG8tY3JlYXRlZClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25JbmRleD86IElTZXNzaW9uSW5kZXg7XG5cbiAgLyoqXG4gICAqIENvbnRleHQgc3RyYXRlZ3kgZm9yIGNvbnZlcnNhdGlvbiBoaXN0b3J5IG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIHdpdGggMjAgbWVzc2FnZXNcbiAgICogQGRlcHJlY2F0ZWQgQ29udmVyc2F0aW9uIG1hbmFnZW1lbnQgaXMgbm93IGhhbmRsZWQgYnkgU3RyYW5kcy1uYXRpdmVcbiAgICogYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBpbiB0aGUgUHl0aG9uIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0U3RyYXRlZ3k/OiBJQ29udGV4dFN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0byBrZWVwIGluIGNvbnZlcnNhdGlvbiBoaXN0b3J5LlxuICAgKiBTaG9ydGhhbmQgZm9yIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIHdpbmRvd1NpemUuXG4gICAqIElnbm9yZWQgaWYgY29udGV4dFN0cmF0ZWd5IGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKiBAZGVwcmVjYXRlZCBDb252ZXJzYXRpb24gd2luZG93aW5nIGlzIG5vdyBoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlXG4gICAqIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgaW4gdGhlIFB5dGhvbiBoYW5kbGVyIChkZWZhdWx0OiAyMCkuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlSGlzdG9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIC8qKlxuICAgKiBIVFRQIG1ldGhvZHMgdG8gYWxsb3cgaW4gQ09SUyBwcmVmbGlnaHQgcmVzcG9uc2VzLlxuICAgKiBVc2UgdGhpcyB0byBlbmFibGUgYWRkaXRpb25hbCBtZXRob2RzIChHRVQsIERFTEVURSwgUFVUKSBmb3IgY3VzdG9tIHJvdXRlc1xuICAgKiBhZGRlZCB0byB0aGUgUkVTVCBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnUE9TVCcsICdPUFRJT05TJ11cbiAgICovXG4gIHJlYWRvbmx5IGNvcnNBbGxvd01ldGhvZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIG1lbW9yeSBzaXplIGluIE1CLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDI0XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gdGltZW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygxNSlcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBSZXNlcnZlZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIHJlc2VydmVkIGNvbmN1cnJlbmN5XG4gICAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEludGVyYWN0aXZlIEFnZW50IGZvciByZWFsLXRpbWUgY29udmVyc2F0aW9uYWwgQUkgd2l0aCBTU0Ugc3RyZWFtaW5nLlxuICpcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSBzZXJ2ZXJsZXNzIGluZnJhc3RydWN0dXJlIGZvciBpbnRlcmFjdGl2ZSBBSSBjb252ZXJzYXRpb25zXG4gKiB1c2luZyBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZywgTGFtYmRhIFdlYiBBZGFwdGVyLFxuICogRmFzdEFQSSwgYW5kIHN0YW5kYXJkIFN0cmFuZHMgQWdlbnQuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQgKGZldGNoICsgUmVhZGFibGVTdHJlYW0pXG4gKiAgICAg4oaTIFBPU1QgL2NoYXQgKEF1dGhvcml6YXRpb246IEJlYXJlciBKV1QpXG4gKiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAocmVzcG9uc2VUcmFuc2Zlck1vZGU6IFNUUkVBTSlcbiAqICAgICDihpMgSW52b2tlV2l0aFJlc3BvbnNlU3RyZWFtXG4gKiBMYW1iZGEgKFB5dGhvbiArIExhbWJkYSBXZWIgQWRhcHRlciArIEZhc3RBUEkpXG4gKiAgICAg4oaTIHN0cmFuZHMuQWdlbnQgc3RyZWFtaW5nXG4gKiBBbWF6b24gQmVkcm9jayAoQ2xhdWRlKVxuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqU1NFIFN0cmVhbWluZyoqOiBSZWFsLXRpbWUgdG9rZW4tYnktdG9rZW4gcmVzcG9uc2Ugc3RyZWFtaW5nXG4gKiAtICoqMTUtTWludXRlIFRpbWVvdXQqKjogRXh0ZW5kZWQgdGltZW91dCBmb3IgbG9uZyBjb252ZXJzYXRpb25zXG4gKiAtICoqU2Vzc2lvbiBNYW5hZ2VtZW50Kio6IFMzLWJhc2VkIGNvbnZlcnNhdGlvbiBwZXJzaXN0ZW5jZVxuICogLSAqKkNvbnRleHQgV2luZG93aW5nKio6IFNsaWRpbmcgd2luZG93IGNvbnZlcnNhdGlvbiBoaXN0b3J5XG4gKiAtICoqQ29nbml0byBBdXRoKio6IE5hdGl2ZSBKV1QgdmFsaWRhdGlvbiBvbiBSRVNUIEFQSVxuICogLSAqKlN0cmF0ZWd5IEludGVyZmFjZXMqKjogUGx1Z2dhYmxlIGFkYXB0ZXJzIGZvciBhbGwgY29tcG9uZW50c1xuICogLSAqKk9ic2VydmFiaWxpdHkqKjogTGFtYmRhIFBvd2VydG9vbHMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50IH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdDaGF0QWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ015Q2hhdGJvdCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjoge1xuICogICAgIGJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICogICAgIHN5c3RlbVByb21wdDogc3lzdGVtUHJvbXB0LFxuICogICB9LFxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzIG91dHB1dHNcbiAqIGFnZW50LmFwaUVuZHBvaW50OyAgICAgICAvLyBSRVNUIEFQSSBlbmRwb2ludCBVUkxcbiAqIGFnZW50LnNlc3Npb25CdWNrZXQ7ICAgICAvLyBTMyBzZXNzaW9uIGJ1Y2tldFxuICogYWdlbnQuYXV0aGVudGljYXRvcjsgICAgIC8vIENvZ25pdG8gYXV0aGVudGljYXRvciAoZm9yIFVzZXIgUG9vbCBpbmZvKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmFjdGl2ZUFnZW50IGV4dGVuZHMgQmFzZUFnZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGFnZW50RnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBhZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblN0b3JlPzogSVNlc3Npb25TdG9yZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHRTdHJhdGVneT86IElDb250ZXh0U3RyYXRlZ3k7XG4gIHB1YmxpYyByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG4gIHB1YmxpYyByZWFkb25seSBhcGlFbmRwb2ludDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG4gIHB1YmxpYyByZWFkb25seSBjZm5SdW50aW1lPzogQ2ZuUnVudGltZTtcbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9uIGluZGV4IGZvciBmYXN0IHVzZXIgdG8gc2Vzc2lvbiBsb29rdXBzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25JbmRleD86IElTZXNzaW9uSW5kZXg7XG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgR2F0ZXdheSAob25seSBhdmFpbGFibGUgd2hlbiB1c2luZyBMYW1iZGFIb3N0aW5nQWRhcHRlciB3aXRoIFN0cmVhbWluZ0h0dHBBZGFwdGVyKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0QXBpPzogUmVzdEFwaTtcbiAgLyoqXG4gICAqIFRoZSBDb2duaXRvIFVzZXIgUG9vbHMgYXV0aG9yaXplciAob25seSBhdmFpbGFibGUgd2hlbiB1c2luZyBMYW1iZGFIb3N0aW5nQWRhcHRlciB3aXRoIENvZ25pdG9BdXRoZW50aWNhdG9yKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb2duaXRvQXV0aG9yaXplcj86IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbnRlcmFjdGl2ZUFnZW50UHJvcHMpIHtcbiAgICAvLyBEZXRlcm1pbmUgaG9zdGluZyBhZGFwdGVyIEJFRk9SRSBzdXBlcigpIHNvIHdlIGNhbiBwYXNzIGl0cyB0cnVzdCBwcmluY2lwYWxcbiAgICBjb25zdCBob3N0aW5nQWRhcHRlciA9IHByb3BzLmhvc3RpbmdBZGFwdGVyIHx8IG5ldyBMYW1iZGFIb3N0aW5nQWRhcHRlcih7XG4gICAgICBjb21tdW5pY2F0aW9uQWRhcHRlcjogcHJvcHMuY29tbXVuaWNhdGlvbkFkYXB0ZXIsXG4gICAgICBhdXRoZW50aWNhdG9yOiBwcm9wcy5hdXRoZW50aWNhdG9yLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICBhcmNoaXRlY3R1cmU6IHByb3BzLmFyY2hpdGVjdHVyZSxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IHByb3BzLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgfSk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHsgLi4ucHJvcHMsIHNlcnZpY2VQcmluY2lwYWw6IGhvc3RpbmdBZGFwdGVyLnNlcnZpY2VQcmluY2lwYWwgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBwcm9wc1xuICAgIHRoaXMudmFsaWRhdGVQcm9wcyhwcm9wcyk7XG5cbiAgICBjb25zdCBtb2RlbElkID0gQmVkcm9ja01vZGVsVXRpbHMuZGVyaXZlQWN0dWFsTW9kZWxJZCh0aGlzLmJlZHJvY2tNb2RlbCk7XG4gICAgY29uc3QgbWV0cmljTmFtZXNwYWNlID0gcHJvcHMubWV0cmljTmFtZXNwYWNlIHx8IERlZmF1bHRPYnNlcnZhYmlsaXR5Q29uZmlnLkRFRkFVTFRfTUVUUklDX05BTUVTUEFDRTtcbiAgICBjb25zdCBtZXRyaWNTZXJ2aWNlTmFtZSA9IHByb3BzLm1ldHJpY1NlcnZpY2VOYW1lIHx8IERlZmF1bHRBZ2VudENvbmZpZy5ERUZBVUxUX09CU0VSVkFCSUxJVFlfTUVUUklDX1NWQ19OQU1FO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIHN0b3JlIChTMyBidWNrZXQgZm9yIFN0cmFuZHMtbmF0aXZlIFMzU2Vzc2lvbk1hbmFnZXIpXG4gICAgaWYgKHByb3BzLnNlc3Npb25TdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlc3Npb25TdG9yZSA9IHByb3BzLnNlc3Npb25TdG9yZTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnNlc3Npb25TdG9yZSA9PT0gdW5kZWZpbmVkICYmIHByb3BzLnNlc3Npb25CdWNrZXQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICAgICAgICBidWNrZXQ6IHByb3BzLnNlc3Npb25CdWNrZXQsXG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdDogY3JlYXRlIFMzU2Vzc2lvbk1hbmFnZXIgKGJ1Y2tldCB1c2VkIGJ5IFN0cmFuZHMtbmF0aXZlIHNlc3Npb24gbWFuYWdlcilcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICAgICAgICBzZXNzaW9uVFRMOiBwcm9wcy5zZXNzaW9uVFRMLFxuICAgICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2Vzc2lvbkJ1Y2tldCA9IHRoaXMuc2Vzc2lvblN0b3JlPy5zZXNzaW9uQnVja2V0O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIGluZGV4IChEeW5hbW9EQiB0YWJsZSBmb3IgdXNlcuKGknNlc3Npb24gbG9va3VwcylcbiAgICBpZiAocHJvcHMuc2Vzc2lvbkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbkluZGV4ID0gcHJvcHMuc2Vzc2lvbkluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBjcmVhdGUgRHluYW1vREJTZXNzaW9uSW5kZXhcbiAgICAgIHRoaXMuc2Vzc2lvbkluZGV4ID0gbmV3IER5bmFtb0RCU2Vzc2lvbkluZGV4KHRoaXMsICdTZXNzaW9uSW5kZXgnLCB7XG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb250ZXh0IHN0cmF0ZWd5IGlzIGRlcHJlY2F0ZWQg4oCUIFN0cmFuZHMtbmF0aXZlIGNvbnZlcnNhdGlvbiBtYW5hZ2VyIGhhbmRsZXMgdGhpcy5cbiAgICAvLyBLZWVwIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkbyBub3QgdXNlIGVudiB2YXJzLlxuICAgIGlmIChwcm9wcy5jb250ZXh0U3RyYXRlZ3kpIHtcbiAgICAgIHRoaXMuY29udGV4dFN0cmF0ZWd5ID0gcHJvcHMuY29udGV4dFN0cmF0ZWd5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHRTdHJhdGVneSA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7XG4gICAgICAgIHdpbmRvd1NpemU6IHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBiYXNlIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIE1PREVMX0lEOiBtb2RlbElkLFxuICAgICAgU1lTVEVNX1BST01QVF9TM19CVUNLRVRfTkFNRTogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM0J1Y2tldE5hbWUsXG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0tFWTogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM09iamVjdEtleSxcbiAgICAgIFRPT0xTX0NPTkZJRzogSlNPTi5zdHJpbmdpZnkodGhpcy5hZ2VudFRvb2xzTG9jYXRpb25EZWZpbml0aW9ucyksXG4gICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgbWV0cmljTmFtZXNwYWNlLFxuICAgICAgICBtZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICAgJ0RFQlVHJyxcbiAgICAgICksXG4gICAgfTtcblxuICAgIC8vIEFkZCBzZXNzaW9uIGJ1Y2tldCBlbnYgdmFyIGlmIHNlc3Npb24gc3RvcmUgZXhpc3RzXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgZW52LlNFU1NJT05fQlVDS0VUID0gdGhpcy5zZXNzaW9uQnVja2V0LmJ1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNlc3Npb24gaW5kZXggZW52IHZhcnMgaWYgc2Vzc2lvbiBpbmRleCBleGlzdHNcbiAgICBpZiAodGhpcy5zZXNzaW9uSW5kZXgpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW52LCB0aGlzLnNlc3Npb25JbmRleC5lbnZpcm9ubWVudFZhcmlhYmxlcygpKTtcbiAgICB9XG5cbiAgICAvLyBBZGQga25vd2xlZGdlIGJhc2UgY29uZmlndXJhdGlvbiBpZiBLQnMgYXJlIGNvbmZpZ3VyZWRcbiAgICBpZiAodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnYuS05PV0xFREdFX0JBU0VTX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpO1xuICAgICAgZW52LktOT1dMRURHRV9CQVNFX1NZU1RFTV9QUk9NUFRfQURESVRJT04gPSBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbih0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKTtcbiAgICB9XG5cbiAgICAvLyBEZXBsb3kgdmlhIGhvc3RpbmcgYWRhcHRlclxuICAgIGNvbnN0IGhvc3RpbmdSZXN1bHQgPSBob3N0aW5nQWRhcHRlci5kZXBsb3koe1xuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBhZ2VudE5hbWU6IHByb3BzLmFnZW50TmFtZSxcbiAgICAgIGFnZW50Um9sZTogdGhpcy5hZ2VudFJvbGUsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgbmV0d29yazogcHJvcHMubmV0d29yayxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBwcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgbGFtYmRhTGF5ZXJzOiBwcm9wcy5hZ2VudERlZmluaXRpb24ubGFtYmRhTGF5ZXJzLFxuICAgICAga25vd2xlZGdlQmFzZUxheWVyczogdGhpcy5rbm93bGVkZ2VCYXNlTGF5ZXJzLFxuICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgIHRvb2xzQ29uZmlnOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIHN5c3RlbVByb21wdEJ1Y2tldDogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM0J1Y2tldE5hbWUsXG4gICAgICBzeXN0ZW1Qcm9tcHRLZXk6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuczNPYmplY3RLZXksXG4gICAgICBrbm93bGVkZ2VCYXNlQ29uZmlnczogdGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwID8gSlNPTi5zdHJpbmdpZnkodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncykgOiB1bmRlZmluZWQsXG4gICAgICBrbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb246IHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uKHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICB9KTtcblxuICAgIHRoaXMuYXBpRW5kcG9pbnQgPSBob3N0aW5nUmVzdWx0LmVuZHBvaW50O1xuICAgIHRoaXMuYWdlbnRGdW5jdGlvbiA9IGhvc3RpbmdSZXN1bHQuYWdlbnRGdW5jdGlvbjtcbiAgICB0aGlzLmNmblJ1bnRpbWUgPSBob3N0aW5nUmVzdWx0LmNmblJ1bnRpbWU7XG5cbiAgICAvLyBTZXQgYWRhcHRlciBhbmQgYXV0aGVudGljYXRvciByZWZlcmVuY2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgaWYgKGhvc3RpbmdBZGFwdGVyIGluc3RhbmNlb2YgTGFtYmRhSG9zdGluZ0FkYXB0ZXIpIHtcbiAgICAgIHRoaXMuYWRhcHRlciA9IGhvc3RpbmdBZGFwdGVyLmNvbW11bmljYXRpb25BZGFwdGVyO1xuICAgICAgdGhpcy5hdXRoZW50aWNhdG9yID0gaG9zdGluZ0FkYXB0ZXIuYXV0aGVudGljYXRvcjtcblxuICAgICAgLy8gRXhwb3NlIFJFU1QgQVBJIGFuZCBDb2duaXRvIGF1dGhvcml6ZXIgZnJvbSB0aGUgY29tbXVuaWNhdGlvbiBhZGFwdGVyXG4gICAgICBpZiAodGhpcy5hZGFwdGVyIGluc3RhbmNlb2YgU3RyZWFtaW5nSHR0cEFkYXB0ZXIpIHtcbiAgICAgICAgdGhpcy5yZXN0QXBpID0gdGhpcy5hZGFwdGVyLnJlc3RBcGk7XG4gICAgICAgIHRoaXMuY29nbml0b0F1dGhvcml6ZXIgPSB0aGlzLmFkYXB0ZXIuY29nbml0b0F1dGhvcml6ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgc3lzdGVtIHByb21wdCByZWFkIGFjY2Vzc1xuICAgIHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuZ3JhbnRSZWFkKHRoaXMuYWdlbnRSb2xlKTtcblxuICAgIC8vIEdyYW50IHNlc3Npb24gc3RvcmUgYWNjZXNzXG4gICAgaWYgKHRoaXMuc2Vzc2lvblN0b3JlKSB7XG4gICAgICBpZiAodGhpcy5hZ2VudEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0b3JlLmdyYW50UmVhZFdyaXRlKHRoaXMuYWdlbnRGdW5jdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgICAvLyBGb3IgQWdlbnRDb3JlIGhvc3RpbmcsIGdyYW50IHRoZSBhZ2VudCByb2xlIGRpcmVjdCBTMyBhY2Nlc3NcbiAgICAgICAgdGhpcy5zZXNzaW9uQnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuYWdlbnRSb2xlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcmFudCBzZXNzaW9uIGluZGV4IGFjY2Vzc1xuICAgIGlmICh0aGlzLnNlc3Npb25JbmRleCkge1xuICAgICAgdGhpcy5zZXNzaW9uSW5kZXguZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudFJvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgSW50ZXJhY3RpdmVBZ2VudCBwcm9wcy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogSW50ZXJhY3RpdmVBZ2VudFByb3BzKTogdm9pZCB7XG4gICAgaWYgKCFwcm9wcy5hZ2VudE5hbWUgfHwgcHJvcHMuYWdlbnROYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWdlbnROYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tZW1vcnlTaXplICE9PSB1bmRlZmluZWQgJiYgKHByb3BzLm1lbW9yeVNpemUgPCAxMjggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZW1vcnlTaXplIG11c3QgYmUgYmV0d2VlbiAxMjggYW5kIDEwMjQwIE1CJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpO1xuICAgICAgaWYgKHRpbWVvdXRTZWNvbmRzIDwgMSB8fCB0aW1lb3V0U2Vjb25kcyA+IDkwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA8IDEgfHwgcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA+IDEwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2VIaXN0b3J5TGltaXQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==