cdktn 0.26.0-pre.20 → 0.26.0-pre.21

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 (114) hide show
  1. package/.jsii +1200 -1116
  2. package/eslint.config.mjs +18 -7
  3. package/jest.config.js +0 -1
  4. package/lib/_tokens.d.ts +7 -0
  5. package/lib/_tokens.js +8 -2
  6. package/lib/annotations.js +1 -1
  7. package/lib/app.js +8 -4
  8. package/lib/aspect.js +1 -1
  9. package/lib/asset-hash.js +1 -1
  10. package/lib/asset-staging.js +1 -1
  11. package/lib/assets.js +4 -4
  12. package/lib/backends/azurerm-backend.d.ts +6 -0
  13. package/lib/backends/azurerm-backend.js +9 -5
  14. package/lib/backends/cloud-backend.js +4 -4
  15. package/lib/backends/consul-backend.d.ts +6 -0
  16. package/lib/backends/consul-backend.js +9 -5
  17. package/lib/backends/cos-backend.d.ts +6 -0
  18. package/lib/backends/cos-backend.js +9 -5
  19. package/lib/backends/gcs-backend.d.ts +6 -0
  20. package/lib/backends/gcs-backend.js +9 -5
  21. package/lib/backends/http-backend.d.ts +6 -0
  22. package/lib/backends/http-backend.js +9 -5
  23. package/lib/backends/local-backend.d.ts +6 -0
  24. package/lib/backends/local-backend.js +9 -5
  25. package/lib/backends/oss-backend.d.ts +6 -0
  26. package/lib/backends/oss-backend.js +9 -5
  27. package/lib/backends/pg-backend.d.ts +6 -0
  28. package/lib/backends/pg-backend.js +9 -5
  29. package/lib/backends/remote-backend.d.ts +12 -0
  30. package/lib/backends/remote-backend.js +17 -9
  31. package/lib/backends/s3-backend.d.ts +6 -0
  32. package/lib/backends/s3-backend.js +9 -5
  33. package/lib/backends/swift-backend.js +2 -2
  34. package/lib/complex-computed-list.d.ts +85 -0
  35. package/lib/complex-computed-list.js +112 -54
  36. package/lib/functions/helpers.d.ts +72 -0
  37. package/lib/functions/helpers.js +73 -14
  38. package/lib/functions/provider-function.js +1 -1
  39. package/lib/functions/terraform-functions.generated.d.ts +3 -0
  40. package/lib/functions/terraform-functions.generated.js +5 -3
  41. package/lib/hcl/render.js +30 -6
  42. package/lib/ignore-strategy.js +1 -1
  43. package/lib/importable-resource.js +1 -1
  44. package/lib/manifest.d.ts +4 -0
  45. package/lib/manifest.js +6 -3
  46. package/lib/private/unique.js +11 -3
  47. package/lib/resource.js +1 -1
  48. package/lib/runtime.d.ts +6 -0
  49. package/lib/runtime.js +12 -3
  50. package/lib/synthesize/required-version.d.ts +32 -0
  51. package/lib/synthesize/required-version.js +205 -0
  52. package/lib/synthesize/synthesizer.d.ts +13 -0
  53. package/lib/synthesize/synthesizer.js +42 -8
  54. package/lib/terraform-asset.d.ts +4 -0
  55. package/lib/terraform-asset.js +6 -3
  56. package/lib/terraform-backend.d.ts +3 -0
  57. package/lib/terraform-backend.js +5 -3
  58. package/lib/terraform-conditions.js +1 -2
  59. package/lib/terraform-count.js +1 -1
  60. package/lib/terraform-data-resource.js +1 -1
  61. package/lib/terraform-data-source.d.ts +4 -0
  62. package/lib/terraform-data-source.js +8 -6
  63. package/lib/terraform-dependable.js +1 -1
  64. package/lib/terraform-dynamic-block.d.ts +4 -0
  65. package/lib/terraform-dynamic-block.js +5 -2
  66. package/lib/terraform-element.d.ts +4 -0
  67. package/lib/terraform-element.js +6 -3
  68. package/lib/terraform-ephemeral-resource.d.ts +4 -0
  69. package/lib/terraform-ephemeral-resource.js +8 -6
  70. package/lib/terraform-functions.d.ts +4 -0
  71. package/lib/terraform-functions.js +6 -3
  72. package/lib/terraform-hcl-module.d.ts +4 -0
  73. package/lib/terraform-hcl-module.js +6 -3
  74. package/lib/terraform-iterator.d.ts +19 -0
  75. package/lib/terraform-iterator.js +25 -11
  76. package/lib/terraform-local.d.ts +4 -0
  77. package/lib/terraform-local.js +6 -3
  78. package/lib/terraform-module.js +1 -1
  79. package/lib/terraform-operators.js +1 -1
  80. package/lib/terraform-output.d.ts +4 -0
  81. package/lib/terraform-output.js +6 -3
  82. package/lib/terraform-provider.d.ts +4 -0
  83. package/lib/terraform-provider.js +6 -3
  84. package/lib/terraform-provisioner.js +1 -1
  85. package/lib/terraform-remote-state.d.ts +3 -0
  86. package/lib/terraform-remote-state.js +5 -3
  87. package/lib/terraform-resource-targets.js +1 -1
  88. package/lib/terraform-resource.d.ts +5 -1
  89. package/lib/terraform-resource.js +16 -9
  90. package/lib/terraform-stack.d.ts +4 -0
  91. package/lib/terraform-stack.js +28 -9
  92. package/lib/terraform-variable.d.ts +7 -0
  93. package/lib/terraform-variable.js +16 -7
  94. package/lib/testing/adapters/jest.d.ts +3 -0
  95. package/lib/testing/adapters/jest.js +10 -1
  96. package/lib/testing/index.js +14 -4
  97. package/lib/testing/matchers.js +61 -19
  98. package/lib/tfExpression.d.ts +48 -0
  99. package/lib/tfExpression.js +53 -15
  100. package/lib/tokens/lazy.d.ts +4 -0
  101. package/lib/tokens/lazy.js +21 -8
  102. package/lib/tokens/private/dependency.js +2 -6
  103. package/lib/tokens/private/resolve.js +3 -3
  104. package/lib/tokens/private/stack-trace.d.ts +1 -1
  105. package/lib/tokens/private/stack-trace.js +1 -2
  106. package/lib/tokens/resolvable.js +2 -2
  107. package/lib/tokens/string-fragments.js +4 -4
  108. package/lib/tokens/token.js +2 -2
  109. package/lib/upgrade-id-aspect.js +1 -1
  110. package/lib/util.d.ts +0 -1
  111. package/lib/util.js +4 -4
  112. package/lib/validations/target-versions.d.ts +12 -0
  113. package/lib/validations/target-versions.js +40 -1
  114. package/package.json +112 -109
@@ -2,6 +2,9 @@ import { IResolvable, IResolveContext } from "./tokens/resolvable";
2
2
  import { Intrinsic } from "./tokens/private/intrinsic";
3
3
  import { TerraformStack } from "./terraform-stack";
4
4
  import { ITerraformDependable } from "./terraform-dependable";
5
+ /**
6
+ * Base class for Terraform expression tokens, with helpers that render resolved arguments as Terraform syntax.
7
+ */
5
8
  declare class TFExpression extends Intrinsic implements IResolvable {
6
9
  protected resolveExpressionPart(context: IResolveContext, arg: any): string;
7
10
  protected resolveArg(context: IResolveContext, arg: any): string;
@@ -14,7 +17,16 @@ declare class TFExpression extends Intrinsic implements IResolvable {
14
17
  protected escapeString(str: string): string;
15
18
  private resolveString;
16
19
  }
20
+ /**
21
+ * Wraps a string so it is rendered as an escaped Terraform string literal
22
+ * @param str The string to escape
23
+ * @returns A resolvable that renders the escaped string
24
+ */
17
25
  export declare function rawString(str: string): IResolvable;
26
+ /**
27
+ * Expression referencing a Terraform identifier. When resolved in a stack other than its origin stack, it is
28
+ * rendered as a cross-stack reference instead.
29
+ */
18
30
  declare class Reference extends TFExpression {
19
31
  private identifier;
20
32
  private originStack?;
@@ -28,19 +40,37 @@ declare class Reference extends TFExpression {
28
40
  constructor(identifier: string, originStack?: TerraformStack | undefined);
29
41
  resolve(context: IResolveContext): string;
30
42
  }
43
+ /**
44
+ * Creates a reference to a Terraform identifier, e.g. `aws_instance.web.id`
45
+ * @param identifier The Terraform identifier to reference
46
+ * @param stack The stack the referenced identifier belongs to, used to detect cross-stack references
47
+ * @returns A resolvable that renders the reference
48
+ */
31
49
  export declare function ref(identifier: string, stack?: TerraformStack): IResolvable;
32
50
  /**
33
51
  * marks the argument as being used in a terraform expression
34
52
  * @deprecated
35
53
  */
36
54
  export declare function insideTfExpression(arg: any): any;
55
+ /**
56
+ * Expression accessing properties, indices or splats (`[*]`) on a target, e.g. `target.prop[0]`.
57
+ */
37
58
  declare class PropertyAccess extends TFExpression {
38
59
  private target;
39
60
  private args;
40
61
  constructor(target: Expression, args: Expression[]);
41
62
  resolve(context: IResolveContext): string;
42
63
  }
64
+ /**
65
+ * Creates a property access expression, e.g. `target.prop[0]`
66
+ * @param target The expression to access properties on
67
+ * @param args The property names, indices or `*` (splat) to access, in order
68
+ * @returns A resolvable that renders the property access
69
+ */
43
70
  export declare function propertyAccess(target: Expression, args: Expression[]): IResolvable;
71
+ /**
72
+ * Expression rendering a Terraform conditional, e.g. `condition ? trueValue : falseValue`.
73
+ */
44
74
  declare class ConditionalExpression extends TFExpression {
45
75
  private condition;
46
76
  private trueValue;
@@ -64,12 +94,22 @@ export declare class OperatorExpression extends TFExpression {
64
94
  constructor(operator: Operator, left: Expression, right?: Expression | undefined);
65
95
  resolve(context: IResolveContext): string;
66
96
  }
97
+ /**
98
+ * Expression rendering a Terraform function call, e.g. `name(arg1, arg2)`. Records the function's usage on the
99
+ * stack it is resolved in.
100
+ */
67
101
  declare class FunctionCall extends TFExpression {
68
102
  private name;
69
103
  private args;
70
104
  constructor(name: string, args: Expression[]);
71
105
  resolve(context: IResolveContext): string;
72
106
  }
107
+ /**
108
+ * Creates a Terraform function call expression
109
+ * @param name The function name, e.g. `join` or `provider::<provider>::<function>`
110
+ * @param args The arguments passed to the function
111
+ * @returns A resolvable that renders the function call
112
+ */
73
113
  export declare function call(name: string, args: Expression[]): IResolvable;
74
114
  export declare const FOR_EXPRESSION_KEY: IResolvable;
75
115
  export declare const FOR_EXPRESSION_VALUE: IResolvable;
@@ -101,11 +141,19 @@ declare class ForExpression extends TFExpression {
101
141
  * Currently does not support filtering elements (if clause) or grouping results
102
142
  */
103
143
  export declare function forExpression(input: Expression, valueExpression: Expression, keyExpression?: Expression): IResolvable;
144
+ /**
145
+ * Expression rendering the fully qualified name of a dependable, for use in `depends_on`.
146
+ */
104
147
  declare class Dependable extends TFExpression {
105
148
  private dependable;
106
149
  constructor(dependable: ITerraformDependable);
107
150
  resolve(context: IResolveContext): string;
108
151
  }
152
+ /**
153
+ * Creates a token referencing a dependable by its fully qualified name
154
+ * @param dependable The dependable to reference
155
+ * @returns A string token that resolves to the dependable's fully qualified name
156
+ */
109
157
  export declare function dependable(dependable: ITerraformDependable): string;
110
158
  export type Expression = Reference | FunctionCall | PropertyAccess | ConditionalExpression | OperatorExpression | Dependable | ForExpression | string | string[] | number | boolean | IResolvable | {
111
159
  [key: string]: any;
@@ -16,7 +16,9 @@ const terraform_stack_1 = require("./terraform-stack");
16
16
  const constructs_1 = require("constructs");
17
17
  const quoted_string_key_1 = require("./hcl/quoted-string-key");
18
18
  const TERRAFORM_IDENTIFIER_REGEX = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
19
- // eslint-disable-next-line jsdoc/require-jsdoc
19
+ /**
20
+ * Base class for Terraform expression tokens, with helpers that render resolved arguments as Terraform syntax.
21
+ */
20
22
  class TFExpression extends intrinsic_1.Intrinsic {
21
23
  resolveExpressionPart(context, arg) {
22
24
  const resolvedArg = context.resolve(arg);
@@ -213,8 +215,9 @@ class TFExpression extends intrinsic_1.Intrinsic {
213
215
  : `"${joinResult}"`;
214
216
  }
215
217
  }
216
- // A string that represents an input value to be escaped
217
- // eslint-disable-next-line jsdoc/require-jsdoc
218
+ /**
219
+ * Expression that renders a literal string with newlines, `${` sequences and double quotes escaped.
220
+ */
218
221
  class RawString extends TFExpression {
219
222
  str;
220
223
  constructor(str) {
@@ -223,17 +226,24 @@ class RawString extends TFExpression {
223
226
  }
224
227
  resolve(context) {
225
228
  const qts = context.suppressBraces ? `"` : ``;
226
- return `${qts}${this.escapeString(this.str).replace(/\"/g, '\\"')}${qts}`; // eslint-disable-line no-useless-escape
229
+ return `${qts}${this.escapeString(this.str).replace(/"/g, '\\"')}${qts}`;
227
230
  }
228
231
  toString() {
229
232
  return this.str;
230
233
  }
231
234
  }
232
- // eslint-disable-next-line jsdoc/require-jsdoc
235
+ /**
236
+ * Wraps a string so it is rendered as an escaped Terraform string literal
237
+ * @param str The string to escape
238
+ * @returns A resolvable that renders the escaped string
239
+ */
233
240
  function rawString(str) {
234
241
  return new RawString(str);
235
242
  }
236
- // eslint-disable-next-line jsdoc/require-jsdoc
243
+ /**
244
+ * Expression referencing a Terraform identifier. When resolved in a stack other than its origin stack, it is
245
+ * rendered as a cross-stack reference instead.
246
+ */
237
247
  class Reference extends TFExpression {
238
248
  identifier;
239
249
  originStack;
@@ -272,7 +282,12 @@ class Reference extends TFExpression {
272
282
  return suppressBraces ? this.identifier : `\${${this.identifier}}`;
273
283
  }
274
284
  }
275
- // eslint-disable-next-line jsdoc/require-jsdoc
285
+ /**
286
+ * Creates a reference to a Terraform identifier, e.g. `aws_instance.web.id`
287
+ * @param identifier The Terraform identifier to reference
288
+ * @param stack The stack the referenced identifier belongs to, used to detect cross-stack references
289
+ * @returns A resolvable that renders the reference
290
+ */
276
291
  function ref(identifier, stack) {
277
292
  return new Reference(identifier, stack);
278
293
  }
@@ -283,7 +298,9 @@ function ref(identifier, stack) {
283
298
  function insideTfExpression(arg) {
284
299
  return arg;
285
300
  }
286
- // eslint-disable-next-line jsdoc/require-jsdoc
301
+ /**
302
+ * Expression accessing properties, indices or splats (`[*]`) on a target, e.g. `target.prop[0]`.
303
+ */
287
304
  class PropertyAccess extends TFExpression {
288
305
  target;
289
306
  args;
@@ -316,11 +333,18 @@ class PropertyAccess extends TFExpression {
316
333
  return suppressBraces ? expr : `\${${expr}}`;
317
334
  }
318
335
  }
319
- // eslint-disable-next-line jsdoc/require-jsdoc
336
+ /**
337
+ * Creates a property access expression, e.g. `target.prop[0]`
338
+ * @param target The expression to access properties on
339
+ * @param args The property names, indices or `*` (splat) to access, in order
340
+ * @returns A resolvable that renders the property access
341
+ */
320
342
  function propertyAccess(target, args) {
321
343
  return new PropertyAccess(target, args);
322
344
  }
323
- // eslint-disable-next-line jsdoc/require-jsdoc
345
+ /**
346
+ * Expression rendering a Terraform conditional, e.g. `condition ? trueValue : falseValue`.
347
+ */
324
348
  class ConditionalExpression extends TFExpression {
325
349
  condition;
326
350
  trueValue;
@@ -393,7 +417,10 @@ class OperatorExpression extends TFExpression {
393
417
  }
394
418
  }
395
419
  exports.OperatorExpression = OperatorExpression;
396
- // eslint-disable-next-line jsdoc/require-jsdoc
420
+ /**
421
+ * Expression rendering a Terraform function call, e.g. `name(arg1, arg2)`. Records the function's usage on the
422
+ * stack it is resolved in.
423
+ */
397
424
  class FunctionCall extends TFExpression {
398
425
  name;
399
426
  args;
@@ -455,7 +482,12 @@ class FunctionCall extends TFExpression {
455
482
  return suppressBraces ? expr : `\${${expr}}`;
456
483
  }
457
484
  }
458
- // eslint-disable-next-line jsdoc/require-jsdoc
485
+ /**
486
+ * Creates a Terraform function call expression
487
+ * @param name The function name, e.g. `join` or `provider::<provider>::<function>`
488
+ * @param args The arguments passed to the function
489
+ * @returns A resolvable that renders the function call
490
+ */
459
491
  function call(name, args) {
460
492
  return new FunctionCall(name, args);
461
493
  }
@@ -513,7 +545,9 @@ class ForExpression extends TFExpression {
513
545
  function forExpression(input, valueExpression, keyExpression) {
514
546
  return new ForExpression(input, valueExpression, keyExpression);
515
547
  }
516
- // eslint-disable-next-line jsdoc/require-jsdoc
548
+ /**
549
+ * Expression rendering the fully qualified name of a dependable, for use in `depends_on`.
550
+ */
517
551
  class Dependable extends TFExpression {
518
552
  dependable;
519
553
  constructor(dependable) {
@@ -525,8 +559,12 @@ class Dependable extends TFExpression {
525
559
  return this.dependable.fqn;
526
560
  }
527
561
  }
528
- // eslint-disable-next-line jsdoc/require-jsdoc
562
+ /**
563
+ * Creates a token referencing a dependable by its fully qualified name
564
+ * @param dependable The dependable to reference
565
+ * @returns A string token that resolves to the dependable's fully qualified name
566
+ */
529
567
  function dependable(dependable) {
530
568
  return token_1.Token.asString(new Dependable(dependable));
531
569
  }
532
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZFeHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RmRXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxUkEsOEJBRUM7QUFtREQsa0JBRUM7QUFNRCxnREFFQztBQStDRCx3Q0FFQztBQTZCRCxrQ0FNQztBQXNJRCxvQkFFQztBQXdERCxzQ0FVQztBQWVELGdDQUVDO0FBaG9CRCwwREFBdUQ7QUFDdkQsMENBQXFEO0FBQ3JELCtCQUE0QjtBQUM1Qix1REFBbUQ7QUFFbkQsMkNBQXVDO0FBQ3ZDLCtEQUdpQztBQUVqQyxNQUFNLDBCQUEwQixHQUFHLDBCQUEwQixDQUFDO0FBRTlELCtDQUErQztBQUMvQyxNQUFNLFlBQWEsU0FBUSxxQkFBUztJQUN4QixxQkFBcUIsQ0FBQyxPQUF3QixFQUFFLEdBQVE7UUFDaEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLG9CQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSx1RUFBdUU7WUFDdkUsNkRBQTZEO1lBQzdELCtEQUErRDtZQUMvRCxnRUFBZ0U7WUFDaEUsb0VBQW9FO1lBQ3BFLG1FQUFtRTtZQUNuRSxzRUFBc0U7WUFDdEUsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUNELHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUsaUVBQWlFO1lBQ2pFLHNFQUFzRTtZQUN0RSxxRUFBcUU7WUFDckUsb0VBQW9FO1lBQ3BFLHlEQUF5RDtZQUN6RCxzRUFBc0U7WUFDdEUsa0VBQWtFO1lBQ2xFLHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUscUVBQXFFO1lBQ3JFLDhEQUE4RDtZQUM5RCxpRUFBaUU7WUFDakUscUVBQXFFO1lBQ3JFLHdEQUF3RDtZQUN4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxJQUFJLFdBQVc7cUJBQ25CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUM7WUFDRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7cUJBQ2hDLEdBQUcsQ0FDRixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQzNGO3FCQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUM7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLFdBQVc7aUJBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVELHlFQUF5RTtZQUN6RSxtRUFBbUU7WUFDbkUscUVBQXFFO1lBQ3JFLCtEQUErRDtZQUMvRCxtRUFBbUU7WUFDbkUseUVBQXlFO1lBQ3pFLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsYUFBYTtZQUNiLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztpQkFDeEIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztpQkFDeEQsR0FBRyxDQUNGLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDTixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FDbkY7aUJBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbkIsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSx5RUFBeUU7UUFDekUsOERBQThEO1FBQzlELElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxVQUFVLENBQUMsT0FBd0IsRUFBRSxHQUFRO1FBQ3JELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNqRCwwR0FBMEc7WUFDMUcseUdBQXlHO1lBQ3pHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSx5RUFBeUU7SUFDekUsMkVBQTJFO0lBQ25FLGdCQUFnQixDQUFDLE9BQXdCLEVBQUUsR0FBVztRQUM1RCxNQUFNLFNBQVMsR0FBRyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFBLG1DQUFlLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ25ELENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsd0JBQXdCO0lBQ2hCLGVBQWUsQ0FBQyxPQUF3QixFQUFFLEdBQVc7UUFDM0QsTUFBTSxTQUFTLEdBQUcsb0JBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFNUUsd0VBQXdFO1FBQ3hFLGdFQUFnRTtRQUNoRSxJQUNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDL0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM5QixjQUFjLEtBQUssQ0FBQyxFQUNwQixDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxVQUFVLEdBQUcsb0JBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sYUFBYSxHQUFHLG9CQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLFdBQVcsR0FBRyxvQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFaEQsTUFBTSxjQUFjLEdBQ2xCLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUUvRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBRXJCLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsU0FBUyxHQUFHLElBQUEsMkNBQXVCLEVBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBRUQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDckMsQ0FBQztnQkFFRCxNQUFNLFVBQVUsR0FDZCxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQ3RCLENBQUMsQ0FBQyxJQUFBLDJDQUF1QixFQUFDLEtBQUssQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLE1BQU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBRTlCLE9BQU8sR0FBRyxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUM7WUFDckMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxVQUFVLEdBQUcsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sWUFBWSxDQUFDLEdBQVc7UUFDaEMsT0FBTyxHQUFHO2FBQ1AsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxrQkFBa0I7YUFDeEMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtJQUNqRCxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQVcsRUFBRSxXQUFnQjtRQUNqRCxNQUFNLFNBQVMsR0FBRyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUU1RSxpQkFBaUI7UUFDakIsSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxXQUFXLEtBQUssR0FBRztnQkFDeEIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQzNCLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUM1QyxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLElBQ0UsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMvQixTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzlCLGNBQWMsS0FBSyxDQUFDLEVBQ3BCLENBQUM7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBRUQsK0NBQStDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQixNQUFNLFVBQVUsR0FBRyxvQkFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxhQUFhLEdBQUcsb0JBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sV0FBVyxHQUFHLG9CQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVoRCxNQUFNLGNBQWMsR0FDbEIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBRS9ELGdHQUFnRztnQkFDaEcsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUVyQix5REFBeUQ7Z0JBQ3pELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsdUVBQXVFO2dCQUN2RSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNyQyxDQUFDO2dCQUVELE1BQU0sVUFBVSxHQUNkLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO29CQUMxQixDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFFOUIsT0FBTyxHQUFHLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUMxQixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUN4QixDQUFDLENBQUMsVUFBVTtZQUNaLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQUVELHdEQUF3RDtBQUN4RCwrQ0FBK0M7QUFDL0MsTUFBTSxTQUFVLFNBQVEsWUFBWTtJQUNMO0lBQTdCLFlBQTZCLEdBQVc7UUFDdEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRGdCLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFFeEMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7SUFDckgsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBRUQsK0NBQStDO0FBQy9DLFNBQWdCLFNBQVMsQ0FBQyxHQUFXO0lBQ25DLE9BQU8sSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELCtDQUErQztBQUMvQyxNQUFNLFNBQVUsU0FBUSxZQUFZO0lBU3hCO0lBQ0E7SUFUVjs7Ozs7T0FLRztJQUNLLG9CQUFvQixHQUEyQixFQUFFLENBQUM7SUFDMUQsWUFDVSxVQUFrQixFQUNsQixXQUE0QjtRQUVwQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFIVixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtJQUd0QyxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLCtFQUErRTtRQUMvRSxNQUFNLGVBQWUsR0FBRyxnQ0FBYyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDOUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsd0JBQXdCO1lBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLGVBQWUsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLEdBQUcsR0FBRyxTQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUNqQyxJQUFJLENBQUMsV0FBVyxFQUNoQixlQUFlLEVBQ2YsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztnQkFFRixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQsdUZBQXVGO1FBQ3ZGLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxjQUFjO2dCQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDcEQsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsR0FBRyxDQUFDLFVBQWtCLEVBQUUsS0FBc0I7SUFDNUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEdBQVE7SUFDekMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sY0FBZSxTQUFRLFlBQVk7SUFFN0I7SUFDQTtJQUZWLFlBQ1UsTUFBa0IsRUFDbEIsSUFBa0I7UUFFMUIsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFjO0lBRzVCLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSTthQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNYLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4QyxNQUFNLGFBQWEsR0FDakIsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxNQUFNLGFBQWEsR0FDakIsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsYUFBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0RCxJQUFJLGFBQWEsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ25CLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO2FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVaLE1BQU0sVUFBVSxHQUNkLHNCQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRztZQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLE1BQU0sSUFBSSxHQUFHLEdBQUcsVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBRTlDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsK0NBQStDO0FBQy9DLFNBQWdCLGNBQWMsQ0FBQyxNQUFrQixFQUFFLElBQWtCO0lBQ25FLE9BQU8sSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBZ0IsQ0FBQztBQUN6RCxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0scUJBQXNCLFNBQVEsWUFBWTtJQUVwQztJQUNBO0lBQ0E7SUFIVixZQUNVLFNBQXFCLEVBQ3JCLFNBQXFCLEVBQ3JCLFVBQXNCO1FBRTlCLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUpwQyxjQUFTLEdBQVQsU0FBUyxDQUFZO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUdoQyxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDOUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFOUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxTQUFTLE1BQU0sU0FBUyxNQUFNLFVBQVUsRUFBRSxDQUFDO1FBRTNELE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQ3pCLFNBQXFCLEVBQ3JCLFNBQXFCLEVBQ3JCLFVBQXNCO0lBRXRCLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFtQkQ7OztHQUdHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxZQUFZO0lBRXhDO0lBQ0E7SUFDQTtJQUhWLFlBQ1UsUUFBa0IsRUFDbEIsSUFBZ0IsRUFDaEIsS0FBa0I7UUFFMUIsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFKaEQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWE7SUFHNUIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVoQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7Z0JBQ2xFLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNULElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN4QixjQUFjO29CQUNkLElBQUksR0FBRyxJQUFJLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQztnQkFDaEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFdBQVc7b0JBQ1gsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7Z0JBQ3BFLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUExQ0QsZ0RBMENDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sWUFBYSxTQUFRLFlBQVk7SUFFM0I7SUFDQTtJQUZWLFlBQ1UsSUFBWSxFQUNaLElBQWtCO1FBRTFCLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBSGQsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFNBQUksR0FBSixJQUFJLENBQWM7SUFHNUIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyw4REFBOEQ7UUFDOUQsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxnRUFBZ0U7UUFDaEUsbUVBQW1FO1FBQ25FLHFDQUFxQztRQUNyQyxFQUFFO1FBQ0YsNERBQTREO1FBQzVELDJEQUEyRDtRQUMzRCxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSxtRUFBbUU7UUFDbkUsbUVBQW1FO1FBQ25FLHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUsZ0NBQWdDO1FBQ2hDLElBQUksS0FBaUMsQ0FBQztRQUN0QyxJQUFJLGdDQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDO2dCQUNILEtBQUssR0FBRyxnQ0FBYyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDOUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ3BELE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUVoRCxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM5QixPQUFPLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM3QixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUUzQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSTthQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLE1BQU0sSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxjQUFjLEdBQUcsQ0FBQztRQUUvQyxPQUFPLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDO1FBQzlDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7UUFFMUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFDRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxJQUFrQjtJQUNuRCxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQWdCLENBQUM7QUFDckQsQ0FBQztBQUVZLFFBQUEsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLFFBQUEsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxhQUFjLFNBQVEsWUFBWTtJQUU1QjtJQUNBO0lBQ0E7SUFIVixZQUNVLEtBQWlCLEVBQ2pCLGVBQTJCLEVBQzNCLGFBQTBCO1FBRWxDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUp6QyxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLG9CQUFlLEdBQWYsZUFBZSxDQUFZO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFhO0lBR3BDLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM5QixPQUFPLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLDBCQUFrQixDQUFDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsNEJBQW9CLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUUsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFeEUsSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxPQUFPLFNBQVMsSUFBSSxDQUFDO1FBQzVFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLLEtBQUssT0FBTyxLQUFLLEtBQUssU0FBUyxHQUFHLENBQUM7UUFDN0QsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFnQixhQUFhLENBQzNCLEtBQWlCLEVBQ2pCLGVBQTJCLEVBQzNCLGFBQTBCO0lBRTFCLE9BQU8sSUFBSSxhQUFhLENBQ3RCLEtBQUssRUFDTCxlQUFlLEVBQ2YsYUFBYSxDQUNDLENBQUM7QUFDbkIsQ0FBQztBQUVELCtDQUErQztBQUMvQyxNQUFNLFVBQVcsU0FBUSxZQUFZO0lBQ2Y7SUFBcEIsWUFBb0IsVUFBZ0M7UUFDbEQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBREEsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7SUFFcEQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQUNELCtDQUErQztBQUMvQyxTQUFnQixVQUFVLENBQUMsVUFBZ0M7SUFDekQsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcIi4vdG9rZW5zL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IEludHJpbnNpYyB9IGZyb20gXCIuL3Rva2Vucy9wcml2YXRlL2ludHJpbnNpY1wiO1xuaW1wb3J0IHsgVG9rZW5pemF0aW9uLCBUb2tlbiB9IGZyb20gXCIuL3Rva2Vucy90b2tlblwiO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSBcIi4vYXBwXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCIuL3RlcnJhZm9ybS1zdGFja1wiO1xuaW1wb3J0IHsgSVRlcnJhZm9ybURlcGVuZGFibGUgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZGVwZW5kYWJsZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIHF1b3RlZFN0cmluZ0tleSxcbiAgcXVvdGVkU3RyaW5nS2V5RnJhZ21lbnQsXG59IGZyb20gXCIuL2hjbC9xdW90ZWQtc3RyaW5nLWtleVwiO1xuXG5jb25zdCBURVJSQUZPUk1fSURFTlRJRklFUl9SRUdFWCA9IC9eW19hLXpBLVpdW19hLXpBLVowLTldKiQvO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgVEZFeHByZXNzaW9uIGV4dGVuZHMgSW50cmluc2ljIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCwgYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc29sdmVkQXJnID0gY29udGV4dC5yZXNvbHZlKGFyZyk7XG4gICAgaWYgKFRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoYXJnKSkge1xuICAgICAgLy8gQSByZXNvbHZhYmxlIGFyZyAoZS5nLiBgY2RrdG4uVG9rZW4ubnVsbFZhbHVlKClgLCBhbiBJUmVzb2x2YWJsZVxuICAgICAgLy8gd3JhcHBpbmcgYG51bGxgIC0gc2VlIFRva2VuLm51bGxWYWx1ZSgpL1Rva2VuLmFzQW55KCkpIGNhbiBpdHNlbGZcbiAgICAgIC8vIHJlc29sdmUgdG8gYG51bGxgL2B1bmRlZmluZWRgLiBDb2xsYXBzZSB0aGF0IHRvIHRoZSBsaXRlcmFsIFwibnVsbFwiXG4gICAgICAvLyBzdHJpbmcgdG9vLCBmb3IgdGhlIGV4YWN0IHNhbWUgcmVhc29uIGFzIHRoZSBwbGFpbi1udWxsL3VuZGVmaW5lZFxuICAgICAgLy8gYnJhbmNoIGZ1cnRoZXIgZG93bjogQXJyYXkucHJvdG90eXBlLmpvaW4oKSAodXNlZCBieSBjYWxsZXJzIGxpa2VcbiAgICAgIC8vIEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKCkpIHRyZWF0cyBhIGBudWxsYC9gdW5kZWZpbmVkYCBhcnJheSBFTEVNRU5UIGFzXG4gICAgICAvLyBhbiBlbXB0eSBzdHJpbmcsIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBhcmd1bWVudCBpbnN0ZWFkIG9mXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIFRlcnJhZm9ybSBgbnVsbGAga2V5d29yZC4gV2l0aG91dCB0aGlzLCBvbmx5IGFcbiAgICAgIC8vIGxpdGVyYWwgSlMgYG51bGxgL2B1bmRlZmluZWRgIGFyZ3VtZW50IHJlbmRlcmVkIGNvcnJlY3RseSAtIGFcbiAgICAgIC8vIHJlc29sdmFibGUgdG9rZW4gdGhhdCByZXNvbHZlcyB0byBgbnVsbGAgKHRoZSBvbmx5IHdheSB0byBwYXNzIGFuXG4gICAgICAvLyBleHBsaWNpdCBgbnVsbGAgaW4gYSBqc2lpLXR5cGVkIGZpeGVkIHBvc2l0aW9uLCBzaW5jZSBqc2lpIGNhbid0XG4gICAgICAvLyBleHByZXNzIGEgbGl0ZXJhbCBgbnVsbGAgcGFyYW1ldGVyIHR5cGUpIHNpbGVudGx5IHZhbmlzaGVkIGluc3RlYWQuXG4gICAgICBpZiAocmVzb2x2ZWRBcmcgPT09IG51bGwgfHwgcmVzb2x2ZWRBcmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICB9XG4gICAgICAvLyBBIHJlc29sdmFibGUgY2FuIGl0c2VsZiByZXNvbHZlIHRvIGEgcGxhaW4gKHVuZW5jb2RlZCkgYXJyYXkvb2JqZWN0XG4gICAgICAvLyByYXRoZXIgdGhhbiBhbiBhbHJlYWR5LXJlbmRlcmVkIHN0cmluZyAtIGUuZy4gYSBtYW51YWxseS1jb25zdHJ1Y3RlZFxuICAgICAgLy8gd2hvbGUtY29sbGVjdGlvbiB0b2tlbiBsaWtlIGBjZGt0bi5Ub2tlbi5hc0FueShbdHJ1ZSwgZmFsc2VdKWBcbiAgICAgIC8vIChleGFjdGx5IHRoZSBzaGFwZSBhIGpzaWktdHlwZWQgYEFycmF5PGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZT5cbiAgICAgIC8vIHwgY2RrdG4uSVJlc29sdmFibGVgIHByb3ZpZGVyLWZ1bmN0aW9uIHBhcmFtZXRlciBub3cgYWNjZXB0cyAtIHNlZVxuICAgICAgLy8gcHJvdmlkZXItZnVuY3Rpb24tbW9kZWwudHMpLiBGb3JtYXQgaXQgdGhlIHNhbWUgYnJhY2tldC9icmFjZSB3YXlcbiAgICAgIC8vIHRoZSBwbGFpbiBhcnJheS9vYmplY3QgYnJhbmNoZXMgYmVsb3cgZG8sIHJlY3Vyc2luZyBvblxuICAgICAgLy8gYHJlc29sdmVkQXJnYCdzIG93biBlbGVtZW50cyAoTk9UIGBhcmdgJ3MgLSBgYXJnYCBpcyB0aGUgcmVzb2x2YWJsZVxuICAgICAgLy8gd3JhcHBlciBpdHNlbGYsIG5vdCBpbmRleGFibGUva2V5YWJsZSkuIFdpdGhvdXQgdGhpcywgdGhlIGFycmF5XG4gICAgICAvLyBicmFuY2ggYmVsb3cgaXMgdW5yZWFjaGFibGUgZm9yIGEgcmVzb2x2YWJsZSBhcmcgKHRoaXMgYGlmYCBhbHJlYWR5XG4gICAgICAvLyByZXR1cm5lZCksIHNvIHRoZSByYXcgYXJyYXkvb2JqZWN0IGZlbGwgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIHBsYWluIGByZXR1cm4gcmVzb2x2ZWRBcmdgIGF0IHRoZSBib3R0b20gLSByZWx5aW5nIG9uIHRoZSBjYWxsZXInc1xuICAgICAgLy8gYEFycmF5LnByb3RvdHlwZS5qb2luKClgIChGdW5jdGlvbkNhbGwucmVzb2x2ZSgpIGV0IGFsLikgdG9cbiAgICAgIC8vIHN0cmluZ2lmeSBpdCwgd2hpY2ggZHJvcHMgYW4gYXJyYXkncyBicmFja2V0cy9zcGFjaW5nIChyZW5kZXJzXG4gICAgICAvLyBgdHJ1ZSxmYWxzZWAgaW5zdGVhZCBvZiBgW3RydWUsIGZhbHNlXWApIGFuZCwgZm9yIGFuIG9iamVjdCwgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgdGhlIHVzZWxlc3MgbGl0ZXJhbCBzdHJpbmcgYFtvYmplY3QgT2JqZWN0XWAuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvbHZlZEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtyZXNvbHZlZEFyZ1xuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBpdGVtKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfV1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZEFyZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHJlc29sdmVkQXJnKVxuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAoa2V5KSA9PlxuICAgICAgICAgICAgICBgJHt0aGlzLnJlc29sdmVPYmplY3RLZXkoY29udGV4dCwga2V5KX0gPSAke3RoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCByZXNvbHZlZEFyZ1trZXldKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbihcIiwgXCIpfX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkQXJnO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvbHZlZEFyZykpIHtcbiAgICAgIHJldHVybiBgWyR7cmVzb2x2ZWRBcmdcbiAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmdbaW5kZXhdKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX1dYDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkQXJnID09PSBcIm9iamVjdFwiICYmIHJlc29sdmVkQXJnICE9PSBudWxsKSB7XG4gICAgICAvLyBVc2UgYXJnJ3Mgb3duIGtleXMsIG5vdCByZXNvbHZlZEFyZydzOiBjb250ZXh0LnJlc29sdmUoKSBkZWVwLXJlc29sdmVzXG4gICAgICAvLyBvYmplY3Qga2V5cyB0b28sIHJlcGxhY2luZyBhIHRva2VuIHBsYWNlaG9sZGVyIHdpdGggaXRzIHJlc29sdmVkXG4gICAgICAvLyByZWZlcmVuY2UgdGV4dCBhbmQgZHJvcHBpbmcgdGhlIGAkey4uLn1gIHdyYXBwZXIsIHNvIHJlc29sdmVkQXJnJ3NcbiAgICAgIC8vIGtleXMgbm8gbG9uZ2VyIGxvb2sgbGlrZSB0b2tlbnMgYW5kIG5vIGxvbmdlciBtYXRjaCBgYXJnYCdzLlxuICAgICAgLy8gY29udGV4dC5yZXNvbHZlKCkgYWxzbyBkcm9wcyB1bmRlZmluZWQtdmFsdWVkIGVudHJpZXMgKG1pcnJvcmluZ1xuICAgICAgLy8gSlNPTi5zdHJpbmdpZnkpLCBzbyBmaWx0ZXIgdGhvc2Ugb3V0IGhlcmUgdG8gbWF0Y2ggcmVzb2x2ZWRBcmcncyBrZXlzLlxuICAgICAgLy8gQSByZXNvbHZhYmxlIHZhbHVlIChlLmcuIExhenkuYW55VmFsdWUoKSkgb25seSByZXZlYWxzIGB1bmRlZmluZWRgXG4gICAgICAvLyBvbmNlIHJlc29sdmVkLCBzbyByZXNvbHZlIHRoZSB2YWx1ZSAtIG5vdCBqdXN0IGNoZWNrIGBhcmdba2V5XWAgLSB0b1xuICAgICAgLy8gZGV0ZWN0IGl0LlxuICAgICAgcmV0dXJuIGB7JHtPYmplY3Qua2V5cyhhcmcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4gY29udGV4dC5yZXNvbHZlKGFyZ1trZXldKSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgJHt0aGlzLnJlc29sdmVPYmplY3RLZXkoY29udGV4dCwga2V5KX0gPSAke3RoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmdba2V5XSl9YCxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiwgXCIpfX1gO1xuICAgIH1cblxuICAgIC8vIEEgbGl0ZXJhbCBgbnVsbGAvYHVuZGVmaW5lZGAgYXJndW1lbnQgKGUuZy4gYSBmaXhlZC1hcml0eSBwcm92aWRlclxuICAgIC8vIGZ1bmN0aW9uIHBvc2l0aW9uYWwgc2xvdCB0aGUgY2FsbGVyIGludGVudGlvbmFsbHkgbGVmdCBlbXB0eSkgbXVzdCBiZVxuICAgIC8vIHJlbmRlcmVkIGFzIHRoZSBUZXJyYWZvcm0gYG51bGxgIGtleXdvcmQuIFdpdGhvdXQgdGhpcywgYHJlc29sdmVkQXJnYFxuICAgIC8vIHN0YXlzIGBudWxsYC9gdW5kZWZpbmVkYCBhbmQgQXJyYXkucHJvdG90eXBlLmpvaW4oKSAodXNlZCBieSBjYWxsZXJzXG4gICAgLy8gbGlrZSBGdW5jdGlvbkNhbGwucmVzb2x2ZSgpKSBzaWxlbnRseSBjb2xsYXBzZXMgaXQgdG8gYW4gZW1wdHkgc3RyaW5nLFxuICAgIC8vIHNoaWZ0aW5nL2Ryb3BwaW5nIHRoZSBhcmd1bWVudCBpbnN0ZWFkIG9mIHJlbmRlcmluZyBgbnVsbGAuXG4gICAgaWYgKHJlc29sdmVkQXJnID09PSBudWxsIHx8IHJlc29sdmVkQXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRBcmc7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUFyZyhjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQsIGFyZzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvbHZlZEFyZyA9IGNvbnRleHQucmVzb2x2ZShhcmcpO1xuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHN0ciA9IHRoaXMucmVzb2x2ZVN0cmluZyhhcmcsIHJlc29sdmVkQXJnKTtcbiAgICAgIC8vIFdoZW4gVG9rZW4uYXNTdHJpbmcoKSBpcyB1c2VkIG9uIGFuIG9iamVjdCwgc3RyIHdpbGwgYmUgdGhlIG9iamVjdCBhbmQgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgZGlmZmVyZW50bHlcbiAgICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBpbiBNYXBUZXJyYWZvcm1JdGVyYXRvciNfZ2V0Rm9yRWFjaEV4cHJlc3Npb24gYW5kIGNhbiBjYXVzZSBpc3N1ZXMgbGlrZSAjMzU0MFxuICAgICAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQsIHN0cik7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlc29sdmVFeHByZXNzaW9uUGFydChjb250ZXh0LCBhcmcpO1xuICB9XG5cbiAgLy8gQW4gb2JqZWN0IGtleSBidWlsdCBmcm9tIGEgdG9rZW4gKGUuZy4gYHtbcmVzLmlkXTogXCJ2XCJ9YCkgaXMgYSBKUyBzdHJpbmdcbiAgLy8gaG9sZGluZyB0aGUgdG9rZW4ncyBwbGFjZWhvbGRlciBieSB0aGUgdGltZSBpdCByZWFjaGVzIGhlcmUsIGFuZCByZWFkc1xuICAvLyBpZGVudGljYWxseSB0byBhIGxpdGVyYWwga2V5IHVubGVzcyB3ZSBjaGVjayBmb3IgdGhlIHBsYWNlaG9sZGVyLlxuICAvLyBIQ0wgaGFzIG5vIG9iamVjdC1rZXkgaW50ZXJwb2xhdGlvbiBzeW50YXgsIHNvIGEgdG9rZW4ga2V5IGNhbiBvbmx5IGJlXG4gIC8vIGV4cHJlc3NlZCBhcyBhIHBhcmVudGhlc2lzZWQga2V5IGV4cHJlc3Npb24sIGUuZy4gYChyZXNvdXJjZS5pZCkgPSBcInZcImAuXG4gIHByaXZhdGUgcmVzb2x2ZU9iamVjdEtleShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b2tlbkxpc3QgPSBUb2tlbml6YXRpb24ucmV2ZXJzZVN0cmluZyhrZXkpO1xuICAgIGNvbnN0IGhhc1Rva2VuID0gdG9rZW5MaXN0LnRva2Vucy5sZW5ndGggKyB0b2tlbkxpc3QuaW50cmluc2ljLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoIWhhc1Rva2VuKSB7XG4gICAgICByZXR1cm4gcXVvdGVkU3RyaW5nS2V5KGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAoJHt0aGlzLnJlc29sdmVUb2tlbktleShjb250ZXh0LCBrZXkpfSlgO1xuICB9XG5cbiAgLy8gQSBtaXhlZCBsaXRlcmFsL3Rva2VuIGtleSAoZS5nLiBge1tgcHJlZml4LSR7cmVzLmlkfWBdOiBcInZcIn1gKSBtdXN0IHN0YXkgYVxuICAvLyBrZXkgZXhwcmVzc2lvbiwgbm90IGdvIHRocm91Z2ggcmVzb2x2ZUFyZygpJ3MgcmVzb2x2ZVN0cmluZygpLCB3aGljaFxuICAvLyBlc2NhcGVzIGEgbGl0ZXJhbCBmcmFnbWVudCBmb3IgdXNlIGFzIGEgVGVycmFmb3JtICp2YWx1ZSogKG9ubHkgYFxcbmAgYW5kXG4gIC8vIGAke2ApIHJhdGhlciB0aGFuIGFzIGEgcXVvdGVkLXN0cmluZyAqa2V5KiAod2hpY2ggYWxzbyBuZWVkcyBxdW90ZXMgYW5kXG4gIC8vIGJhY2tzbGFzaGVzIGVzY2FwZWQpLlxuICBwcml2YXRlIHJlc29sdmVUb2tlbktleShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b2tlbkxpc3QgPSBUb2tlbml6YXRpb24ucmV2ZXJzZVN0cmluZyhrZXkpO1xuICAgIGNvbnN0IG51bWJlck9mVG9rZW5zID0gdG9rZW5MaXN0LnRva2Vucy5sZW5ndGggKyB0b2tlbkxpc3QuaW50cmluc2ljLmxlbmd0aDtcblxuICAgIC8vIEEga2V5IHRoYXQgaXMgb25seSBhIHRva2VuIChubyBsaXRlcmFsIGZyYWdtZW50cykgaXMgYSBiYXJlIHJlZmVyZW5jZVxuICAgIC8vIGV4cHJlc3Npb24sIG5vdCBhIHF1b3RlZCBzdHJpbmcgLSBlLmcuIGAocmVzb3VyY2UuaWQpID0gXCJ2XCJgLlxuICAgIGlmIChcbiAgICAgIHRva2VuTGlzdC5saXRlcmFscy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRva2VuTGlzdC5lc2NhcGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgbnVtYmVyT2ZUb2tlbnMgPT09IDFcbiAgICApIHtcbiAgICAgIHJldHVybiBjb250ZXh0LnJlc29sdmUoa2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2luUmVzdWx0ID0gdG9rZW5MaXN0LmpvaW4oe1xuICAgICAgam9pbjogKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZnRUb2tlbnMgPSBUb2tlbml6YXRpb24ucmV2ZXJzZShsZWZ0KTtcbiAgICAgICAgY29uc3QgbGVmdFRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodFRva2VucyA9IFRva2VuaXphdGlvbi5yZXZlcnNlKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCBsZWZ0VG9rZW5Db3VudCA9XG4gICAgICAgICAgbGVmdFRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoICsgbGVmdFRva2VuTGlzdC50b2tlbnMubGVuZ3RoO1xuXG4gICAgICAgIGxldCBsZWZ0VmFsdWUgPSBsZWZ0O1xuXG4gICAgICAgIGlmIChsZWZ0VG9rZW5MaXN0LmxpdGVyYWxzLmxlbmd0aCA9PT0gMSAmJiBsZWZ0VG9rZW5Db3VudCA9PT0gMCkge1xuICAgICAgICAgIGxlZnRWYWx1ZSA9IHF1b3RlZFN0cmluZ0tleUZyYWdtZW50KGxlZnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxlZnRUb2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAwICYmIGxlZnRUb2tlbkNvdW50ID09PSAxKSB7XG4gICAgICAgICAgbGVmdFZhbHVlID0gYFxcJHske2xlZnRUb2tlbnNbMF19fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByaWdodFZhbHVlID1cbiAgICAgICAgICByaWdodFRva2Vucy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gcXVvdGVkU3RyaW5nS2V5RnJhZ21lbnQocmlnaHQpXG4gICAgICAgICAgICA6IGBcXCR7JHtyaWdodFRva2Vuc1swXX19YDtcblxuICAgICAgICByZXR1cm4gYCR7bGVmdFZhbHVlfSR7cmlnaHRWYWx1ZX1gO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBgXCIke2pvaW5SZXN1bHR9XCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSBzdHJpbmcgcmVtb3ZlcyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiBUZXJyYWZvcm0gb3IgSlNPTlxuICAgKiBJdCBtdXN0IG9ubHkgYmUgdXNlZCBvbiBub24tdG9rZW4gdmFsdWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZXNjYXBlU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpIC8vIGVzY2FwZSBuZXdsaW5lc1xuICAgICAgLnJlcGxhY2UoL1xcJHsvZywgXCIkJCR7XCIpOyAvLyBlc2NhcGUgJHsgdG8gJCR7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdHJpbmcoc3RyOiBzdHJpbmcsIHJlc29sdmVkQXJnOiBhbnkpIHtcbiAgICBjb25zdCB0b2tlbkxpc3QgPSBUb2tlbml6YXRpb24ucmV2ZXJzZVN0cmluZyhzdHIpO1xuICAgIGNvbnN0IG51bWJlck9mVG9rZW5zID0gdG9rZW5MaXN0LnRva2Vucy5sZW5ndGggKyB0b2tlbkxpc3QuaW50cmluc2ljLmxlbmd0aDtcblxuICAgIC8vIFN0cmluZyBsaXRlcmFsXG4gICAgaWYgKG51bWJlck9mVG9rZW5zID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRBcmcgIT09IGBcImAgJiZcbiAgICAgICAgcmVzb2x2ZWRBcmcuc3RhcnRzV2l0aCgnXCInKSAmJlxuICAgICAgICByZXNvbHZlZEFyZy5lbmRzV2l0aCgnXCInKVxuICAgICAgICA/IHRoaXMuZXNjYXBlU3RyaW5nKHJlc29sdmVkQXJnKVxuICAgICAgICA6IGBcIiR7dGhpcy5lc2NhcGVTdHJpbmcocmVzb2x2ZWRBcmcpfVwiYDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGEgdG9rZW4gcmVmZXJlbmNlXG4gICAgaWYgKFxuICAgICAgdG9rZW5MaXN0LmxpdGVyYWxzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdG9rZW5MaXN0LmVzY2FwZXMubGVuZ3RoID09PSAwICYmXG4gICAgICBudW1iZXJPZlRva2VucyA9PT0gMVxuICAgICkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQXJnO1xuICAgIH1cblxuICAgIC8vIFN0cmluZyBsaXRlcmFsICsgdG9rZW4gcmVmZXJlbmNlIGNvbWJpbmF0aW9uXG4gICAgY29uc3Qgam9pblJlc3VsdCA9IHRva2VuTGlzdC5qb2luKHtcbiAgICAgIGpvaW46IChsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0VG9rZW5zID0gVG9rZW5pemF0aW9uLnJldmVyc2UobGVmdCk7XG4gICAgICAgIGNvbnN0IGxlZnRUb2tlbkxpc3QgPSBUb2tlbml6YXRpb24ucmV2ZXJzZVN0cmluZyhsZWZ0KTtcbiAgICAgICAgY29uc3QgcmlnaHRUb2tlbnMgPSBUb2tlbml6YXRpb24ucmV2ZXJzZShyaWdodCk7XG5cbiAgICAgICAgY29uc3QgbGVmdFRva2VuQ291bnQgPVxuICAgICAgICAgIGxlZnRUb2tlbkxpc3QuaW50cmluc2ljLmxlbmd0aCArIGxlZnRUb2tlbkxpc3QudG9rZW5zLmxlbmd0aDtcblxuICAgICAgICAvLyBpZiBsZWZ0IGlzIG1peGVkLCBuZWVkcyB0byBiZSBsZWZ0IGFsb25lIChiZWNhdXNlIGl0J3MgYSByZXN1bHQgb2YgYSBwcmV2aW91cyBqb2luIGl0ZXJhdGlvbilcbiAgICAgICAgbGV0IGxlZnRWYWx1ZSA9IGxlZnQ7XG5cbiAgICAgICAgLy8gaWYgbGVmdCBpcyBhIHN0cmluZyBsaXRlcmFsLCB0aGVuIHdlIG5lZWQgdG8gZXNjYXBlIGl0XG4gICAgICAgIGlmIChsZWZ0VG9rZW5MaXN0LmxpdGVyYWxzLmxlbmd0aCA9PT0gMSAmJiBsZWZ0VG9rZW5Db3VudCA9PT0gMCkge1xuICAgICAgICAgIGxlZnRWYWx1ZSA9IHRoaXMuZXNjYXBlU3RyaW5nKGxlZnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbGVmdCBpcyBvbmx5IGEgdG9rZW4sIG5lZWRzIHRvIGJlIHdyYXBwZWQgYXMgdGVycmFmb3JtIGV4cHJlc3Npb25cbiAgICAgICAgaWYgKGxlZnRUb2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAwICYmIGxlZnRUb2tlbkNvdW50ID09PSAxKSB7XG4gICAgICAgICAgbGVmdFZhbHVlID0gYFxcJHske2xlZnRUb2tlbnNbMF19fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByaWdodFZhbHVlID1cbiAgICAgICAgICByaWdodFRva2Vucy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gdGhpcy5lc2NhcGVTdHJpbmcocmlnaHQpXG4gICAgICAgICAgICA6IGBcXCR7JHtyaWdodFRva2Vuc1swXX19YDtcblxuICAgICAgICByZXR1cm4gYCR7bGVmdFZhbHVlfSR7cmlnaHRWYWx1ZX1gO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBqb2luUmVzdWx0ICE9PSBgXCJgICYmXG4gICAgICBqb2luUmVzdWx0LnN0YXJ0c1dpdGgoJ1wiJykgJiZcbiAgICAgIGpvaW5SZXN1bHQuZW5kc1dpdGgoJ1wiJylcbiAgICAgID8gam9pblJlc3VsdFxuICAgICAgOiBgXCIke2pvaW5SZXN1bHR9XCJgO1xuICB9XG59XG5cbi8vIEEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhbiBpbnB1dCB2YWx1ZSB0byBiZSBlc2NhcGVkXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgUmF3U3RyaW5nIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzdHI6IHN0cmluZykge1xuICAgIHN1cGVyKHN0cik7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpIHtcbiAgICBjb25zdCBxdHMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzID8gYFwiYCA6IGBgO1xuICAgIHJldHVybiBgJHtxdHN9JHt0aGlzLmVzY2FwZVN0cmluZyh0aGlzLnN0cikucmVwbGFjZSgvXFxcIi9nLCAnXFxcXFwiJyl9JHtxdHN9YDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0cjtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIHJhd1N0cmluZyhzdHI6IHN0cmluZyk6IElSZXNvbHZhYmxlIHtcbiAgcmV0dXJuIG5ldyBSYXdTdHJpbmcoc3RyKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmNsYXNzIFJlZmVyZW5jZSBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIC8qKlxuICAgKiBBIHNpbmdsZSByZWZlcmVuY2UgY291bGQgYmUgdXNlZCBpbiBtdWx0aXBsZSBzdGFja3MsXG4gICAqIGUuZy4gaWYgd2UgZXhwb3NlIHRoZSByZWYgZGlyZWN0bHkgb3IgYXMgdG9rZW4gb24gdGhlIHN0YWNrLlxuICAgKiBXZSBuZWVkIHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIGZvciBlYWNoIHN0YWNrLFxuICAgKiBzbyB0aGF0IHRoZSByZXNvbHZlZCBpZGVudGlmaWVyIHN0cmluZyBtYXRjaGVzIHRoZSBzdGFjayBpdCdzIHJlc29sdmVkIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBjcm9zc1N0YWNrSWRlbnRpZmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBwcml2YXRlIG9yaWdpblN0YWNrPzogVGVycmFmb3JtU3RhY2ssXG4gICkge1xuICAgIHN1cGVyKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICAvLyBXZSBjaGVjayBmb3IgY3Jvc3Mgc3RhY2sgcmVmZXJlbmNlcyBvbiBwcmVwYXJhdGlvbiwgc2V0dGluZyBhIG5ldyBpZGVudGlmaWVyXG4gICAgY29uc3QgcmVzb2x1dGlvblN0YWNrID0gVGVycmFmb3JtU3RhY2sub2YoY29udGV4dC5zY29wZSk7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gcmVzb2x1dGlvblN0YWNrLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuXG4gICAgaWYgKGNvbnRleHQucHJlcGFyaW5nKSB7XG4gICAgICAvLyBDcm9zcyBzdGFjayByZWZlcmVuY2VcbiAgICAgIGlmICh0aGlzLm9yaWdpblN0YWNrICYmIHRoaXMub3JpZ2luU3RhY2sgIT09IHJlc29sdXRpb25TdGFjaykge1xuICAgICAgICBjb25zdCBhcHAgPSBBcHAub2YodGhpcy5vcmlnaW5TdGFjayk7XG4gICAgICAgIGNvbnN0IGNzciA9IGFwcC5jcm9zc1N0YWNrUmVmZXJlbmNlKFxuICAgICAgICAgIHRoaXMub3JpZ2luU3RhY2ssXG4gICAgICAgICAgcmVzb2x1dGlvblN0YWNrLFxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllcixcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNyb3NzU3RhY2tJZGVudGlmaWVyW3N0YWNrTmFtZV0gPSBjc3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIGNyb3NzIHN0YWNrIHJlZmVyZW5jZSB3ZSB3aWxsIHJlc29sdmUgdG8gYSByZWZlcmVuY2Ugd2l0aGluIHRoaXMgc3RhY2suXG4gICAgaWYgKHRoaXMuY3Jvc3NTdGFja0lkZW50aWZpZXJbc3RhY2tOYW1lXSkge1xuICAgICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzXG4gICAgICAgID8gdGhpcy5jcm9zc1N0YWNrSWRlbnRpZmllcltzdGFja05hbWVdXG4gICAgICAgIDogYFxcJHske3RoaXMuY3Jvc3NTdGFja0lkZW50aWZpZXJbc3RhY2tOYW1lXX19YDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyB0aGlzLmlkZW50aWZpZXIgOiBgXFwkeyR7dGhpcy5pZGVudGlmaWVyfX1gO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gcmVmKGlkZW50aWZpZXI6IHN0cmluZywgc3RhY2s/OiBUZXJyYWZvcm1TdGFjayk6IElSZXNvbHZhYmxlIHtcbiAgcmV0dXJuIG5ldyBSZWZlcmVuY2UoaWRlbnRpZmllciwgc3RhY2spO1xufVxuXG4vKipcbiAqIG1hcmtzIHRoZSBhcmd1bWVudCBhcyBiZWluZyB1c2VkIGluIGEgdGVycmFmb3JtIGV4cHJlc3Npb25cbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNpZGVUZkV4cHJlc3Npb24oYXJnOiBhbnkpIHtcbiAgcmV0dXJuIGFyZztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmNsYXNzIFByb3BlcnR5QWNjZXNzIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0YXJnZXQ6IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSBhcmdzOiBFeHByZXNzaW9uW10sXG4gICkge1xuICAgIHN1cGVyKHsgdGFyZ2V0LCBhcmdzIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkQXJncyA9IHRoaXMuYXJnc1xuICAgICAgLm1hcCgoYXJnKSA9PiB7XG4gICAgICAgIGlmIChhcmcgPT09IGAqYCkge1xuICAgICAgICAgIHJldHVybiBcIlsqXVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmcpO1xuICAgICAgICBjb25zdCBpc1BsYWluU3RyaW5nID1cbiAgICAgICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIFRFUlJBRk9STV9JREVOVElGSUVSX1JFR0VYLnRlc3QoYXJnKTtcbiAgICAgICAgY29uc3QgaXNQbGFpbk51bWJlciA9XG4gICAgICAgICAgdHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGFyZyk7XG5cbiAgICAgICAgaWYgKGlzUGxhaW5TdHJpbmcgfHwgaXNQbGFpbk51bWJlcikge1xuICAgICAgICAgIHJldHVybiBgLiR7YXJnfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYFske2F9XWA7XG4gICAgICB9KSAvLyBwcm9wZXJ0eSBhY2Nlc3NcbiAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgY29uc3QgdGFyZ2V0RXhwciA9XG4gICAgICBDb25zdHJ1Y3QuaXNDb25zdHJ1Y3QodGhpcy50YXJnZXQpICYmIFwiZnFuXCIgaW4gdGhpcy50YXJnZXRcbiAgICAgICAgPyB0aGlzLnRhcmdldC5mcW5cbiAgICAgICAgOiB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy50YXJnZXQpO1xuXG4gICAgY29uc3QgZXhwciA9IGAke3RhcmdldEV4cHJ9JHtzZXJpYWxpemVkQXJnc31gO1xuXG4gICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzID8gZXhwciA6IGBcXCR7JHtleHByfX1gO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlBY2Nlc3ModGFyZ2V0OiBFeHByZXNzaW9uLCBhcmdzOiBFeHByZXNzaW9uW10pIHtcbiAgcmV0dXJuIG5ldyBQcm9wZXJ0eUFjY2Vzcyh0YXJnZXQsIGFyZ3MpIGFzIElSZXNvbHZhYmxlO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25kaXRpb246IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSB0cnVlVmFsdWU6IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSBmYWxzZVZhbHVlOiBFeHByZXNzaW9uLFxuICApIHtcbiAgICBzdXBlcih7IGNvbmRpdGlvbiwgdHJ1ZVZhbHVlLCBmYWxzZVZhbHVlIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG5cbiAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy5jb25kaXRpb24pO1xuICAgIGNvbnN0IHRydWVWYWx1ZSA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLnRydWVWYWx1ZSk7XG4gICAgY29uc3QgZmFsc2VWYWx1ZSA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLmZhbHNlVmFsdWUpO1xuXG4gICAgY29uc3QgZXhwciA9IGAke2NvbmRpdGlvbn0gPyAke3RydWVWYWx1ZX0gOiAke2ZhbHNlVmFsdWV9YDtcblxuICAgIHJldHVybiBzdXBwcmVzc0JyYWNlcyA/IGV4cHIgOiBgXFwkeyR7ZXhwcn19YDtcbiAgfVxufVxuXG4vKipcbiAqIGNyZWF0ZXMgYW4gZXhwcmVzc2lvbiBsaWtlIGB0cnVlID8gMSA6IDBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbChcbiAgY29uZGl0aW9uOiBFeHByZXNzaW9uLFxuICB0cnVlVmFsdWU6IEV4cHJlc3Npb24sXG4gIGZhbHNlVmFsdWU6IEV4cHJlc3Npb24sXG4pIHtcbiAgcmV0dXJuIG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24oY29uZGl0aW9uLCB0cnVlVmFsdWUsIGZhbHNlVmFsdWUpO1xufVxuXG4vLyBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9leHByZXNzaW9ucy9vcGVyYXRvcnNcbmV4cG9ydCB0eXBlIE9wZXJhdG9yID1cbiAgfCBcIiFcIlxuICB8IFwiLVwiXG4gIHwgXCIqXCJcbiAgfCBcIi9cIlxuICB8IFwiJVwiXG4gIHwgXCIrXCJcbiAgfCBcIj5cIlxuICB8IFwiPj1cIlxuICB8IFwiPFwiXG4gIHwgXCI8PVwiXG4gIHwgXCI9PVwiXG4gIHwgXCIhPVwiXG4gIHwgXCImJlwiXG4gIHwgXCJ8fFwiO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIE9wZXJhdG9yIEV4cHJlc3Npb25zXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3BlcmF0b3I6IE9wZXJhdG9yLFxuICAgIHByaXZhdGUgbGVmdDogRXhwcmVzc2lvbixcbiAgICBwcml2YXRlIHJpZ2h0PzogRXhwcmVzc2lvbiwgLy8gb3B0aW9uYWwgZm9yICEgYW5kIC0gb3BlcmF0b3JcbiAgKSB7XG4gICAgc3VwZXIoeyBvcGVyYXRvciwgbGVmdFZhbHVlOiBsZWZ0LCByaWdodFZhbHVlOiByaWdodCB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuXG4gICAgY29uc3QgbGVmdCA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLmxlZnQpO1xuICAgIGNvbnN0IHJpZ2h0ID1cbiAgICAgIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLnJpZ2h0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGxldCBleHByID0gXCJcIjtcbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgXCIhXCI6IHtcbiAgICAgICAgZXhwciA9IGAhJHtsZWZ0fWA7IC8vIG5vIGJyYWNlcyBuZWVkZWQgYXMgISBoYXMgaGlnaGVzdCBwcmVjZWRlbmNlXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIi1cIjoge1xuICAgICAgICBpZiAocmlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHN1YnRyYWN0aW9uXG4gICAgICAgICAgZXhwciA9IGAoJHtsZWZ0fSAtICR7cmlnaHR9KWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbmVnYXRpb25cbiAgICAgICAgICBleHByID0gYC0ke2xlZnR9YDsgLy8gbm8gYnJhY2VzIG5lZWRlZCBhcyAtIGhhcyBoaWdoZXN0IHByZWNlZGVuY2VcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgZXhwciA9IGAoJHtsZWZ0fSAke3RoaXMub3BlcmF0b3J9ICR7cmlnaHR9KWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzID8gZXhwciA6IGBcXCR7JHtleHByfX1gO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5jbGFzcyBGdW5jdGlvbkNhbGwgZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIGFyZ3M6IEV4cHJlc3Npb25bXSxcbiAgKSB7XG4gICAgc3VwZXIoeyBuYW1lLCBhcmdzIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICAvLyBSZWNvcmRpbmcgaGVyZSwgYXQgcmVzb2x2ZSB0aW1lLCBpcyBkZWxpYmVyYXRlOiBhIGBGbi4qKClgL1xuICAgIC8vIGBUZXJyYWZvcm1Qcm92aWRlckZ1bmN0aW9uLmludm9rZSgpYCBjYWxsIG9ubHkgcHJvZHVjZXMgYSB0b2tlbjogdGhpc1xuICAgIC8vIGlzIHRoZSBwb2ludCB3aGVyZSB0aGF0IHRva2VuIGFjdHVhbGx5IGxhbmRzIGluIGEgcmVuZGVyZWQgc3RhY2ssIHNvXG4gICAgLy8gdXNhZ2UgaXMgYXR0cmlidXRlZCB0byB0aGUgU1RBQ0sgd2hvc2Ugc3ludGhlc2lzIGlzIGRvaW5nIHRoZVxuICAgIC8vIHJlbmRlcmluZyAtIHNlZSBgVGVycmFmb3JtU3RhY2suX3VzZWRGdW5jdGlvbnNgIGZvciB3aHkgdXNhZ2UgaXNcbiAgICAvLyBzdGFjay1vd25lZCByYXRoZXIgdGhhbiBBcHAtb3duZWQuXG4gICAgLy9cbiAgICAvLyBgY29udGV4dC5zY29wZWAgSVMgdGhlIHJlc29sdmluZyBUZXJyYWZvcm1TdGFjayBmb3IgZXZlcnlcbiAgICAvLyBzeW50aC1kcml2ZW4gcmVzb2x2ZSAoQXBwLnN5bnRoLCBUZXN0aW5nLnN5bnRoL3N5bnRoSGNsLFxuICAgIC8vIFN0YWNrU3ludGhlc2l6ZXIuc3ludGhlc2l6ZSBhbGwgcmVzb2x2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIG93bmluZ1xuICAgIC8vIHN0YWNrIGFzIHNjb3BlKSwgc28gYFRlcnJhZm9ybVN0YWNrLmlzU3RhY2tgIGlzIGNoZWNrZWQgZmlyc3QgYXMgdGhlXG4gICAgLy8gY29tbW9uIGNhc2UuIGBUZXJyYWZvcm1TdGFjay5vZigpYCBpcyBhIGZhbGxiYWNrIGZvciBhIHNjb3BlIHRoYXQgaXNcbiAgICAvLyBzb21lIG90aGVyIGNvbnN0cnVjdCB3aXRoaW4gYSBzdGFjay4gSWYgbmVpdGhlciBmaW5kcyBhIHN0YWNrIChhXG4gICAgLy8gdXNlci1kcml2ZW4gYFRva2Vucy5yZXNvbHZlKClgIGNhbGwgYWdhaW5zdCBhIGJhcmUgc2NvcGUgd2l0aCBub1xuICAgIC8vIHN0YWNrIGluIGl0cyBhbmNlc3RyeSksIHRoZXJlIGlzIG5vd2hlcmUgdG8gcmVjb3JkIGludG8gLSBhbmQgbm90aGluZ1xuICAgIC8vIHdvdWxkIGV2ZXIgcmVhZCBpdCBiYWNrIHRvIHZhbGlkYXRlIGFueXdheSAtIHNvIHJlY29yZGluZyBpcyBxdWlldGx5XG4gICAgLy8gc2tpcHBlZCByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICBsZXQgc3RhY2s6IFRlcnJhZm9ybVN0YWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmIChUZXJyYWZvcm1TdGFjay5pc1N0YWNrKGNvbnRleHQuc2NvcGUpKSB7XG4gICAgICBzdGFjayA9IGNvbnRleHQuc2NvcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YWNrID0gVGVycmFmb3JtU3RhY2sub2YoY29udGV4dC5zY29wZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgc3RhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrKSB7XG4gICAgICBpZiAodGhpcy5uYW1lLnN0YXJ0c1dpdGgoXCJwcm92aWRlcjo6XCIpKSB7XG4gICAgICAgIHN0YWNrLl9yZWNvcmRQcm92aWRlckZ1bmN0aW9uVXNhZ2UodGhpcy5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YWNrLl9yZWNvcmRGdW5jdGlvblVzYWdlKHRoaXMubmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnN0IG9yaWdpbmFsSWdub3JlRXNjYXBlcyA9IGNvbnRleHQuaWdub3JlRXNjYXBlcztcbiAgICBjb25zdCBvcmlnaW5hbFdhcm5Fc2NhcGVzID0gY29udGV4dC53YXJuRXNjYXBlcztcblxuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuICAgIGNvbnRleHQuaWdub3JlRXNjYXBlcyA9IHRydWU7XG4gICAgY29udGV4dC53YXJuRXNjYXBlcyA9IHRydWU7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkQXJncyA9IHRoaXMuYXJnc1xuICAgICAgLm1hcCgoYXJnKSA9PiB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgYXJnKSlcbiAgICAgIC5qb2luKFwiLCBcIik7XG5cbiAgICBjb25zdCBleHByID0gYCR7dGhpcy5uYW1lfSgke3NlcmlhbGl6ZWRBcmdzfSlgO1xuXG4gICAgY29udGV4dC5pZ25vcmVFc2NhcGVzID0gb3JpZ2luYWxJZ25vcmVFc2NhcGVzO1xuICAgIGNvbnRleHQud2FybkVzY2FwZXMgPSBvcmlnaW5hbFdhcm5Fc2NhcGVzO1xuXG4gICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzID8gZXhwciA6IGBcXCR7JHtleHByfX1gO1xuICB9XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGwobmFtZTogc3RyaW5nLCBhcmdzOiBFeHByZXNzaW9uW10pIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbkNhbGwobmFtZSwgYXJncykgYXMgSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBjb25zdCBGT1JfRVhQUkVTU0lPTl9LRVkgPSByZWYoXCJrZXlcIik7XG5leHBvcnQgY29uc3QgRk9SX0VYUFJFU1NJT05fVkFMVUUgPSByZWYoXCJ2YWxcIik7XG5cbi8qKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZXhwcmVzc2lvbnMvZm9yXG4gKi9cbmNsYXNzIEZvckV4cHJlc3Npb24gZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlucHV0OiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUgdmFsdWVFeHByZXNzaW9uOiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUga2V5RXhwcmVzc2lvbj86IEV4cHJlc3Npb24sXG4gICkge1xuICAgIHN1cGVyKHsgaW5wdXQsIHZhbHVlRXhwcmVzc2lvbiwga2V5RXhwcmVzc2lvbiB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuICAgIGNvbnRleHQuaXRlcmF0b3JDb250ZXh0ID0gXCJGT1JfRVhQUkVTU0lPTlwiO1xuICAgIGNvbnN0IGtleSA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBGT1JfRVhQUkVTU0lPTl9LRVkpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIEZPUl9FWFBSRVNTSU9OX1ZBTFVFKTtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLmlucHV0KTtcbiAgICBjb25zdCB2YWx1ZUV4cHIgPSB0aGlzLnJlc29sdmVFeHByZXNzaW9uUGFydChjb250ZXh0LCB0aGlzLnZhbHVlRXhwcmVzc2lvbik7XG5cbiAgICBsZXQgZXhwcjogc3RyaW5nO1xuICAgIGlmICh0aGlzLmtleUV4cHJlc3Npb24pIHtcbiAgICAgIGNvbnN0IGtleUV4cHIgPSB0aGlzLnJlc29sdmVFeHByZXNzaW9uUGFydChjb250ZXh0LCB0aGlzLmtleUV4cHJlc3Npb24pO1xuXG4gICAgICBleHByID0gYHsgZm9yICR7a2V5fSwgJHt2YWx1ZX0gaW4gJHtpbnB1dH06ICR7a2V5RXhwcn0gPT4gJHt2YWx1ZUV4cHJ9IH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByID0gYFsgZm9yICR7a2V5fSwgJHt2YWx1ZX0gaW4gJHtpbnB1dH06ICR7dmFsdWVFeHByfV1gO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBwcmVzc0JyYWNlcyA/IGV4cHIgOiBgXFwkeyR7ZXhwcn19YDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmb3IgZXhwcmVzc2lvbiwgdXNlZCBmb3IgYWR2YW5jZWQgaW50ZXJuYWwgdXNlIGNhc2VzIChlLmcuIGluIHRoZSBAY2RrdG4vYXdzLWFkYXB0ZXIpXG4gKiBJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGlzIHZpYSBKU0lJIGluIG90aGVyIGxhbmd1YWdlcy4gVXN1YWxseSB5b3UgbWlnaHQgd2FudCB0b1xuICogdXNlIFRlcnJhZm9ybUl0ZXJhdG9yIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBmb3IgdGhlIGV4cHJlc3Npb24gZS5nLiBhIGxpc3Qgb3IgYW4gb2JqZWN0XG4gKiBAcGFyYW0gdmFsdWVFeHByZXNzaW9uIHdpbGwgZXhwcmVzcyB0aGUgdmFsdWUgZS5nLiBbIGZvciBpIGluICZsdDtpbnB1dCZndDsgOiAmbHQ7dmFsdWVFeHByZXNzaW9uJmd0OyBdXG4gKiBAcGFyYW0ga2V5RXhwcmVzc2lvbiBpZiBzZXQgd2lsbCByZXR1cm4gYW4gb2JqZWN0IGUuZy4geyBmb3Igayx2IGluICZsdDtpbnB1dCZndDsgOiAmbHQ7a2V5RXhwcmVzc2lvbiZndDsgPT4gJmx0O3ZhbHVlRXhwcmVzc2lvbiZndDt9XG4gKiBAcmV0dXJucyBhIGZvciBleHByZXNzaW9uXG4gKlxuICogVGhlIHZhcmlhYmxlcyBmb3Iga2V5IChmb3IgbWFwcykgLyBpbmRleCAoZm9yIGxpc3RzKSBhbmQgdmFsdWUgdGhhdCBhcmUgdmFsaWQgaW4gdGhlIGtleS0gYW5kIHZhbHVlRXhwcmVzc2lvblxuICogY2FuIGJlIHJlZmVyZW5jZWQgYnkgdXNpbmcgdGhlc2UgY29uc3RhbnRzOiBGT1JfRVhQUkVTU0lPTl9LRVkgYW5kIEZPUl9FWFBSRVNTSU9OX1ZBTFVFLlxuICpcbiAqIEN1cnJlbnRseSBuZXN0aW5nIGZvciBleHByZXNzaW9ucyBpcyBub3Qgc3VwcG9ydGVkIGR1ZSB0byB0aGlzIHNpbXBsaWZpY2F0aW9uLlxuICpcbiAqIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGZpbHRlcmluZyBlbGVtZW50cyAoaWYgY2xhdXNlKSBvciBncm91cGluZyByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFeHByZXNzaW9uKFxuICBpbnB1dDogRXhwcmVzc2lvbixcbiAgdmFsdWVFeHByZXNzaW9uOiBFeHByZXNzaW9uLFxuICBrZXlFeHByZXNzaW9uPzogRXhwcmVzc2lvbixcbikge1xuICByZXR1cm4gbmV3IEZvckV4cHJlc3Npb24oXG4gICAgaW5wdXQsXG4gICAgdmFsdWVFeHByZXNzaW9uLFxuICAgIGtleUV4cHJlc3Npb24sXG4gICkgYXMgSVJlc29sdmFibGU7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5jbGFzcyBEZXBlbmRhYmxlIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZXBlbmRhYmxlOiBJVGVycmFmb3JtRGVwZW5kYWJsZSkge1xuICAgIHN1cGVyKGRlcGVuZGFibGUpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb250ZXh0LnN1cHByZXNzQnJhY2VzID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzLmRlcGVuZGFibGUuZnFuO1xuICB9XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGVuZGFibGUoZGVwZW5kYWJsZTogSVRlcnJhZm9ybURlcGVuZGFibGUpOiBzdHJpbmcge1xuICByZXR1cm4gVG9rZW4uYXNTdHJpbmcobmV3IERlcGVuZGFibGUoZGVwZW5kYWJsZSkpO1xufVxuXG5leHBvcnQgdHlwZSBFeHByZXNzaW9uID1cbiAgfCBSZWZlcmVuY2VcbiAgfCBGdW5jdGlvbkNhbGxcbiAgfCBQcm9wZXJ0eUFjY2Vzc1xuICB8IENvbmRpdGlvbmFsRXhwcmVzc2lvblxuICB8IE9wZXJhdG9yRXhwcmVzc2lvblxuICB8IERlcGVuZGFibGVcbiAgfCBGb3JFeHByZXNzaW9uXG4gIHwgc3RyaW5nXG4gIHwgc3RyaW5nW11cbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgSVJlc29sdmFibGVcbiAgfCB7IFtrZXk6IHN0cmluZ106IGFueSB9XG4gIHwgbnVsbFxuICB8IGFueSAvLyB1bHRpbWF0ZWx5IGFueSB2YWxpZCBUZXJyYWZvcm0gdHlwZSBjYW4gYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uXG4gIHwgYW55W107XG4iXX0=
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZFeHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RmRXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0UkEsOEJBRUM7QUEyREQsa0JBRUM7QUFNRCxnREFFQztBQXNERCx3Q0FFQztBQStCRCxrQ0FNQztBQThJRCxvQkFFQztBQXdERCxzQ0FVQztBQXFCRCxnQ0FFQztBQXRxQkQsMERBQXVEO0FBQ3ZELDBDQUFxRDtBQUNyRCwrQkFBNEI7QUFDNUIsdURBQW1EO0FBRW5ELDJDQUF1QztBQUN2QywrREFHaUM7QUFFakMsTUFBTSwwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQztBQUU5RDs7R0FFRztBQUNILE1BQU0sWUFBYSxTQUFRLHFCQUFTO0lBQ3hCLHFCQUFxQixDQUFDLE9BQXdCLEVBQUUsR0FBUTtRQUNoRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksb0JBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxtRUFBbUU7WUFDbkUsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUsb0VBQW9FO1lBQ3BFLHVFQUF1RTtZQUN2RSw2REFBNkQ7WUFDN0QsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSxvRUFBb0U7WUFDcEUsbUVBQW1FO1lBQ25FLHNFQUFzRTtZQUN0RSxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0Qsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSxpRUFBaUU7WUFDakUsc0VBQXNFO1lBQ3RFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUseURBQXlEO1lBQ3pELHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUsc0VBQXNFO1lBQ3RFLGtFQUFrRTtZQUNsRSxx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LENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsS0FBaUIsRUFDakIsZUFBMkIsRUFDM0IsYUFBMEI7SUFFMUIsT0FBTyxJQUFJLGFBQWEsQ0FDdEIsS0FBSyxFQUNMLGVBQWUsRUFDZixhQUFhLENBQ0MsQ0FBQztBQUNuQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVcsU0FBUSxZQUFZO0lBQ2Y7SUFBcEIsWUFBb0IsVUFBZ0M7UUFDbEQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBREEsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7SUFFcEQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQUNEOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQUMsVUFBZ0M7SUFDekQsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcIi4vdG9rZW5zL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IEludHJpbnNpYyB9IGZyb20gXCIuL3Rva2Vucy9wcml2YXRlL2ludHJpbnNpY1wiO1xuaW1wb3J0IHsgVG9rZW5pemF0aW9uLCBUb2tlbiB9IGZyb20gXCIuL3Rva2Vucy90b2tlblwiO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSBcIi4vYXBwXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCIuL3RlcnJhZm9ybS1zdGFja1wiO1xuaW1wb3J0IHsgSVRlcnJhZm9ybURlcGVuZGFibGUgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZGVwZW5kYWJsZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIHF1b3RlZFN0cmluZ0tleSxcbiAgcXVvdGVkU3RyaW5nS2V5RnJhZ21lbnQsXG59IGZyb20gXCIuL2hjbC9xdW90ZWQtc3RyaW5nLWtleVwiO1xuXG5jb25zdCBURVJSQUZPUk1fSURFTlRJRklFUl9SRUdFWCA9IC9eW19hLXpBLVpdW19hLXpBLVowLTldKiQvO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFRlcnJhZm9ybSBleHByZXNzaW9uIHRva2Vucywgd2l0aCBoZWxwZXJzIHRoYXQgcmVuZGVyIHJlc29sdmVkIGFyZ3VtZW50cyBhcyBUZXJyYWZvcm0gc3ludGF4LlxuICovXG5jbGFzcyBURkV4cHJlc3Npb24gZXh0ZW5kcyBJbnRyaW5zaWMgaW1wbGVtZW50cyBJUmVzb2x2YWJsZSB7XG4gIHByb3RlY3RlZCByZXNvbHZlRXhwcmVzc2lvblBhcnQoY29udGV4dDogSVJlc29sdmVDb250ZXh0LCBhcmc6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzb2x2ZWRBcmcgPSBjb250ZXh0LnJlc29sdmUoYXJnKTtcbiAgICBpZiAoVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShhcmcpKSB7XG4gICAgICAvLyBBIHJlc29sdmFibGUgYXJnIChlLmcuIGBjZGt0bi5Ub2tlbi5udWxsVmFsdWUoKWAsIGFuIElSZXNvbHZhYmxlXG4gICAgICAvLyB3cmFwcGluZyBgbnVsbGAgLSBzZWUgVG9rZW4ubnVsbFZhbHVlKCkvVG9rZW4uYXNBbnkoKSkgY2FuIGl0c2VsZlxuICAgICAgLy8gcmVzb2x2ZSB0byBgbnVsbGAvYHVuZGVmaW5lZGAuIENvbGxhcHNlIHRoYXQgdG8gdGhlIGxpdGVyYWwgXCJudWxsXCJcbiAgICAgIC8vIHN0cmluZyB0b28sIGZvciB0aGUgZXhhY3Qgc2FtZSByZWFzb24gYXMgdGhlIHBsYWluLW51bGwvdW5kZWZpbmVkXG4gICAgICAvLyBicmFuY2ggZnVydGhlciBkb3duOiBBcnJheS5wcm90b3R5cGUuam9pbigpICh1c2VkIGJ5IGNhbGxlcnMgbGlrZVxuICAgICAgLy8gRnVuY3Rpb25DYWxsLnJlc29sdmUoKSkgdHJlYXRzIGEgYG51bGxgL2B1bmRlZmluZWRgIGFycmF5IEVMRU1FTlQgYXNcbiAgICAgIC8vIGFuIGVtcHR5IHN0cmluZywgc2lsZW50bHkgZHJvcHBpbmcgdGhlIGFyZ3VtZW50IGluc3RlYWQgb2ZcbiAgICAgIC8vIHJlbmRlcmluZyB0aGUgVGVycmFmb3JtIGBudWxsYCBrZXl3b3JkLiBXaXRob3V0IHRoaXMsIG9ubHkgYVxuICAgICAgLy8gbGl0ZXJhbCBKUyBgbnVsbGAvYHVuZGVmaW5lZGAgYXJndW1lbnQgcmVuZGVyZWQgY29ycmVjdGx5IC0gYVxuICAgICAgLy8gcmVzb2x2YWJsZSB0b2tlbiB0aGF0IHJlc29sdmVzIHRvIGBudWxsYCAodGhlIG9ubHkgd2F5IHRvIHBhc3MgYW5cbiAgICAgIC8vIGV4cGxpY2l0IGBudWxsYCBpbiBhIGpzaWktdHlwZWQgZml4ZWQgcG9zaXRpb24sIHNpbmNlIGpzaWkgY2FuJ3RcbiAgICAgIC8vIGV4cHJlc3MgYSBsaXRlcmFsIGBudWxsYCBwYXJhbWV0ZXIgdHlwZSkgc2lsZW50bHkgdmFuaXNoZWQgaW5zdGVhZC5cbiAgICAgIGlmIChyZXNvbHZlZEFyZyA9PT0gbnVsbCB8fCByZXNvbHZlZEFyZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVzb2x2YWJsZSBjYW4gaXRzZWxmIHJlc29sdmUgdG8gYSBwbGFpbiAodW5lbmNvZGVkKSBhcnJheS9vYmplY3RcbiAgICAgIC8vIHJhdGhlciB0aGFuIGFuIGFscmVhZHktcmVuZGVyZWQgc3RyaW5nIC0gZS5nLiBhIG1hbnVhbGx5LWNvbnN0cnVjdGVkXG4gICAgICAvLyB3aG9sZS1jb2xsZWN0aW9uIHRva2VuIGxpa2UgYGNka3RuLlRva2VuLmFzQW55KFt0cnVlLCBmYWxzZV0pYFxuICAgICAgLy8gKGV4YWN0bHkgdGhlIHNoYXBlIGEganNpaS10eXBlZCBgQXJyYXk8Ym9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlPlxuICAgICAgLy8gfCBjZGt0bi5JUmVzb2x2YWJsZWAgcHJvdmlkZXItZnVuY3Rpb24gcGFyYW1ldGVyIG5vdyBhY2NlcHRzIC0gc2VlXG4gICAgICAvLyBwcm92aWRlci1mdW5jdGlvbi1tb2RlbC50cykuIEZvcm1hdCBpdCB0aGUgc2FtZSBicmFja2V0L2JyYWNlIHdheVxuICAgICAgLy8gdGhlIHBsYWluIGFycmF5L29iamVjdCBicmFuY2hlcyBiZWxvdyBkbywgcmVjdXJzaW5nIG9uXG4gICAgICAvLyBgcmVzb2x2ZWRBcmdgJ3Mgb3duIGVsZW1lbnRzIChOT1QgYGFyZ2AncyAtIGBhcmdgIGlzIHRoZSByZXNvbHZhYmxlXG4gICAgICAvLyB3cmFwcGVyIGl0c2VsZiwgbm90IGluZGV4YWJsZS9rZXlhYmxlKS4gV2l0aG91dCB0aGlzLCB0aGUgYXJyYXlcbiAgICAgIC8vIGJyYW5jaCBiZWxvdyBpcyB1bnJlYWNoYWJsZSBmb3IgYSByZXNvbHZhYmxlIGFyZyAodGhpcyBgaWZgIGFscmVhZHlcbiAgICAgIC8vIHJldHVybmVkKSwgc28gdGhlIHJhdyBhcnJheS9vYmplY3QgZmVsbCBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZVxuICAgICAgLy8gcGxhaW4gYHJldHVybiByZXNvbHZlZEFyZ2AgYXQgdGhlIGJvdHRvbSAtIHJlbHlpbmcgb24gdGhlIGNhbGxlcidzXG4gICAgICAvLyBgQXJyYXkucHJvdG90eXBlLmpvaW4oKWAgKEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKCkgZXQgYWwuKSB0b1xuICAgICAgLy8gc3RyaW5naWZ5IGl0LCB3aGljaCBkcm9wcyBhbiBhcnJheSdzIGJyYWNrZXRzL3NwYWNpbmcgKHJlbmRlcnNcbiAgICAgIC8vIGB0cnVlLGZhbHNlYCBpbnN0ZWFkIG9mIGBbdHJ1ZSwgZmFsc2VdYCkgYW5kLCBmb3IgYW4gb2JqZWN0LCB3b3VsZFxuICAgICAgLy8gcHJvZHVjZSB0aGUgdXNlbGVzcyBsaXRlcmFsIHN0cmluZyBgW29iamVjdCBPYmplY3RdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc29sdmVkQXJnKSkge1xuICAgICAgICByZXR1cm4gYFske3Jlc29sdmVkQXJnXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIGl0ZW0pKVxuICAgICAgICAgIC5qb2luKFwiLCBcIil9XWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmVkQXJnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBgeyR7T2JqZWN0LmtleXMocmVzb2x2ZWRBcmcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICAgIGAke3RoaXMucmVzb2x2ZU9iamVjdEtleShjb250ZXh0LCBrZXkpfSA9ICR7dGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHJlc29sdmVkQXJnW2tleV0pfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qb2luKFwiLCBcIil9fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRBcmc7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc29sdmVkQXJnKSkge1xuICAgICAgcmV0dXJuIGBbJHtyZXNvbHZlZEFyZ1xuICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIGFyZ1tpbmRleF0pKVxuICAgICAgICAuam9pbihcIiwgXCIpfV1gO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWRBcmcgPT09IFwib2JqZWN0XCIgJiYgcmVzb2x2ZWRBcmcgIT09IG51bGwpIHtcbiAgICAgIC8vIFVzZSBhcmcncyBvd24ga2V5cywgbm90IHJlc29sdmVkQXJnJ3M6IGNvbnRleHQucmVzb2x2ZSgpIGRlZXAtcmVzb2x2ZXNcbiAgICAgIC8vIG9iamVjdCBrZXlzIHRvbywgcmVwbGFjaW5nIGEgdG9rZW4gcGxhY2Vob2xkZXIgd2l0aCBpdHMgcmVzb2x2ZWRcbiAgICAgIC8vIHJlZmVyZW5jZSB0ZXh0IGFuZCBkcm9wcGluZyB0aGUgYCR7Li4ufWAgd3JhcHBlciwgc28gcmVzb2x2ZWRBcmcnc1xuICAgICAgLy8ga2V5cyBubyBsb25nZXIgbG9vayBsaWtlIHRva2VucyBhbmQgbm8gbG9uZ2VyIG1hdGNoIGBhcmdgJ3MuXG4gICAgICAvLyBjb250ZXh0LnJlc29sdmUoKSBhbHNvIGRyb3BzIHVuZGVmaW5lZC12YWx1ZWQgZW50cmllcyAobWlycm9yaW5nXG4gICAgICAvLyBKU09OLnN0cmluZ2lmeSksIHNvIGZpbHRlciB0aG9zZSBvdXQgaGVyZSB0byBtYXRjaCByZXNvbHZlZEFyZydzIGtleXMuXG4gICAgICAvLyBBIHJlc29sdmFibGUgdmFsdWUgKGUuZy4gTGF6eS5hbnlWYWx1ZSgpKSBvbmx5IHJldmVhbHMgYHVuZGVmaW5lZGBcbiAgICAgIC8vIG9uY2UgcmVzb2x2ZWQsIHNvIHJlc29sdmUgdGhlIHZhbHVlIC0gbm90IGp1c3QgY2hlY2sgYGFyZ1trZXldYCAtIHRvXG4gICAgICAvLyBkZXRlY3QgaXQuXG4gICAgICByZXR1cm4gYHske09iamVjdC5rZXlzKGFyZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBjb250ZXh0LnJlc29sdmUoYXJnW2tleV0pICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5tYXAoXG4gICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgIGAke3RoaXMucmVzb2x2ZU9iamVjdEtleShjb250ZXh0LCBrZXkpfSA9ICR7dGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIGFyZ1trZXldKX1gLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiLCBcIil9fWA7XG4gICAgfVxuXG4gICAgLy8gQSBsaXRlcmFsIGBudWxsYC9gdW5kZWZpbmVkYCBhcmd1bWVudCAoZS5nLiBhIGZpeGVkLWFyaXR5IHByb3ZpZGVyXG4gICAgLy8gZnVuY3Rpb24gcG9zaXRpb25hbCBzbG90IHRoZSBjYWxsZXIgaW50ZW50aW9uYWxseSBsZWZ0IGVtcHR5KSBtdXN0IGJlXG4gICAgLy8gcmVuZGVyZWQgYXMgdGhlIFRlcnJhZm9ybSBgbnVsbGAga2V5d29yZC4gV2l0aG91dCB0aGlzLCBgcmVzb2x2ZWRBcmdgXG4gICAgLy8gc3RheXMgYG51bGxgL2B1bmRlZmluZWRgIGFuZCBBcnJheS5wcm90b3R5cGUuam9pbigpICh1c2VkIGJ5IGNhbGxlcnNcbiAgICAvLyBsaWtlIEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKCkpIHNpbGVudGx5IGNvbGxhcHNlcyBpdCB0byBhbiBlbXB0eSBzdHJpbmcsXG4gICAgLy8gc2hpZnRpbmcvZHJvcHBpbmcgdGhlIGFyZ3VtZW50IGluc3RlYWQgb2YgcmVuZGVyaW5nIGBudWxsYC5cbiAgICBpZiAocmVzb2x2ZWRBcmcgPT09IG51bGwgfHwgcmVzb2x2ZWRBcmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZEFyZztcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQXJnKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCwgYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc29sdmVkQXJnID0gY29udGV4dC5yZXNvbHZlKGFyZyk7XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3Qgc3RyID0gdGhpcy5yZXNvbHZlU3RyaW5nKGFyZywgcmVzb2x2ZWRBcmcpO1xuICAgICAgLy8gV2hlbiBUb2tlbi5hc1N0cmluZygpIGlzIHVzZWQgb24gYW4gb2JqZWN0LCBzdHIgd2lsbCBiZSB0aGUgb2JqZWN0IGFuZCBuZWVkcyB0byBiZSByZXNvbHZlZCBkaWZmZXJlbnRseVxuICAgICAgLy8gVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIGluIE1hcFRlcnJhZm9ybUl0ZXJhdG9yI19nZXRGb3JFYWNoRXhwcmVzc2lvbiBhbmQgY2FuIGNhdXNlIGlzc3VlcyBsaWtlICMzNTQwXG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRXhwcmVzc2lvblBhcnQoY29udGV4dCwgc3RyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQsIGFyZyk7XG4gIH1cblxuICAvLyBBbiBvYmplY3Qga2V5IGJ1aWx0IGZyb20gYSB0b2tlbiAoZS5nLiBge1tyZXMuaWRdOiBcInZcIn1gKSBpcyBhIEpTIHN0cmluZ1xuICAvLyBob2xkaW5nIHRoZSB0b2tlbidzIHBsYWNlaG9sZGVyIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgaGVyZSwgYW5kIHJlYWRzXG4gIC8vIGlkZW50aWNhbGx5IHRvIGEgbGl0ZXJhbCBrZXkgdW5sZXNzIHdlIGNoZWNrIGZvciB0aGUgcGxhY2Vob2xkZXIuXG4gIC8vIEhDTCBoYXMgbm8gb2JqZWN0LWtleSBpbnRlcnBvbGF0aW9uIHN5bnRheCwgc28gYSB0b2tlbiBrZXkgY2FuIG9ubHkgYmVcbiAgLy8gZXhwcmVzc2VkIGFzIGEgcGFyZW50aGVzaXNlZCBrZXkgZXhwcmVzc2lvbiwgZS5nLiBgKHJlc291cmNlLmlkKSA9IFwidlwiYC5cbiAgcHJpdmF0ZSByZXNvbHZlT2JqZWN0S2V5KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKGtleSk7XG4gICAgY29uc3QgaGFzVG9rZW4gPSB0b2tlbkxpc3QudG9rZW5zLmxlbmd0aCArIHRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoID4gMDtcblxuICAgIGlmICghaGFzVG9rZW4pIHtcbiAgICAgIHJldHVybiBxdW90ZWRTdHJpbmdLZXkoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCgke3RoaXMucmVzb2x2ZVRva2VuS2V5KGNvbnRleHQsIGtleSl9KWA7XG4gIH1cblxuICAvLyBBIG1peGVkIGxpdGVyYWwvdG9rZW4ga2V5IChlLmcuIGB7W2BwcmVmaXgtJHtyZXMuaWR9YF06IFwidlwifWApIG11c3Qgc3RheSBhXG4gIC8vIGtleSBleHByZXNzaW9uLCBub3QgZ28gdGhyb3VnaCByZXNvbHZlQXJnKCkncyByZXNvbHZlU3RyaW5nKCksIHdoaWNoXG4gIC8vIGVzY2FwZXMgYSBsaXRlcmFsIGZyYWdtZW50IGZvciB1c2UgYXMgYSBUZXJyYWZvcm0gKnZhbHVlKiAob25seSBgXFxuYCBhbmRcbiAgLy8gYCR7YCkgcmF0aGVyIHRoYW4gYXMgYSBxdW90ZWQtc3RyaW5nICprZXkqICh3aGljaCBhbHNvIG5lZWRzIHF1b3RlcyBhbmRcbiAgLy8gYmFja3NsYXNoZXMgZXNjYXBlZCkuXG4gIHByaXZhdGUgcmVzb2x2ZVRva2VuS2V5KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKGtleSk7XG4gICAgY29uc3QgbnVtYmVyT2ZUb2tlbnMgPSB0b2tlbkxpc3QudG9rZW5zLmxlbmd0aCArIHRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoO1xuXG4gICAgLy8gQSBrZXkgdGhhdCBpcyBvbmx5IGEgdG9rZW4gKG5vIGxpdGVyYWwgZnJhZ21lbnRzKSBpcyBhIGJhcmUgcmVmZXJlbmNlXG4gICAgLy8gZXhwcmVzc2lvbiwgbm90IGEgcXVvdGVkIHN0cmluZyAtIGUuZy4gYChyZXNvdXJjZS5pZCkgPSBcInZcImAuXG4gICAgaWYgKFxuICAgICAgdG9rZW5MaXN0LmxpdGVyYWxzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdG9rZW5MaXN0LmVzY2FwZXMubGVuZ3RoID09PSAwICYmXG4gICAgICBudW1iZXJPZlRva2VucyA9PT0gMVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbnRleHQucmVzb2x2ZShrZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IGpvaW5SZXN1bHQgPSB0b2tlbkxpc3Quam9pbih7XG4gICAgICBqb2luOiAobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgICAgY29uc3QgbGVmdFRva2VucyA9IFRva2VuaXphdGlvbi5yZXZlcnNlKGxlZnQpO1xuICAgICAgICBjb25zdCBsZWZ0VG9rZW5MaXN0ID0gVG9rZW5pemF0aW9uLnJldmVyc2VTdHJpbmcobGVmdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0VG9rZW5zID0gVG9rZW5pemF0aW9uLnJldmVyc2UocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IGxlZnRUb2tlbkNvdW50ID1cbiAgICAgICAgICBsZWZ0VG9rZW5MaXN0LmludHJpbnNpYy5sZW5ndGggKyBsZWZ0VG9rZW5MaXN0LnRva2Vucy5sZW5ndGg7XG5cbiAgICAgICAgbGV0IGxlZnRWYWx1ZSA9IGxlZnQ7XG5cbiAgICAgICAgaWYgKGxlZnRUb2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAxICYmIGxlZnRUb2tlbkNvdW50ID09PSAwKSB7XG4gICAgICAgICAgbGVmdFZhbHVlID0gcXVvdGVkU3RyaW5nS2V5RnJhZ21lbnQobGVmdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVmdFRva2VuTGlzdC5saXRlcmFscy5sZW5ndGggPT09IDAgJiYgbGVmdFRva2VuQ291bnQgPT09IDEpIHtcbiAgICAgICAgICBsZWZ0VmFsdWUgPSBgXFwkeyR7bGVmdFRva2Vuc1swXX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPVxuICAgICAgICAgIHJpZ2h0VG9rZW5zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmdLZXlGcmFnbWVudChyaWdodClcbiAgICAgICAgICAgIDogYFxcJHske3JpZ2h0VG9rZW5zWzBdfX1gO1xuXG4gICAgICAgIHJldHVybiBgJHtsZWZ0VmFsdWV9JHtyaWdodFZhbHVlfWA7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGBcIiR7am9pblJlc3VsdH1cImA7XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlIHN0cmluZyByZW1vdmVzIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIFRlcnJhZm9ybSBvciBKU09OXG4gICAqIEl0IG11c3Qgb25seSBiZSB1c2VkIG9uIG5vbi10b2tlbiB2YWx1ZXNcbiAgICovXG4gIHByb3RlY3RlZCBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIikgLy8gZXNjYXBlIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFwkey9nLCBcIiQkJHtcIik7IC8vIGVzY2FwZSAkeyB0byAkJHtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0cmluZyhzdHI6IHN0cmluZywgcmVzb2x2ZWRBcmc6IGFueSkge1xuICAgIGNvbnN0IHRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKHN0cik7XG4gICAgY29uc3QgbnVtYmVyT2ZUb2tlbnMgPSB0b2tlbkxpc3QudG9rZW5zLmxlbmd0aCArIHRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoO1xuXG4gICAgLy8gU3RyaW5nIGxpdGVyYWxcbiAgICBpZiAobnVtYmVyT2ZUb2tlbnMgPT09IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlZEFyZyAhPT0gYFwiYCAmJlxuICAgICAgICByZXNvbHZlZEFyZy5zdGFydHNXaXRoKCdcIicpICYmXG4gICAgICAgIHJlc29sdmVkQXJnLmVuZHNXaXRoKCdcIicpXG4gICAgICAgID8gdGhpcy5lc2NhcGVTdHJpbmcocmVzb2x2ZWRBcmcpXG4gICAgICAgIDogYFwiJHt0aGlzLmVzY2FwZVN0cmluZyhyZXNvbHZlZEFyZyl9XCJgO1xuICAgIH1cblxuICAgIC8vIE9ubHkgYSB0b2tlbiByZWZlcmVuY2VcbiAgICBpZiAoXG4gICAgICB0b2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAwICYmXG4gICAgICB0b2tlbkxpc3QuZXNjYXBlcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIG51bWJlck9mVG9rZW5zID09PSAxXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRBcmc7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIGxpdGVyYWwgKyB0b2tlbiByZWZlcmVuY2UgY29tYmluYXRpb25cbiAgICBjb25zdCBqb2luUmVzdWx0ID0gdG9rZW5MaXN0LmpvaW4oe1xuICAgICAgam9pbjogKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZnRUb2tlbnMgPSBUb2tlbml6YXRpb24ucmV2ZXJzZShsZWZ0KTtcbiAgICAgICAgY29uc3QgbGVmdFRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodFRva2VucyA9IFRva2VuaXphdGlvbi5yZXZlcnNlKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCBsZWZ0VG9rZW5Db3VudCA9XG4gICAgICAgICAgbGVmdFRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoICsgbGVmdFRva2VuTGlzdC50b2tlbnMubGVuZ3RoO1xuXG4gICAgICAgIC8vIGlmIGxlZnQgaXMgbWl4ZWQsIG5lZWRzIHRvIGJlIGxlZnQgYWxvbmUgKGJlY2F1c2UgaXQncyBhIHJlc3VsdCBvZiBhIHByZXZpb3VzIGpvaW4gaXRlcmF0aW9uKVxuICAgICAgICBsZXQgbGVmdFZhbHVlID0gbGVmdDtcblxuICAgICAgICAvLyBpZiBsZWZ0IGlzIGEgc3RyaW5nIGxpdGVyYWwsIHRoZW4gd2UgbmVlZCB0byBlc2NhcGUgaXRcbiAgICAgICAgaWYgKGxlZnRUb2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAxICYmIGxlZnRUb2tlbkNvdW50ID09PSAwKSB7XG4gICAgICAgICAgbGVmdFZhbHVlID0gdGhpcy5lc2NhcGVTdHJpbmcobGVmdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBsZWZ0IGlzIG9ubHkgYSB0b2tlbiwgbmVlZHMgdG8gYmUgd3JhcHBlZCBhcyB0ZXJyYWZvcm0gZXhwcmVzc2lvblxuICAgICAgICBpZiAobGVmdFRva2VuTGlzdC5saXRlcmFscy5sZW5ndGggPT09IDAgJiYgbGVmdFRva2VuQ291bnQgPT09IDEpIHtcbiAgICAgICAgICBsZWZ0VmFsdWUgPSBgXFwkeyR7bGVmdFRva2Vuc1swXX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPVxuICAgICAgICAgIHJpZ2h0VG9rZW5zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyB0aGlzLmVzY2FwZVN0cmluZyhyaWdodClcbiAgICAgICAgICAgIDogYFxcJHske3JpZ2h0VG9rZW5zWzBdfX1gO1xuXG4gICAgICAgIHJldHVybiBgJHtsZWZ0VmFsdWV9JHtyaWdodFZhbHVlfWA7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGpvaW5SZXN1bHQgIT09IGBcImAgJiZcbiAgICAgIGpvaW5SZXN1bHQuc3RhcnRzV2l0aCgnXCInKSAmJlxuICAgICAgam9pblJlc3VsdC5lbmRzV2l0aCgnXCInKVxuICAgICAgPyBqb2luUmVzdWx0XG4gICAgICA6IGBcIiR7am9pblJlc3VsdH1cImA7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHByZXNzaW9uIHRoYXQgcmVuZGVycyBhIGxpdGVyYWwgc3RyaW5nIHdpdGggbmV3bGluZXMsIGAke2Agc2VxdWVuY2VzIGFuZCBkb3VibGUgcXVvdGVzIGVzY2FwZWQuXG4gKi9cbmNsYXNzIFJhd1N0cmluZyBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc3RyOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzdHIpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29uc3QgcXRzID0gY29udGV4dC5zdXBwcmVzc0JyYWNlcyA/IGBcImAgOiBgYDtcbiAgICByZXR1cm4gYCR7cXRzfSR7dGhpcy5lc2NhcGVTdHJpbmcodGhpcy5zdHIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX0ke3F0c31gO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0cjtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGEgc3RyaW5nIHNvIGl0IGlzIHJlbmRlcmVkIGFzIGFuIGVzY2FwZWQgVGVycmFmb3JtIHN0cmluZyBsaXRlcmFsXG4gKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdG8gZXNjYXBlXG4gKiBAcmV0dXJucyBBIHJlc29sdmFibGUgdGhhdCByZW5kZXJzIHRoZSBlc2NhcGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmF3U3RyaW5nKHN0cjogc3RyaW5nKTogSVJlc29sdmFibGUge1xuICByZXR1cm4gbmV3IFJhd1N0cmluZyhzdHIpO1xufVxuXG4vKipcbiAqIEV4cHJlc3Npb24gcmVmZXJlbmNpbmcgYSBUZXJyYWZvcm0gaWRlbnRpZmllci4gV2hlbiByZXNvbHZlZCBpbiBhIHN0YWNrIG90aGVyIHRoYW4gaXRzIG9yaWdpbiBzdGFjaywgaXQgaXNcbiAqIHJlbmRlcmVkIGFzIGEgY3Jvc3Mtc3RhY2sgcmVmZXJlbmNlIGluc3RlYWQuXG4gKi9cbmNsYXNzIFJlZmVyZW5jZSBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIC8qKlxuICAgKiBBIHNpbmdsZSByZWZlcmVuY2UgY291bGQgYmUgdXNlZCBpbiBtdWx0aXBsZSBzdGFja3MsXG4gICAqIGUuZy4gaWYgd2UgZXhwb3NlIHRoZSByZWYgZGlyZWN0bHkgb3IgYXMgdG9rZW4gb24gdGhlIHN0YWNrLlxuICAgKiBXZSBuZWVkIHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIGZvciBlYWNoIHN0YWNrLFxuICAgKiBzbyB0aGF0IHRoZSByZXNvbHZlZCBpZGVudGlmaWVyIHN0cmluZyBtYXRjaGVzIHRoZSBzdGFjayBpdCdzIHJlc29sdmVkIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBjcm9zc1N0YWNrSWRlbnRpZmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBwcml2YXRlIG9yaWdpblN0YWNrPzogVGVycmFmb3JtU3RhY2ssXG4gICkge1xuICAgIHN1cGVyKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICAvLyBXZSBjaGVjayBmb3IgY3Jvc3Mgc3RhY2sgcmVmZXJlbmNlcyBvbiBwcmVwYXJhdGlvbiwgc2V0dGluZyBhIG5ldyBpZGVudGlmaWVyXG4gICAgY29uc3QgcmVzb2x1dGlvblN0YWNrID0gVGVycmFmb3JtU3RhY2sub2YoY29udGV4dC5zY29wZSk7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gcmVzb2x1dGlvblN0YWNrLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuXG4gICAgaWYgKGNvbnRleHQucHJlcGFyaW5nKSB7XG4gICAgICAvLyBDcm9zcyBzdGFjayByZWZlcmVuY2VcbiAgICAgIGlmICh0aGlzLm9yaWdpblN0YWNrICYmIHRoaXMub3JpZ2luU3RhY2sgIT09IHJlc29sdXRpb25TdGFjaykge1xuICAgICAgICBjb25zdCBhcHAgPSBBcHAub2YodGhpcy5vcmlnaW5TdGFjayk7XG4gICAgICAgIGNvbnN0IGNzciA9IGFwcC5jcm9zc1N0YWNrUmVmZXJlbmNlKFxuICAgICAgICAgIHRoaXMub3JpZ2luU3RhY2ssXG4gICAgICAgICAgcmVzb2x1dGlvblN0YWNrLFxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllcixcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNyb3NzU3RhY2tJZGVudGlmaWVyW3N0YWNrTmFtZV0gPSBjc3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIGNyb3NzIHN0YWNrIHJlZmVyZW5jZSB3ZSB3aWxsIHJlc29sdmUgdG8gYSByZWZlcmVuY2Ugd2l0aGluIHRoaXMgc3RhY2suXG4gICAgaWYgKHRoaXMuY3Jvc3NTdGFja0lkZW50aWZpZXJbc3RhY2tOYW1lXSkge1xuICAgICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzXG4gICAgICAgID8gdGhpcy5jcm9zc1N0YWNrSWRlbnRpZmllcltzdGFja05hbWVdXG4gICAgICAgIDogYFxcJHske3RoaXMuY3Jvc3NTdGFja0lkZW50aWZpZXJbc3RhY2tOYW1lXX19YDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyB0aGlzLmlkZW50aWZpZXIgOiBgXFwkeyR7dGhpcy5pZGVudGlmaWVyfX1gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhIFRlcnJhZm9ybSBpZGVudGlmaWVyLCBlLmcuIGBhd3NfaW5zdGFuY2Uud2ViLmlkYFxuICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIFRlcnJhZm9ybSBpZGVudGlmaWVyIHRvIHJlZmVyZW5jZVxuICogQHBhcmFtIHN0YWNrIFRoZSBzdGFjayB0aGUgcmVmZXJlbmNlZCBpZGVudGlmaWVyIGJlbG9uZ3MgdG8sIHVzZWQgdG8gZGV0ZWN0IGNyb3NzLXN0YWNrIHJlZmVyZW5jZXNcbiAqIEByZXR1cm5zIEEgcmVzb2x2YWJsZSB0aGF0IHJlbmRlcnMgdGhlIHJlZmVyZW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmKGlkZW50aWZpZXI6IHN0cmluZywgc3RhY2s/OiBUZXJyYWZvcm1TdGFjayk6IElSZXNvbHZhYmxlIHtcbiAgcmV0dXJuIG5ldyBSZWZlcmVuY2UoaWRlbnRpZmllciwgc3RhY2spO1xufVxuXG4vKipcbiAqIG1hcmtzIHRoZSBhcmd1bWVudCBhcyBiZWluZyB1c2VkIGluIGEgdGVycmFmb3JtIGV4cHJlc3Npb25cbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNpZGVUZkV4cHJlc3Npb24oYXJnOiBhbnkpIHtcbiAgcmV0dXJuIGFyZztcbn1cblxuLyoqXG4gKiBFeHByZXNzaW9uIGFjY2Vzc2luZyBwcm9wZXJ0aWVzLCBpbmRpY2VzIG9yIHNwbGF0cyAoYFsqXWApIG9uIGEgdGFyZ2V0LCBlLmcuIGB0YXJnZXQucHJvcFswXWAuXG4gKi9cbmNsYXNzIFByb3BlcnR5QWNjZXNzIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0YXJnZXQ6IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSBhcmdzOiBFeHByZXNzaW9uW10sXG4gICkge1xuICAgIHN1cGVyKHsgdGFyZ2V0LCBhcmdzIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG5cbiAgICBjb25zdCBzZXJpYWxpemVkQXJncyA9IHRoaXMuYXJnc1xuICAgICAgLm1hcCgoYXJnKSA9PiB7XG4gICAgICAgIGlmIChhcmcgPT09IGAqYCkge1xuICAgICAgICAgIHJldHVybiBcIlsqXVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmcpO1xuICAgICAgICBjb25zdCBpc1BsYWluU3RyaW5nID1cbiAgICAgICAgICB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIFRFUlJBRk9STV9JREVOVElGSUVSX1JFR0VYLnRlc3QoYXJnKTtcbiAgICAgICAgY29uc3QgaXNQbGFpbk51bWJlciA9XG4gICAgICAgICAgdHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGFyZyk7XG5cbiAgICAgICAgaWYgKGlzUGxhaW5TdHJpbmcgfHwgaXNQbGFpbk51bWJlcikge1xuICAgICAgICAgIHJldHVybiBgLiR7YXJnfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYFske2F9XWA7XG4gICAgICB9KSAvLyBwcm9wZXJ0eSBhY2Nlc3NcbiAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgY29uc3QgdGFyZ2V0RXhwciA9XG4gICAgICBDb25zdHJ1Y3QuaXNDb25zdHJ1Y3QodGhpcy50YXJnZXQpICYmIFwiZnFuXCIgaW4gdGhpcy50YXJnZXRcbiAgICAgICAgPyB0aGlzLnRhcmdldC5mcW5cbiAgICAgICAgOiB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy50YXJnZXQpO1xuXG4gICAgY29uc3QgZXhwciA9IGAke3RhcmdldEV4cHJ9JHtzZXJpYWxpemVkQXJnc31gO1xuXG4gICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzID8gZXhwciA6IGBcXCR7JHtleHByfX1gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb3BlcnR5IGFjY2VzcyBleHByZXNzaW9uLCBlLmcuIGB0YXJnZXQucHJvcFswXWBcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGV4cHJlc3Npb24gdG8gYWNjZXNzIHByb3BlcnRpZXMgb25cbiAqIEBwYXJhbSBhcmdzIFRoZSBwcm9wZXJ0eSBuYW1lcywgaW5kaWNlcyBvciBgKmAgKHNwbGF0KSB0byBhY2Nlc3MsIGluIG9yZGVyXG4gKiBAcmV0dXJucyBBIHJlc29sdmFibGUgdGhhdCByZW5kZXJzIHRoZSBwcm9wZXJ0eSBhY2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5QWNjZXNzKHRhcmdldDogRXhwcmVzc2lvbiwgYXJnczogRXhwcmVzc2lvbltdKSB7XG4gIHJldHVybiBuZXcgUHJvcGVydHlBY2Nlc3ModGFyZ2V0LCBhcmdzKSBhcyBJUmVzb2x2YWJsZTtcbn1cblxuLyoqXG4gKiBFeHByZXNzaW9uIHJlbmRlcmluZyBhIFRlcnJhZm9ybSBjb25kaXRpb25hbCwgZS5nLiBgY29uZGl0aW9uID8gdHJ1ZVZhbHVlIDogZmFsc2VWYWx1ZWAuXG4gKi9cbmNsYXNzIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZGl0aW9uOiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUgdHJ1ZVZhbHVlOiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUgZmFsc2VWYWx1ZTogRXhwcmVzc2lvbixcbiAgKSB7XG4gICAgc3VwZXIoeyBjb25kaXRpb24sIHRydWVWYWx1ZSwgZmFsc2VWYWx1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuXG4gICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHRoaXMuY29uZGl0aW9uKTtcbiAgICBjb25zdCB0cnVlVmFsdWUgPSB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy50cnVlVmFsdWUpO1xuICAgIGNvbnN0IGZhbHNlVmFsdWUgPSB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy5mYWxzZVZhbHVlKTtcblxuICAgIGNvbnN0IGV4cHIgPSBgJHtjb25kaXRpb259ID8gJHt0cnVlVmFsdWV9IDogJHtmYWxzZVZhbHVlfWA7XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyBleHByIDogYFxcJHske2V4cHJ9fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBjcmVhdGVzIGFuIGV4cHJlc3Npb24gbGlrZSBgdHJ1ZSA/IDEgOiAwYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWwoXG4gIGNvbmRpdGlvbjogRXhwcmVzc2lvbixcbiAgdHJ1ZVZhbHVlOiBFeHByZXNzaW9uLFxuICBmYWxzZVZhbHVlOiBFeHByZXNzaW9uLFxuKSB7XG4gIHJldHVybiBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKGNvbmRpdGlvbiwgdHJ1ZVZhbHVlLCBmYWxzZVZhbHVlKTtcbn1cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZXhwcmVzc2lvbnMvb3BlcmF0b3JzXG5leHBvcnQgdHlwZSBPcGVyYXRvciA9XG4gIHwgXCIhXCJcbiAgfCBcIi1cIlxuICB8IFwiKlwiXG4gIHwgXCIvXCJcbiAgfCBcIiVcIlxuICB8IFwiK1wiXG4gIHwgXCI+XCJcbiAgfCBcIj49XCJcbiAgfCBcIjxcIlxuICB8IFwiPD1cIlxuICB8IFwiPT1cIlxuICB8IFwiIT1cIlxuICB8IFwiJiZcIlxuICB8IFwifHxcIjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBPcGVyYXRvciBFeHByZXNzaW9uc1xuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRvckV4cHJlc3Npb24gZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9wZXJhdG9yOiBPcGVyYXRvcixcbiAgICBwcml2YXRlIGxlZnQ6IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSByaWdodD86IEV4cHJlc3Npb24sIC8vIG9wdGlvbmFsIGZvciAhIGFuZCAtIG9wZXJhdG9yXG4gICkge1xuICAgIHN1cGVyKHsgb3BlcmF0b3IsIGxlZnRWYWx1ZTogbGVmdCwgcmlnaHRWYWx1ZTogcmlnaHQgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1cHByZXNzQnJhY2VzID0gY29udGV4dC5zdXBwcmVzc0JyYWNlcztcbiAgICBjb250ZXh0LnN1cHByZXNzQnJhY2VzID0gdHJ1ZTtcblxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy5sZWZ0KTtcbiAgICBjb25zdCByaWdodCA9XG4gICAgICB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgdGhpcy5yaWdodClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgZXhwciA9IFwiXCI7XG4gICAgc3dpdGNoICh0aGlzLm9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFwiIVwiOiB7XG4gICAgICAgIGV4cHIgPSBgISR7bGVmdH1gOyAvLyBubyBicmFjZXMgbmVlZGVkIGFzICEgaGFzIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCItXCI6IHtcbiAgICAgICAgaWYgKHJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBzdWJ0cmFjdGlvblxuICAgICAgICAgIGV4cHIgPSBgKCR7bGVmdH0gLSAke3JpZ2h0fSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5lZ2F0aW9uXG4gICAgICAgICAgZXhwciA9IGAtJHtsZWZ0fWA7IC8vIG5vIGJyYWNlcyBuZWVkZWQgYXMgLSBoYXMgaGlnaGVzdCBwcmVjZWRlbmNlXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGV4cHIgPSBgKCR7bGVmdH0gJHt0aGlzLm9wZXJhdG9yfSAke3JpZ2h0fSlgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdXBwcmVzc0JyYWNlcyA/IGV4cHIgOiBgXFwkeyR7ZXhwcn19YDtcbiAgfVxufVxuXG4vKipcbiAqIEV4cHJlc3Npb24gcmVuZGVyaW5nIGEgVGVycmFmb3JtIGZ1bmN0aW9uIGNhbGwsIGUuZy4gYG5hbWUoYXJnMSwgYXJnMilgLiBSZWNvcmRzIHRoZSBmdW5jdGlvbidzIHVzYWdlIG9uIHRoZVxuICogc3RhY2sgaXQgaXMgcmVzb2x2ZWQgaW4uXG4gKi9cbmNsYXNzIEZ1bmN0aW9uQ2FsbCBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgYXJnczogRXhwcmVzc2lvbltdLFxuICApIHtcbiAgICBzdXBlcih7IG5hbWUsIGFyZ3MgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIC8vIFJlY29yZGluZyBoZXJlLCBhdCByZXNvbHZlIHRpbWUsIGlzIGRlbGliZXJhdGU6IGEgYEZuLiooKWAvXG4gICAgLy8gYFRlcnJhZm9ybVByb3ZpZGVyRnVuY3Rpb24uaW52b2tlKClgIGNhbGwgb25seSBwcm9kdWNlcyBhIHRva2VuOiB0aGlzXG4gICAgLy8gaXMgdGhlIHBvaW50IHdoZXJlIHRoYXQgdG9rZW4gYWN0dWFsbHkgbGFuZHMgaW4gYSByZW5kZXJlZCBzdGFjaywgc29cbiAgICAvLyB1c2FnZSBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBTVEFDSyB3aG9zZSBzeW50aGVzaXMgaXMgZG9pbmcgdGhlXG4gICAgLy8gcmVuZGVyaW5nIC0gc2VlIGBUZXJyYWZvcm1TdGFjay5fdXNlZEZ1bmN0aW9uc2AgZm9yIHdoeSB1c2FnZSBpc1xuICAgIC8vIHN0YWNrLW93bmVkIHJhdGhlciB0aGFuIEFwcC1vd25lZC5cbiAgICAvL1xuICAgIC8vIGBjb250ZXh0LnNjb3BlYCBJUyB0aGUgcmVzb2x2aW5nIFRlcnJhZm9ybVN0YWNrIGZvciBldmVyeVxuICAgIC8vIHN5bnRoLWRyaXZlbiByZXNvbHZlIChBcHAuc3ludGgsIFRlc3Rpbmcuc3ludGgvc3ludGhIY2wsXG4gICAgLy8gU3RhY2tTeW50aGVzaXplci5zeW50aGVzaXplIGFsbCByZXNvbHZlIGVsZW1lbnRzIHdpdGggdGhlaXIgb3duaW5nXG4gICAgLy8gc3RhY2sgYXMgc2NvcGUpLCBzbyBgVGVycmFmb3JtU3RhY2suaXNTdGFja2AgaXMgY2hlY2tlZCBmaXJzdCBhcyB0aGVcbiAgICAvLyBjb21tb24gY2FzZS4gYFRlcnJhZm9ybVN0YWNrLm9mKClgIGlzIGEgZmFsbGJhY2sgZm9yIGEgc2NvcGUgdGhhdCBpc1xuICAgIC8vIHNvbWUgb3RoZXIgY29uc3RydWN0IHdpdGhpbiBhIHN0YWNrLiBJZiBuZWl0aGVyIGZpbmRzIGEgc3RhY2sgKGFcbiAgICAvLyB1c2VyLWRyaXZlbiBgVG9rZW5zLnJlc29sdmUoKWAgY2FsbCBhZ2FpbnN0IGEgYmFyZSBzY29wZSB3aXRoIG5vXG4gICAgLy8gc3RhY2sgaW4gaXRzIGFuY2VzdHJ5KSwgdGhlcmUgaXMgbm93aGVyZSB0byByZWNvcmQgaW50byAtIGFuZCBub3RoaW5nXG4gICAgLy8gd291bGQgZXZlciByZWFkIGl0IGJhY2sgdG8gdmFsaWRhdGUgYW55d2F5IC0gc28gcmVjb3JkaW5nIGlzIHF1aWV0bHlcbiAgICAvLyBza2lwcGVkIHJhdGhlciB0aGFuIHRocm93aW5nLlxuICAgIGxldCBzdGFjazogVGVycmFmb3JtU3RhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFRlcnJhZm9ybVN0YWNrLmlzU3RhY2soY29udGV4dC5zY29wZSkpIHtcbiAgICAgIHN0YWNrID0gY29udGV4dC5zY29wZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhY2sgPSBUZXJyYWZvcm1TdGFjay5vZihjb250ZXh0LnNjb3BlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzdGFjayA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIGlmICh0aGlzLm5hbWUuc3RhcnRzV2l0aChcInByb3ZpZGVyOjpcIikpIHtcbiAgICAgICAgc3RhY2suX3JlY29yZFByb3ZpZGVyRnVuY3Rpb25Vc2FnZSh0aGlzLm5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhY2suX3JlY29yZEZ1bmN0aW9uVXNhZ2UodGhpcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29uc3Qgb3JpZ2luYWxJZ25vcmVFc2NhcGVzID0gY29udGV4dC5pZ25vcmVFc2NhcGVzO1xuICAgIGNvbnN0IG9yaWdpbmFsV2FybkVzY2FwZXMgPSBjb250ZXh0Lndhcm5Fc2NhcGVzO1xuXG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG4gICAgY29udGV4dC5pZ25vcmVFc2NhcGVzID0gdHJ1ZTtcbiAgICBjb250ZXh0Lndhcm5Fc2NhcGVzID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRBcmdzID0gdGhpcy5hcmdzXG4gICAgICAubWFwKChhcmcpID0+IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmcpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IGV4cHIgPSBgJHt0aGlzLm5hbWV9KCR7c2VyaWFsaXplZEFyZ3N9KWA7XG5cbiAgICBjb250ZXh0Lmlnbm9yZUVzY2FwZXMgPSBvcmlnaW5hbElnbm9yZUVzY2FwZXM7XG4gICAgY29udGV4dC53YXJuRXNjYXBlcyA9IG9yaWdpbmFsV2FybkVzY2FwZXM7XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyBleHByIDogYFxcJHske2V4cHJ9fWA7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIFRlcnJhZm9ybSBmdW5jdGlvbiBjYWxsIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBuYW1lIFRoZSBmdW5jdGlvbiBuYW1lLCBlLmcuIGBqb2luYCBvciBgcHJvdmlkZXI6Ojxwcm92aWRlcj46OjxmdW5jdGlvbj5gXG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIEByZXR1cm5zIEEgcmVzb2x2YWJsZSB0aGF0IHJlbmRlcnMgdGhlIGZ1bmN0aW9uIGNhbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGwobmFtZTogc3RyaW5nLCBhcmdzOiBFeHByZXNzaW9uW10pIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbkNhbGwobmFtZSwgYXJncykgYXMgSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBjb25zdCBGT1JfRVhQUkVTU0lPTl9LRVkgPSByZWYoXCJrZXlcIik7XG5leHBvcnQgY29uc3QgRk9SX0VYUFJFU1NJT05fVkFMVUUgPSByZWYoXCJ2YWxcIik7XG5cbi8qKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZXhwcmVzc2lvbnMvZm9yXG4gKi9cbmNsYXNzIEZvckV4cHJlc3Npb24gZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlucHV0OiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUgdmFsdWVFeHByZXNzaW9uOiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUga2V5RXhwcmVzc2lvbj86IEV4cHJlc3Npb24sXG4gICkge1xuICAgIHN1cGVyKHsgaW5wdXQsIHZhbHVlRXhwcmVzc2lvbiwga2V5RXhwcmVzc2lvbiB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VwcHJlc3NCcmFjZXMgPSBjb250ZXh0LnN1cHByZXNzQnJhY2VzO1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuICAgIGNvbnRleHQuaXRlcmF0b3JDb250ZXh0ID0gXCJGT1JfRVhQUkVTU0lPTlwiO1xuICAgIGNvbnN0IGtleSA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBGT1JfRVhQUkVTU0lPTl9LRVkpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIEZPUl9FWFBSRVNTSU9OX1ZBTFVFKTtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLmlucHV0KTtcbiAgICBjb25zdCB2YWx1ZUV4cHIgPSB0aGlzLnJlc29sdmVFeHByZXNzaW9uUGFydChjb250ZXh0LCB0aGlzLnZhbHVlRXhwcmVzc2lvbik7XG5cbiAgICBsZXQgZXhwcjogc3RyaW5nO1xuICAgIGlmICh0aGlzLmtleUV4cHJlc3Npb24pIHtcbiAgICAgIGNvbnN0IGtleUV4cHIgPSB0aGlzLnJlc29sdmVFeHByZXNzaW9uUGFydChjb250ZXh0LCB0aGlzLmtleUV4cHJlc3Npb24pO1xuXG4gICAgICBleHByID0gYHsgZm9yICR7a2V5fSwgJHt2YWx1ZX0gaW4gJHtpbnB1dH06ICR7a2V5RXhwcn0gPT4gJHt2YWx1ZUV4cHJ9IH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByID0gYFsgZm9yICR7a2V5fSwgJHt2YWx1ZX0gaW4gJHtpbnB1dH06ICR7dmFsdWVFeHByfV1gO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBwcmVzc0JyYWNlcyA/IGV4cHIgOiBgXFwkeyR7ZXhwcn19YDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmb3IgZXhwcmVzc2lvbiwgdXNlZCBmb3IgYWR2YW5jZWQgaW50ZXJuYWwgdXNlIGNhc2VzIChlLmcuIGluIHRoZSBAY2RrdG4vYXdzLWFkYXB0ZXIpXG4gKiBJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGlzIHZpYSBKU0lJIGluIG90aGVyIGxhbmd1YWdlcy4gVXN1YWxseSB5b3UgbWlnaHQgd2FudCB0b1xuICogdXNlIFRlcnJhZm9ybUl0ZXJhdG9yIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBmb3IgdGhlIGV4cHJlc3Npb24gZS5nLiBhIGxpc3Qgb3IgYW4gb2JqZWN0XG4gKiBAcGFyYW0gdmFsdWVFeHByZXNzaW9uIHdpbGwgZXhwcmVzcyB0aGUgdmFsdWUgZS5nLiBbIGZvciBpIGluICZsdDtpbnB1dCZndDsgOiAmbHQ7dmFsdWVFeHByZXNzaW9uJmd0OyBdXG4gKiBAcGFyYW0ga2V5RXhwcmVzc2lvbiBpZiBzZXQgd2lsbCByZXR1cm4gYW4gb2JqZWN0IGUuZy4geyBmb3Igayx2IGluICZsdDtpbnB1dCZndDsgOiAmbHQ7a2V5RXhwcmVzc2lvbiZndDsgPT4gJmx0O3ZhbHVlRXhwcmVzc2lvbiZndDt9XG4gKiBAcmV0dXJucyBhIGZvciBleHByZXNzaW9uXG4gKlxuICogVGhlIHZhcmlhYmxlcyBmb3Iga2V5IChmb3IgbWFwcykgLyBpbmRleCAoZm9yIGxpc3RzKSBhbmQgdmFsdWUgdGhhdCBhcmUgdmFsaWQgaW4gdGhlIGtleS0gYW5kIHZhbHVlRXhwcmVzc2lvblxuICogY2FuIGJlIHJlZmVyZW5jZWQgYnkgdXNpbmcgdGhlc2UgY29uc3RhbnRzOiBGT1JfRVhQUkVTU0lPTl9LRVkgYW5kIEZPUl9FWFBSRVNTSU9OX1ZBTFVFLlxuICpcbiAqIEN1cnJlbnRseSBuZXN0aW5nIGZvciBleHByZXNzaW9ucyBpcyBub3Qgc3VwcG9ydGVkIGR1ZSB0byB0aGlzIHNpbXBsaWZpY2F0aW9uLlxuICpcbiAqIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGZpbHRlcmluZyBlbGVtZW50cyAoaWYgY2xhdXNlKSBvciBncm91cGluZyByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFeHByZXNzaW9uKFxuICBpbnB1dDogRXhwcmVzc2lvbixcbiAgdmFsdWVFeHByZXNzaW9uOiBFeHByZXNzaW9uLFxuICBrZXlFeHByZXNzaW9uPzogRXhwcmVzc2lvbixcbikge1xuICByZXR1cm4gbmV3IEZvckV4cHJlc3Npb24oXG4gICAgaW5wdXQsXG4gICAgdmFsdWVFeHByZXNzaW9uLFxuICAgIGtleUV4cHJlc3Npb24sXG4gICkgYXMgSVJlc29sdmFibGU7XG59XG5cbi8qKlxuICogRXhwcmVzc2lvbiByZW5kZXJpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgZGVwZW5kYWJsZSwgZm9yIHVzZSBpbiBgZGVwZW5kc19vbmAuXG4gKi9cbmNsYXNzIERlcGVuZGFibGUgZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlcGVuZGFibGU6IElUZXJyYWZvcm1EZXBlbmRhYmxlKSB7XG4gICAgc3VwZXIoZGVwZW5kYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kYWJsZS5mcW47XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIHRva2VuIHJlZmVyZW5jaW5nIGEgZGVwZW5kYWJsZSBieSBpdHMgZnVsbHkgcXVhbGlmaWVkIG5hbWVcbiAqIEBwYXJhbSBkZXBlbmRhYmxlIFRoZSBkZXBlbmRhYmxlIHRvIHJlZmVyZW5jZVxuICogQHJldHVybnMgQSBzdHJpbmcgdG9rZW4gdGhhdCByZXNvbHZlcyB0byB0aGUgZGVwZW5kYWJsZSdzIGZ1bGx5IHF1YWxpZmllZCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBlbmRhYmxlKGRlcGVuZGFibGU6IElUZXJyYWZvcm1EZXBlbmRhYmxlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKG5ldyBEZXBlbmRhYmxlKGRlcGVuZGFibGUpKTtcbn1cblxuZXhwb3J0IHR5cGUgRXhwcmVzc2lvbiA9XG4gIHwgUmVmZXJlbmNlXG4gIHwgRnVuY3Rpb25DYWxsXG4gIHwgUHJvcGVydHlBY2Nlc3NcbiAgfCBDb25kaXRpb25hbEV4cHJlc3Npb25cbiAgfCBPcGVyYXRvckV4cHJlc3Npb25cbiAgfCBEZXBlbmRhYmxlXG4gIHwgRm9yRXhwcmVzc2lvblxuICB8IHN0cmluZ1xuICB8IHN0cmluZ1tdXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IElSZXNvbHZhYmxlXG4gIHwgeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICB8IG51bGxcbiAgfCBhbnkgLy8gdWx0aW1hdGVseSBhbnkgdmFsaWQgVGVycmFmb3JtIHR5cGUgY2FuIGJlIHVzZWQgYXMgYW4gZXhwcmVzc2lvblxuICB8IGFueVtdO1xuIl19
@@ -111,6 +111,10 @@ export declare class Lazy {
111
111
  */
112
112
  static anyValue(producer: IAnyProducer, options?: LazyAnyValueOptions): IResolvable;
113
113
  }
114
+ /**
115
+ * Base class for lazy tokens whose value is produced at resolution time and then passed through any registered
116
+ * post-processors.
117
+ */
114
118
  export declare abstract class LazyBase implements IResolvable {
115
119
  readonly creationStack: string[];
116
120
  private postProcessors;
@@ -14,7 +14,7 @@ const token_1 = require("./token");
14
14
  * will only be calculated later, during synthesis.
15
15
  */
16
16
  class Lazy {
17
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Lazy", version: "0.26.0-pre.20" };
17
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Lazy", version: "0.26.0-pre.21" };
18
18
  /**
19
19
  * Returns a stringified token for a lazy value.
20
20
  * @param producer The producer
@@ -48,9 +48,12 @@ class Lazy {
48
48
  }
49
49
  }
50
50
  exports.Lazy = Lazy;
51
- // eslint-disable-next-line jsdoc/require-jsdoc
51
+ /**
52
+ * Base class for lazy tokens whose value is produced at resolution time and then passed through any registered
53
+ * post-processors.
54
+ */
52
55
  class LazyBase {
53
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.LazyBase", version: "0.26.0-pre.20" };
56
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.LazyBase", version: "0.26.0-pre.21" };
54
57
  creationStack;
55
58
  postProcessors = [];
56
59
  constructor() {
@@ -76,7 +79,9 @@ class LazyBase {
76
79
  }
77
80
  }
78
81
  exports.LazyBase = LazyBase;
79
- // eslint-disable-next-line jsdoc/require-jsdoc
82
+ /**
83
+ * Lazy token whose string value is produced by an IStringProducer at resolution time.
84
+ */
80
85
  class LazyString extends LazyBase {
81
86
  producer;
82
87
  constructor(producer) {
@@ -87,7 +92,9 @@ class LazyString extends LazyBase {
87
92
  return this.producer.produce(context);
88
93
  }
89
94
  }
90
- // eslint-disable-next-line jsdoc/require-jsdoc
95
+ /**
96
+ * Lazy token whose numeric value is produced by an INumberProducer at resolution time.
97
+ */
91
98
  class LazyNumber extends LazyBase {
92
99
  producer;
93
100
  constructor(producer) {
@@ -98,7 +105,10 @@ class LazyNumber extends LazyBase {
98
105
  return this.producer.produce(context);
99
106
  }
100
107
  }
101
- // eslint-disable-next-line jsdoc/require-jsdoc
108
+ /**
109
+ * Lazy token whose list value is produced by an IListProducer at resolution time. Resolves an empty list to
110
+ * `undefined` when `omitEmpty` is set.
111
+ */
102
112
  class LazyList extends LazyBase {
103
113
  producer;
104
114
  options;
@@ -115,7 +125,10 @@ class LazyList extends LazyBase {
115
125
  return ret;
116
126
  }
117
127
  }
118
- // eslint-disable-next-line jsdoc/require-jsdoc
128
+ /**
129
+ * Lazy token whose untyped value is produced by an IAnyProducer at resolution time. Resolves an empty array to
130
+ * `undefined` when `omitEmptyArray` is set.
131
+ */
119
132
  class LazyAny extends LazyBase {
120
133
  producer;
121
134
  options;
@@ -132,4 +145,4 @@ class LazyAny extends LazyBase {
132
145
  return ret;
133
146
  }
134
147
  }
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbnMvbGF6eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQywwR0FBMEc7QUFDMUcsdURBQTZEO0FBRTdELG1DQUFnQztBQTRGaEM7Ozs7O0dBS0c7QUFDSCxNQUFhLElBQUk7O0lBQ2Y7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFFBQXlCLEVBQ3pCLFVBQWtDLEVBQUU7UUFFcEMsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQXlCO1FBQ2pELE9BQU8sYUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FDckIsUUFBdUIsRUFDdkIsVUFBZ0MsRUFBRTtRQUVsQyxPQUFPLGFBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FDcEIsUUFBc0IsRUFDdEIsVUFBK0IsRUFBRTtRQUVqQyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDOztBQTNDSCxvQkE0Q0M7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBc0IsUUFBUTs7SUFDWixhQUFhLENBQVc7SUFDaEMsY0FBYyxHQUFxQixFQUFFLENBQUM7SUFFOUM7UUFDRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUEsa0NBQW9CLEdBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQy9CLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDO0lBSU0sUUFBUTtRQUNiLE9BQU8sYUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsOERBQThEO0lBQ3ZELGdCQUFnQixDQUFDLGFBQTZCO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTTtRQUNYLE9BQU8sbUJBQW1CLENBQUM7SUFDN0IsQ0FBQzs7QUFqQ0gsNEJBa0NDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sVUFBVyxTQUFRLFFBQVE7SUFDRjtJQUE3QixZQUE2QixRQUF5QjtRQUNwRCxLQUFLLEVBQUUsQ0FBQztRQURtQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtJQUV0RCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXdCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sVUFBVyxTQUFRLFFBQVE7SUFDRjtJQUE3QixZQUE2QixRQUF5QjtRQUNwRCxLQUFLLEVBQUUsQ0FBQztRQURtQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtJQUV0RCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXdCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sUUFBUyxTQUFRLFFBQVE7SUFFVjtJQUNBO0lBRm5CLFlBQ21CLFFBQXVCLEVBQ3ZCLFVBQWdDLEVBQUU7UUFFbkQsS0FBSyxFQUFFLENBQUM7UUFIUyxhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQTJCO0lBR3JELENBQUM7SUFFTSxXQUFXLENBQUMsT0FBd0I7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sT0FBUSxTQUFRLFFBQVE7SUFFVDtJQUNBO0lBRm5CLFlBQ21CLFFBQXNCLEVBQ3RCLFVBQStCLEVBQUU7UUFFbEQsS0FBSyxFQUFFLENBQUM7UUFIUyxhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3RCLFlBQU8sR0FBUCxPQUFPLENBQTBCO0lBR3BELENBQUM7SUFFTSxXQUFXLENBQUMsT0FBd0I7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvY29uc3RydWN0cy9ibG9iL2UwMWU0N2Y3OGVmMWU5YjYwMGVmY2QyM2ZmNzcwNWFhOGQzODQwMTcvbGliL2xhenkudHNcbmltcG9ydCB7IGNhcHR1cmVDcmVhdGlvblN0YWNrIH0gZnJvbSBcIi4vcHJpdmF0ZS9zdGFjay10cmFjZVwiO1xuaW1wb3J0IHsgSVBvc3RQcm9jZXNzb3IsIElSZXNvbHZhYmxlLCBJUmVzb2x2ZUNvbnRleHQgfSBmcm9tIFwiLi9yZXNvbHZhYmxlXCI7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCIuL3Rva2VuXCI7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBsYXp5IHN0cmluZyBwcm9kdWNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3RyaW5nUHJvZHVjZXIge1xuICAvKipcbiAgICogUHJvZHVjZSB0aGUgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwcm9kdWNlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGxhenkgbGlzdCBwcm9kdWNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTGlzdFByb2R1Y2VyIHtcbiAgLyoqXG4gICAqIFByb2R1Y2UgdGhlIGxpc3QgdmFsdWVcbiAgICovXG4gIHByb2R1Y2UoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBsYXp5IG51bWJlciBwcm9kdWNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTnVtYmVyUHJvZHVjZXIge1xuICAvKipcbiAgICogUHJvZHVjZSB0aGUgbnVtYmVyIHZhbHVlXG4gICAqL1xuICBwcm9kdWNlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGxhenkgdW50eXBlZCB2YWx1ZSBwcm9kdWNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQW55UHJvZHVjZXIge1xuICAvKipcbiAgICogUHJvZHVjZSB0aGUgdmFsdWVcbiAgICovXG4gIHByb2R1Y2UoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogYW55O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgbGF6eSBzdHJpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXp5U3RyaW5nVmFsdWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgZ2l2ZW4gbmFtZSBhcyBhIGRpc3BsYXkgaGludFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGhpbnRcbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlIaW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgbGF6eSBsaXN0IHRva2VuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF6eUxpc3RWYWx1ZU9wdGlvbnMge1xuICAvKipcbiAgICogVXNlIHRoZSBnaXZlbiBuYW1lIGFzIGEgZGlzcGxheSBoaW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gaGludFxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheUhpbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwcm9kdWNlZCBsaXN0IGlzIGVtcHR5LCByZXR1cm4gJ3VuZGVmaW5lZCcgaW5zdGVhZFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb21pdEVtcHR5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBsYXp5IHVudHlwZWQgdG9rZW5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF6eUFueVZhbHVlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGdpdmVuIG5hbWUgYXMgYSBkaXNwbGF5IGhpbnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBoaW50XG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5SGludD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhlIHByb2R1Y2VkIHZhbHVlIGlzIGFuIGFycmF5IGFuZCBpdCBpcyBlbXB0eSwgcmV0dXJuICd1bmRlZmluZWQnIGluc3RlYWRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG9taXRFbXB0eUFycmF5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBMYXppbHkgcHJvZHVjZSBhIHZhbHVlXG4gKlxuICogQ2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgc3RyaW5nLCBsaXN0IG9yIG51bWVyaWMgdmFsdWUgd2hvc2UgYWN0dWFsIHZhbHVlXG4gKiB3aWxsIG9ubHkgYmUgY2FsY3VsYXRlZCBsYXRlciwgZHVyaW5nIHN5bnRoZXNpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhenkge1xuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZ2lmaWVkIHRva2VuIGZvciBhIGxhenkgdmFsdWUuXG4gICAqIEBwYXJhbSBwcm9kdWNlciBUaGUgcHJvZHVjZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzdHJpbmdWYWx1ZShcbiAgICBwcm9kdWNlcjogSVN0cmluZ1Byb2R1Y2VyLFxuICAgIG9wdGlvbnM6IExhenlTdHJpbmdWYWx1ZU9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKG5ldyBMYXp5U3RyaW5nKHByb2R1Y2VyKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG51bWJlcmlmaWVkIHRva2VuIGZvciBhIGxhenkgdmFsdWUuXG4gICAqIEBwYXJhbSBwcm9kdWNlciBUaGUgcHJvZHVjZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtYmVyVmFsdWUocHJvZHVjZXI6IElOdW1iZXJQcm9kdWNlcikge1xuICAgIHJldHVybiBUb2tlbi5hc051bWJlcihuZXcgTGF6eU51bWJlcihwcm9kdWNlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0LWlmaWVkIHRva2VuIGZvciBhIGxhenkgdmFsdWUuXG4gICAqIEBwYXJhbSBwcm9kdWNlciBUaGUgcHJvZHVjZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBsaXN0VmFsdWUoXG4gICAgcHJvZHVjZXI6IElMaXN0UHJvZHVjZXIsXG4gICAgb3B0aW9uczogTGF6eUxpc3RWYWx1ZU9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzTGlzdChuZXcgTGF6eUxpc3QocHJvZHVjZXIsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyBhIGxhenkgdG9rZW4gZnJvbSBhbiB1bnR5cGVkIHZhbHVlLlxuICAgKiBAcGFyYW0gcHJvZHVjZXIgVGhlIGxhenkgcHJvZHVjZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbnlWYWx1ZShcbiAgICBwcm9kdWNlcjogSUFueVByb2R1Y2VyLFxuICAgIG9wdGlvbnM6IExhenlBbnlWYWx1ZU9wdGlvbnMgPSB7fSxcbiAgKTogSVJlc29sdmFibGUge1xuICAgIHJldHVybiBuZXcgTGF6eUFueShwcm9kdWNlciwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXp5QmFzZSBpbXBsZW1lbnRzIElSZXNvbHZhYmxlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0aW9uU3RhY2s6IHN0cmluZ1tdO1xuICBwcml2YXRlIHBvc3RQcm9jZXNzb3JzOiBJUG9zdFByb2Nlc3NvcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jcmVhdGlvblN0YWNrID0gY2FwdHVyZUNyZWF0aW9uU3RhY2soKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucG9zdFByb2Nlc3NvcnMucmVkdWNlKFxuICAgICAgKHZhbCwgcHApID0+IHBwLnBvc3RQcm9jZXNzKHZhbCwgY29udGV4dCksXG4gICAgICB0aGlzLnJlc29sdmVMYXp5KGNvbnRleHQpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVzb2x2ZUxhenkoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogYW55O1xuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcyk7XG4gIH1cblxuICAvLyB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGlzIExhenkncyByZXNvbHZlKCkgbWV0aG9kIGlzIGNhbGxlZFxuICBwdWJsaWMgYWRkUG9zdFByb2Nlc3Nvcihwb3N0UHJvY2Vzc29yOiBJUG9zdFByb2Nlc3Nvcik6IHZvaWQge1xuICAgIHRoaXMucG9zdFByb2Nlc3NvcnMucHVzaChwb3N0UHJvY2Vzc29yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIHRoaXMgVG9rZW4gaW50byBKU09OXG4gICAqXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWQgb24gYSBUb2tlbi5cbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKTogYW55IHtcbiAgICByZXR1cm4gXCI8dW5yZXNvbHZlZC1sYXp5PlwiO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5jbGFzcyBMYXp5U3RyaW5nIGV4dGVuZHMgTGF6eUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2R1Y2VyOiBJU3RyaW5nUHJvZHVjZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVMYXp5KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnByb2R1Y2VyLnByb2R1Y2UoY29udGV4dCk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmNsYXNzIExhenlOdW1iZXIgZXh0ZW5kcyBMYXp5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjZXI6IElOdW1iZXJQcm9kdWNlcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUxhenkoY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZHVjZXIucHJvZHVjZShjb250ZXh0KTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgTGF6eUxpc3QgZXh0ZW5kcyBMYXp5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjZXI6IElMaXN0UHJvZHVjZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBMYXp5TGlzdFZhbHVlT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVMYXp5KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIGNvbnN0IHJldCA9IHRoaXMucHJvZHVjZXIucHJvZHVjZShjb250ZXh0KTtcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQgJiYgcmV0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLm9wdGlvbnMub21pdEVtcHR5KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5jbGFzcyBMYXp5QW55IGV4dGVuZHMgTGF6eUJhc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y2VyOiBJQW55UHJvZHVjZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBMYXp5QW55VmFsdWVPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUxhenkoY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5wcm9kdWNlci5wcm9kdWNlKGNvbnRleHQpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJldCkgJiYgcmV0Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLm9wdGlvbnMub21pdEVtcHR5QXJyYXkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbnMvbGF6eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQywwR0FBMEc7QUFDMUcsdURBQTZEO0FBRTdELG1DQUFnQztBQTRGaEM7Ozs7O0dBS0c7QUFDSCxNQUFhLElBQUk7O0lBQ2Y7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFFBQXlCLEVBQ3pCLFVBQWtDLEVBQUU7UUFFcEMsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQXlCO1FBQ2pELE9BQU8sYUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FDckIsUUFBdUIsRUFDdkIsVUFBZ0MsRUFBRTtRQUVsQyxPQUFPLGFBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FDcEIsUUFBc0IsRUFDdEIsVUFBK0IsRUFBRTtRQUVqQyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDOztBQTNDSCxvQkE0Q0M7QUFFRDs7O0dBR0c7QUFDSCxNQUFzQixRQUFROztJQUNaLGFBQWEsQ0FBVztJQUNoQyxjQUFjLEdBQXFCLEVBQUUsQ0FBQztJQUU5QztRQUNFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBQSxrQ0FBb0IsR0FBRSxDQUFDO0lBQzlDLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDL0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFJTSxRQUFRO1FBQ2IsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCw4REFBOEQ7SUFDdkQsZ0JBQWdCLENBQUMsYUFBNkI7UUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNO1FBQ1gsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDOztBQWpDSCw0QkFrQ0M7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVyxTQUFRLFFBQVE7SUFDRjtJQUE3QixZQUE2QixRQUF5QjtRQUNwRCxLQUFLLEVBQUUsQ0FBQztRQURtQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtJQUV0RCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXdCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVcsU0FBUSxRQUFRO0lBQ0Y7SUFBN0IsWUFBNkIsUUFBeUI7UUFDcEQsS0FBSyxFQUFFLENBQUM7UUFEbUIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFFdEQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUF3QjtRQUN6QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sUUFBUyxTQUFRLFFBQVE7SUFFVjtJQUNBO0lBRm5CLFlBQ21CLFFBQXVCLEVBQ3ZCLFVBQWdDLEVBQUU7UUFFbkQsS0FBSyxFQUFFLENBQUM7UUFIUyxhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQTJCO0lBR3JELENBQUM7SUFFTSxXQUFXLENBQUMsT0FBd0I7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFRLFNBQVEsUUFBUTtJQUVUO0lBQ0E7SUFGbkIsWUFDbUIsUUFBc0IsRUFDdEIsVUFBK0IsRUFBRTtRQUVsRCxLQUFLLEVBQUUsQ0FBQztRQUhTLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7SUFHcEQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUF3QjtRQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuLy8gQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9jb25zdHJ1Y3RzL2Jsb2IvZTAxZTQ3Zjc4ZWYxZTliNjAwZWZjZDIzZmY3NzA1YWE4ZDM4NDAxNy9saWIvbGF6eS50c1xuaW1wb3J0IHsgY2FwdHVyZUNyZWF0aW9uU3RhY2sgfSBmcm9tIFwiLi9wcml2YXRlL3N0YWNrLXRyYWNlXCI7XG5pbXBvcnQgeyBJUG9zdFByb2Nlc3NvciwgSVJlc29sdmFibGUsIElSZXNvbHZlQ29udGV4dCB9IGZyb20gXCIuL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IFRva2VuIH0gZnJvbSBcIi4vdG9rZW5cIjtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGxhenkgc3RyaW5nIHByb2R1Y2Vyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElTdHJpbmdQcm9kdWNlciB7XG4gIC8qKlxuICAgKiBQcm9kdWNlIHRoZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHByb2R1Y2UoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgbGF6eSBsaXN0IHByb2R1Y2Vyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0UHJvZHVjZXIge1xuICAvKipcbiAgICogUHJvZHVjZSB0aGUgbGlzdCB2YWx1ZVxuICAgKi9cbiAgcHJvZHVjZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGxhenkgbnVtYmVyIHByb2R1Y2Vyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElOdW1iZXJQcm9kdWNlciB7XG4gIC8qKlxuICAgKiBQcm9kdWNlIHRoZSBudW1iZXIgdmFsdWVcbiAgICovXG4gIHByb2R1Y2UoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgbGF6eSB1bnR5cGVkIHZhbHVlIHByb2R1Y2Vyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElBbnlQcm9kdWNlciB7XG4gIC8qKlxuICAgKiBQcm9kdWNlIHRoZSB2YWx1ZVxuICAgKi9cbiAgcHJvZHVjZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBhbnk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBsYXp5IHN0cmluZyB0b2tlblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhenlTdHJpbmdWYWx1ZU9wdGlvbnMge1xuICAvKipcbiAgICogVXNlIHRoZSBnaXZlbiBuYW1lIGFzIGEgZGlzcGxheSBoaW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gaGludFxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheUhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBsYXp5IGxpc3QgdG9rZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXp5TGlzdFZhbHVlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGdpdmVuIG5hbWUgYXMgYSBkaXNwbGF5IGhpbnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBoaW50XG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5SGludD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhlIHByb2R1Y2VkIGxpc3QgaXMgZW1wdHksIHJldHVybiAndW5kZWZpbmVkJyBpbnN0ZWFkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBvbWl0RW1wdHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGxhenkgdW50eXBlZCB0b2tlbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXp5QW55VmFsdWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgZ2l2ZW4gbmFtZSBhcyBhIGRpc3BsYXkgaGludFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGhpbnRcbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlIaW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgcHJvZHVjZWQgdmFsdWUgaXMgYW4gYXJyYXkgYW5kIGl0IGlzIGVtcHR5LCByZXR1cm4gJ3VuZGVmaW5lZCcgaW5zdGVhZFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb21pdEVtcHR5QXJyYXk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIExhemlseSBwcm9kdWNlIGEgdmFsdWVcbiAqXG4gKiBDYW4gYmUgdXNlZCB0byByZXR1cm4gYSBzdHJpbmcsIGxpc3Qgb3IgbnVtZXJpYyB2YWx1ZSB3aG9zZSBhY3R1YWwgdmFsdWVcbiAqIHdpbGwgb25seSBiZSBjYWxjdWxhdGVkIGxhdGVyLCBkdXJpbmcgc3ludGhlc2lzLlxuICovXG5leHBvcnQgY2xhc3MgTGF6eSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5naWZpZWQgdG9rZW4gZm9yIGEgbGF6eSB2YWx1ZS5cbiAgICogQHBhcmFtIHByb2R1Y2VyIFRoZSBwcm9kdWNlclxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHN0cmluZ1ZhbHVlKFxuICAgIHByb2R1Y2VyOiBJU3RyaW5nUHJvZHVjZXIsXG4gICAgb3B0aW9uczogTGF6eVN0cmluZ1ZhbHVlT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcobmV3IExhenlTdHJpbmcocHJvZHVjZXIpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbnVtYmVyaWZpZWQgdG9rZW4gZm9yIGEgbGF6eSB2YWx1ZS5cbiAgICogQHBhcmFtIHByb2R1Y2VyIFRoZSBwcm9kdWNlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1iZXJWYWx1ZShwcm9kdWNlcjogSU51bWJlclByb2R1Y2VyKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzTnVtYmVyKG5ldyBMYXp5TnVtYmVyKHByb2R1Y2VyKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3QtaWZpZWQgdG9rZW4gZm9yIGEgbGF6eSB2YWx1ZS5cbiAgICogQHBhcmFtIHByb2R1Y2VyIFRoZSBwcm9kdWNlclxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxpc3RWYWx1ZShcbiAgICBwcm9kdWNlcjogSUxpc3RQcm9kdWNlcixcbiAgICBvcHRpb25zOiBMYXp5TGlzdFZhbHVlT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gVG9rZW4uYXNMaXN0KG5ldyBMYXp5TGlzdChwcm9kdWNlciwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIGEgbGF6eSB0b2tlbiBmcm9tIGFuIHVudHlwZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBwcm9kdWNlciBUaGUgbGF6eSBwcm9kdWNlclxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFueVZhbHVlKFxuICAgIHByb2R1Y2VyOiBJQW55UHJvZHVjZXIsXG4gICAgb3B0aW9uczogTGF6eUFueVZhbHVlT3B0aW9ucyA9IHt9LFxuICApOiBJUmVzb2x2YWJsZSB7XG4gICAgcmV0dXJuIG5ldyBMYXp5QW55KHByb2R1Y2VyLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGxhenkgdG9rZW5zIHdob3NlIHZhbHVlIGlzIHByb2R1Y2VkIGF0IHJlc29sdXRpb24gdGltZSBhbmQgdGhlbiBwYXNzZWQgdGhyb3VnaCBhbnkgcmVnaXN0ZXJlZFxuICogcG9zdC1wcm9jZXNzb3JzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGF6eUJhc2UgaW1wbGVtZW50cyBJUmVzb2x2YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGlvblN0YWNrOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBwb3N0UHJvY2Vzc29yczogSVBvc3RQcm9jZXNzb3JbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IGNhcHR1cmVDcmVhdGlvblN0YWNrKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnBvc3RQcm9jZXNzb3JzLnJlZHVjZShcbiAgICAgICh2YWwsIHBwKSA9PiBwcC5wb3N0UHJvY2Vzcyh2YWwsIGNvbnRleHQpLFxuICAgICAgdGhpcy5yZXNvbHZlTGF6eShjb250ZXh0KSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlc29sdmVMYXp5KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCk6IGFueTtcblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMpO1xuICB9XG5cbiAgLy8gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhpcyBMYXp5J3MgcmVzb2x2ZSgpIG1ldGhvZCBpcyBjYWxsZWRcbiAgcHVibGljIGFkZFBvc3RQcm9jZXNzb3IocG9zdFByb2Nlc3NvcjogSVBvc3RQcm9jZXNzb3IpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RQcm9jZXNzb3JzLnB1c2gocG9zdFByb2Nlc3Nvcik7XG4gIH1cblxuICAvKipcbiAgICogVHVybiB0aGlzIFRva2VuIGludG8gSlNPTlxuICAgKlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIEpTT04uc3RyaW5naWZ5KCkgaXMgY2FsbGVkIG9uIGEgVG9rZW4uXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgcmV0dXJuIFwiPHVucmVzb2x2ZWQtbGF6eT5cIjtcbiAgfVxufVxuXG4vKipcbiAqIExhenkgdG9rZW4gd2hvc2Ugc3RyaW5nIHZhbHVlIGlzIHByb2R1Y2VkIGJ5IGFuIElTdHJpbmdQcm9kdWNlciBhdCByZXNvbHV0aW9uIHRpbWUuXG4gKi9cbmNsYXNzIExhenlTdHJpbmcgZXh0ZW5kcyBMYXp5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjZXI6IElTdHJpbmdQcm9kdWNlcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUxhenkoY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZHVjZXIucHJvZHVjZShjb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIExhenkgdG9rZW4gd2hvc2UgbnVtZXJpYyB2YWx1ZSBpcyBwcm9kdWNlZCBieSBhbiBJTnVtYmVyUHJvZHVjZXIgYXQgcmVzb2x1dGlvbiB0aW1lLlxuICovXG5jbGFzcyBMYXp5TnVtYmVyIGV4dGVuZHMgTGF6eUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2R1Y2VyOiBJTnVtYmVyUHJvZHVjZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVMYXp5KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnByb2R1Y2VyLnByb2R1Y2UoY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXp5IHRva2VuIHdob3NlIGxpc3QgdmFsdWUgaXMgcHJvZHVjZWQgYnkgYW4gSUxpc3RQcm9kdWNlciBhdCByZXNvbHV0aW9uIHRpbWUuIFJlc29sdmVzIGFuIGVtcHR5IGxpc3QgdG9cbiAqIGB1bmRlZmluZWRgIHdoZW4gYG9taXRFbXB0eWAgaXMgc2V0LlxuICovXG5jbGFzcyBMYXp5TGlzdCBleHRlbmRzIExhenlCYXNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9kdWNlcjogSUxpc3RQcm9kdWNlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IExhenlMaXN0VmFsdWVPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUxhenkoY29udGV4dDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5wcm9kdWNlci5wcm9kdWNlKGNvbnRleHQpO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCAmJiByZXQubGVuZ3RoID09PSAwICYmIHRoaXMub3B0aW9ucy5vbWl0RW1wdHkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXp5IHRva2VuIHdob3NlIHVudHlwZWQgdmFsdWUgaXMgcHJvZHVjZWQgYnkgYW4gSUFueVByb2R1Y2VyIGF0IHJlc29sdXRpb24gdGltZS4gUmVzb2x2ZXMgYW4gZW1wdHkgYXJyYXkgdG9cbiAqIGB1bmRlZmluZWRgIHdoZW4gYG9taXRFbXB0eUFycmF5YCBpcyBzZXQuXG4gKi9cbmNsYXNzIExhenlBbnkgZXh0ZW5kcyBMYXp5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjZXI6IElBbnlQcm9kdWNlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IExhenlBbnlWYWx1ZU9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlTGF6eShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpIHtcbiAgICBjb25zdCByZXQgPSB0aGlzLnByb2R1Y2VyLnByb2R1Y2UoY29udGV4dCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmV0KSAmJiByZXQubGVuZ3RoID09PSAwICYmIHRoaXMub3B0aW9ucy5vbWl0RW1wdHlBcnJheSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuIl19