cdktn 0.26.0-pre.2 → 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 (116) 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/quoted-string-key.d.ts +25 -0
  42. package/lib/hcl/quoted-string-key.js +42 -0
  43. package/lib/hcl/render.js +41 -7
  44. package/lib/ignore-strategy.js +1 -1
  45. package/lib/importable-resource.js +1 -1
  46. package/lib/manifest.d.ts +4 -0
  47. package/lib/manifest.js +6 -3
  48. package/lib/private/unique.js +11 -3
  49. package/lib/resource.js +1 -1
  50. package/lib/runtime.d.ts +6 -0
  51. package/lib/runtime.js +12 -3
  52. package/lib/synthesize/required-version.d.ts +32 -0
  53. package/lib/synthesize/required-version.js +205 -0
  54. package/lib/synthesize/synthesizer.d.ts +13 -0
  55. package/lib/synthesize/synthesizer.js +42 -8
  56. package/lib/terraform-asset.d.ts +4 -0
  57. package/lib/terraform-asset.js +6 -3
  58. package/lib/terraform-backend.d.ts +3 -0
  59. package/lib/terraform-backend.js +5 -3
  60. package/lib/terraform-conditions.js +1 -2
  61. package/lib/terraform-count.js +1 -1
  62. package/lib/terraform-data-resource.js +1 -1
  63. package/lib/terraform-data-source.d.ts +4 -0
  64. package/lib/terraform-data-source.js +8 -6
  65. package/lib/terraform-dependable.js +1 -1
  66. package/lib/terraform-dynamic-block.d.ts +4 -0
  67. package/lib/terraform-dynamic-block.js +5 -2
  68. package/lib/terraform-element.d.ts +4 -0
  69. package/lib/terraform-element.js +6 -3
  70. package/lib/terraform-ephemeral-resource.d.ts +4 -0
  71. package/lib/terraform-ephemeral-resource.js +8 -6
  72. package/lib/terraform-functions.d.ts +4 -0
  73. package/lib/terraform-functions.js +10 -5
  74. package/lib/terraform-hcl-module.d.ts +4 -0
  75. package/lib/terraform-hcl-module.js +6 -3
  76. package/lib/terraform-iterator.d.ts +19 -0
  77. package/lib/terraform-iterator.js +25 -11
  78. package/lib/terraform-local.d.ts +4 -0
  79. package/lib/terraform-local.js +6 -3
  80. package/lib/terraform-module.js +1 -1
  81. package/lib/terraform-operators.js +1 -1
  82. package/lib/terraform-output.d.ts +5 -0
  83. package/lib/terraform-output.js +23 -3
  84. package/lib/terraform-provider.d.ts +4 -0
  85. package/lib/terraform-provider.js +6 -3
  86. package/lib/terraform-provisioner.js +1 -1
  87. package/lib/terraform-remote-state.d.ts +3 -0
  88. package/lib/terraform-remote-state.js +5 -3
  89. package/lib/terraform-resource-targets.js +1 -1
  90. package/lib/terraform-resource.d.ts +5 -1
  91. package/lib/terraform-resource.js +16 -9
  92. package/lib/terraform-stack.d.ts +4 -0
  93. package/lib/terraform-stack.js +28 -9
  94. package/lib/terraform-variable.d.ts +7 -0
  95. package/lib/terraform-variable.js +16 -7
  96. package/lib/testing/adapters/jest.d.ts +3 -0
  97. package/lib/testing/adapters/jest.js +10 -1
  98. package/lib/testing/index.js +14 -4
  99. package/lib/testing/matchers.js +61 -19
  100. package/lib/tfExpression.d.ts +50 -0
  101. package/lib/tfExpression.js +114 -33
  102. package/lib/tokens/lazy.d.ts +4 -0
  103. package/lib/tokens/lazy.js +21 -8
  104. package/lib/tokens/private/dependency.js +2 -6
  105. package/lib/tokens/private/resolve.js +3 -3
  106. package/lib/tokens/private/stack-trace.d.ts +1 -1
  107. package/lib/tokens/private/stack-trace.js +1 -2
  108. package/lib/tokens/resolvable.js +2 -2
  109. package/lib/tokens/string-fragments.js +4 -4
  110. package/lib/tokens/token.js +2 -2
  111. package/lib/upgrade-id-aspect.js +1 -1
  112. package/lib/util.d.ts +0 -1
  113. package/lib/util.js +4 -4
  114. package/lib/validations/target-versions.d.ts +12 -0
  115. package/lib/validations/target-versions.js +40 -1
  116. package/package.json +112 -109
@@ -2,9 +2,14 @@ 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;
11
+ private resolveObjectKey;
12
+ private resolveTokenKey;
8
13
  /**
9
14
  * Escape string removes characters from the string that are not allowed in Terraform or JSON
10
15
  * It must only be used on non-token values
@@ -12,7 +17,16 @@ declare class TFExpression extends Intrinsic implements IResolvable {
12
17
  protected escapeString(str: string): string;
13
18
  private resolveString;
14
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
+ */
15
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
+ */
16
30
  declare class Reference extends TFExpression {
17
31
  private identifier;
18
32
  private originStack?;
@@ -26,19 +40,37 @@ declare class Reference extends TFExpression {
26
40
  constructor(identifier: string, originStack?: TerraformStack | undefined);
27
41
  resolve(context: IResolveContext): string;
28
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
+ */
29
49
  export declare function ref(identifier: string, stack?: TerraformStack): IResolvable;
30
50
  /**
31
51
  * marks the argument as being used in a terraform expression
32
52
  * @deprecated
33
53
  */
34
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
+ */
35
58
  declare class PropertyAccess extends TFExpression {
36
59
  private target;
37
60
  private args;
38
61
  constructor(target: Expression, args: Expression[]);
39
62
  resolve(context: IResolveContext): string;
40
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
+ */
41
70
  export declare function propertyAccess(target: Expression, args: Expression[]): IResolvable;
71
+ /**
72
+ * Expression rendering a Terraform conditional, e.g. `condition ? trueValue : falseValue`.
73
+ */
42
74
  declare class ConditionalExpression extends TFExpression {
43
75
  private condition;
44
76
  private trueValue;
@@ -62,12 +94,22 @@ export declare class OperatorExpression extends TFExpression {
62
94
  constructor(operator: Operator, left: Expression, right?: Expression | undefined);
63
95
  resolve(context: IResolveContext): string;
64
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
+ */
65
101
  declare class FunctionCall extends TFExpression {
66
102
  private name;
67
103
  private args;
68
104
  constructor(name: string, args: Expression[]);
69
105
  resolve(context: IResolveContext): string;
70
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
+ */
71
113
  export declare function call(name: string, args: Expression[]): IResolvable;
72
114
  export declare const FOR_EXPRESSION_KEY: IResolvable;
73
115
  export declare const FOR_EXPRESSION_VALUE: IResolvable;
@@ -99,11 +141,19 @@ declare class ForExpression extends TFExpression {
99
141
  * Currently does not support filtering elements (if clause) or grouping results
100
142
  */
101
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
+ */
102
147
  declare class Dependable extends TFExpression {
103
148
  private dependable;
104
149
  constructor(dependable: ITerraformDependable);
105
150
  resolve(context: IResolveContext): string;
106
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
+ */
107
157
  export declare function dependable(dependable: ITerraformDependable): string;
108
158
  export type Expression = Reference | FunctionCall | PropertyAccess | ConditionalExpression | OperatorExpression | Dependable | ForExpression | string | string[] | number | boolean | IResolvable | {
109
159
  [key: string]: any;
@@ -14,25 +14,11 @@ const token_1 = require("./tokens/token");
14
14
  const app_1 = require("./app");
15
15
  const terraform_stack_1 = require("./terraform-stack");
16
16
  const constructs_1 = require("constructs");
17
+ const quoted_string_key_1 = require("./hcl/quoted-string-key");
17
18
  const TERRAFORM_IDENTIFIER_REGEX = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
18
19
  /**
19
- * Serializes an object key as a Terraform quoted-string literal:
20
- * `JSON.stringify` covers quotes, backslashes and control characters, and
21
- * `$${`/`%%{` are Terraform's own escapes for what would otherwise become
22
- * template interpolation/directive sequences inside the quoted string. The
23
- * pre-existing direct-object branches of `resolveExpressionPart` still
24
- * interpolate keys unescaped - tracked in
25
- * https://github.com/open-constructs/cdk-terrain/issues/350.
20
+ * Base class for Terraform expression tokens, with helpers that render resolved arguments as Terraform syntax.
26
21
  */
27
- function quotedStringKey(key) {
28
- // Replacer functions, not replacement strings: in a replacement string
29
- // `$$` is itself an escape (for a literal `$`), so `"$${"` would emit
30
- // just `${` - silently undoing the escape this exists to produce.
31
- return JSON.stringify(key)
32
- .replace(/\$\{/g, () => "$${")
33
- .replace(/%\{/g, () => "%%{");
34
- }
35
- // eslint-disable-next-line jsdoc/require-jsdoc
36
22
  class TFExpression extends intrinsic_1.Intrinsic {
37
23
  resolveExpressionPart(context, arg) {
38
24
  const resolvedArg = context.resolve(arg);
@@ -75,7 +61,7 @@ class TFExpression extends intrinsic_1.Intrinsic {
75
61
  }
76
62
  if (typeof resolvedArg === "object") {
77
63
  return `{${Object.keys(resolvedArg)
78
- .map((key) => `${quotedStringKey(key)} = ${this.resolveArg(context, resolvedArg[key])}`)
64
+ .map((key) => `${this.resolveObjectKey(context, key)} = ${this.resolveArg(context, resolvedArg[key])}`)
79
65
  .join(", ")}}`;
80
66
  }
81
67
  return resolvedArg;
@@ -86,8 +72,18 @@ class TFExpression extends intrinsic_1.Intrinsic {
86
72
  .join(", ")}]`;
87
73
  }
88
74
  if (typeof resolvedArg === "object" && resolvedArg !== null) {
89
- return `{${Object.keys(resolvedArg)
90
- .map((key) => `"${key}" = ${this.resolveArg(context, arg[key])}`)
75
+ // Use arg's own keys, not resolvedArg's: context.resolve() deep-resolves
76
+ // object keys too, replacing a token placeholder with its resolved
77
+ // reference text and dropping the `${...}` wrapper, so resolvedArg's
78
+ // keys no longer look like tokens and no longer match `arg`'s.
79
+ // context.resolve() also drops undefined-valued entries (mirroring
80
+ // JSON.stringify), so filter those out here to match resolvedArg's keys.
81
+ // A resolvable value (e.g. Lazy.anyValue()) only reveals `undefined`
82
+ // once resolved, so resolve the value - not just check `arg[key]` - to
83
+ // detect it.
84
+ return `{${Object.keys(arg)
85
+ .filter((key) => context.resolve(arg[key]) !== undefined)
86
+ .map((key) => `${this.resolveObjectKey(context, key)} = ${this.resolveArg(context, arg[key])}`)
91
87
  .join(", ")}}`;
92
88
  }
93
89
  // A literal `null`/`undefined` argument (e.g. a fixed-arity provider
@@ -114,6 +110,55 @@ class TFExpression extends intrinsic_1.Intrinsic {
114
110
  }
115
111
  return this.resolveExpressionPart(context, arg);
116
112
  }
113
+ // An object key built from a token (e.g. `{[res.id]: "v"}`) is a JS string
114
+ // holding the token's placeholder by the time it reaches here, and reads
115
+ // identically to a literal key unless we check for the placeholder.
116
+ // HCL has no object-key interpolation syntax, so a token key can only be
117
+ // expressed as a parenthesised key expression, e.g. `(resource.id) = "v"`.
118
+ resolveObjectKey(context, key) {
119
+ const tokenList = token_1.Tokenization.reverseString(key);
120
+ const hasToken = tokenList.tokens.length + tokenList.intrinsic.length > 0;
121
+ if (!hasToken) {
122
+ return (0, quoted_string_key_1.quotedStringKey)(key);
123
+ }
124
+ return `(${this.resolveTokenKey(context, key)})`;
125
+ }
126
+ // A mixed literal/token key (e.g. `{[`prefix-${res.id}`]: "v"}`) must stay a
127
+ // key expression, not go through resolveArg()'s resolveString(), which
128
+ // escapes a literal fragment for use as a Terraform *value* (only `\n` and
129
+ // `${`) rather than as a quoted-string *key* (which also needs quotes and
130
+ // backslashes escaped).
131
+ resolveTokenKey(context, key) {
132
+ const tokenList = token_1.Tokenization.reverseString(key);
133
+ const numberOfTokens = tokenList.tokens.length + tokenList.intrinsic.length;
134
+ // A key that is only a token (no literal fragments) is a bare reference
135
+ // expression, not a quoted string - e.g. `(resource.id) = "v"`.
136
+ if (tokenList.literals.length === 0 &&
137
+ tokenList.escapes.length === 0 &&
138
+ numberOfTokens === 1) {
139
+ return context.resolve(key);
140
+ }
141
+ const joinResult = tokenList.join({
142
+ join: (left, right) => {
143
+ const leftTokens = token_1.Tokenization.reverse(left);
144
+ const leftTokenList = token_1.Tokenization.reverseString(left);
145
+ const rightTokens = token_1.Tokenization.reverse(right);
146
+ const leftTokenCount = leftTokenList.intrinsic.length + leftTokenList.tokens.length;
147
+ let leftValue = left;
148
+ if (leftTokenList.literals.length === 1 && leftTokenCount === 0) {
149
+ leftValue = (0, quoted_string_key_1.quotedStringKeyFragment)(left);
150
+ }
151
+ if (leftTokenList.literals.length === 0 && leftTokenCount === 1) {
152
+ leftValue = `\${${leftTokens[0]}}`;
153
+ }
154
+ const rightValue = rightTokens.length === 0
155
+ ? (0, quoted_string_key_1.quotedStringKeyFragment)(right)
156
+ : `\${${rightTokens[0]}}`;
157
+ return `${leftValue}${rightValue}`;
158
+ },
159
+ });
160
+ return `"${joinResult}"`;
161
+ }
117
162
  /**
118
163
  * Escape string removes characters from the string that are not allowed in Terraform or JSON
119
164
  * It must only be used on non-token values
@@ -170,8 +215,9 @@ class TFExpression extends intrinsic_1.Intrinsic {
170
215
  : `"${joinResult}"`;
171
216
  }
172
217
  }
173
- // A string that represents an input value to be escaped
174
- // eslint-disable-next-line jsdoc/require-jsdoc
218
+ /**
219
+ * Expression that renders a literal string with newlines, `${` sequences and double quotes escaped.
220
+ */
175
221
  class RawString extends TFExpression {
176
222
  str;
177
223
  constructor(str) {
@@ -180,17 +226,24 @@ class RawString extends TFExpression {
180
226
  }
181
227
  resolve(context) {
182
228
  const qts = context.suppressBraces ? `"` : ``;
183
- 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}`;
184
230
  }
185
231
  toString() {
186
232
  return this.str;
187
233
  }
188
234
  }
189
- // 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
+ */
190
240
  function rawString(str) {
191
241
  return new RawString(str);
192
242
  }
193
- // 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
+ */
194
247
  class Reference extends TFExpression {
195
248
  identifier;
196
249
  originStack;
@@ -229,7 +282,12 @@ class Reference extends TFExpression {
229
282
  return suppressBraces ? this.identifier : `\${${this.identifier}}`;
230
283
  }
231
284
  }
232
- // 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
+ */
233
291
  function ref(identifier, stack) {
234
292
  return new Reference(identifier, stack);
235
293
  }
@@ -240,7 +298,9 @@ function ref(identifier, stack) {
240
298
  function insideTfExpression(arg) {
241
299
  return arg;
242
300
  }
243
- // eslint-disable-next-line jsdoc/require-jsdoc
301
+ /**
302
+ * Expression accessing properties, indices or splats (`[*]`) on a target, e.g. `target.prop[0]`.
303
+ */
244
304
  class PropertyAccess extends TFExpression {
245
305
  target;
246
306
  args;
@@ -273,11 +333,18 @@ class PropertyAccess extends TFExpression {
273
333
  return suppressBraces ? expr : `\${${expr}}`;
274
334
  }
275
335
  }
276
- // 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
+ */
277
342
  function propertyAccess(target, args) {
278
343
  return new PropertyAccess(target, args);
279
344
  }
280
- // eslint-disable-next-line jsdoc/require-jsdoc
345
+ /**
346
+ * Expression rendering a Terraform conditional, e.g. `condition ? trueValue : falseValue`.
347
+ */
281
348
  class ConditionalExpression extends TFExpression {
282
349
  condition;
283
350
  trueValue;
@@ -350,7 +417,10 @@ class OperatorExpression extends TFExpression {
350
417
  }
351
418
  }
352
419
  exports.OperatorExpression = OperatorExpression;
353
- // 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
+ */
354
424
  class FunctionCall extends TFExpression {
355
425
  name;
356
426
  args;
@@ -412,7 +482,12 @@ class FunctionCall extends TFExpression {
412
482
  return suppressBraces ? expr : `\${${expr}}`;
413
483
  }
414
484
  }
415
- // 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
+ */
416
491
  function call(name, args) {
417
492
  return new FunctionCall(name, args);
418
493
  }
@@ -470,7 +545,9 @@ class ForExpression extends TFExpression {
470
545
  function forExpression(input, valueExpression, keyExpression) {
471
546
  return new ForExpression(input, valueExpression, keyExpression);
472
547
  }
473
- // eslint-disable-next-line jsdoc/require-jsdoc
548
+ /**
549
+ * Expression rendering the fully qualified name of a dependable, for use in `depends_on`.
550
+ */
474
551
  class Dependable extends TFExpression {
475
552
  dependable;
476
553
  constructor(dependable) {
@@ -482,8 +559,12 @@ class Dependable extends TFExpression {
482
559
  return this.dependable.fqn;
483
560
  }
484
561
  }
485
- // 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
+ */
486
567
  function dependable(dependable) {
487
568
  return token_1.Token.asString(new Dependable(dependable));
488
569
  }
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZFeHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RmRXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvTkEsOEJBRUM7QUFtREQsa0JBRUM7QUFNRCxnREFFQztBQStDRCx3Q0FFQztBQTZCRCxrQ0FNQztBQXNJRCxvQkFFQztBQXdERCxzQ0FVQztBQWVELGdDQUVDO0FBL2pCRCwwREFBdUQ7QUFDdkQsMENBQXFEO0FBQ3JELCtCQUE0QjtBQUM1Qix1REFBbUQ7QUFFbkQsMkNBQXVDO0FBRXZDLE1BQU0sMEJBQTBCLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxHQUFXO0lBQ2xDLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsa0VBQWtFO0lBQ2xFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7U0FDdkIsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDN0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sWUFBYSxTQUFRLHFCQUFTO0lBQ3hCLHFCQUFxQixDQUFDLE9BQXdCLEVBQUUsR0FBUTtRQUNoRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksb0JBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxtRUFBbUU7WUFDbkUsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUsb0VBQW9FO1lBQ3BFLHVFQUF1RTtZQUN2RSw2REFBNkQ7WUFDN0QsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSxvRUFBb0U7WUFDcEUsbUVBQW1FO1lBQ25FLHNFQUFzRTtZQUN0RSxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0Qsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSxpRUFBaUU7WUFDakUsc0VBQXNFO1lBQ3RFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUseURBQXlEO1lBQ3pELHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUsc0VBQXNFO1lBQ3RFLGtFQUFrRTtZQUNsRSxxRUFBcUU7WUFDckUsOERBQThEO1lBQzlELGlFQUFpRTtZQUNqRSxxRUFBcUU7WUFDckUsd0RBQXdEO1lBQ3hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLElBQUksV0FBVztxQkFDbkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztxQkFDaEMsR0FBRyxDQUNGLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDTixHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUM1RTtxQkFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxXQUFXO2lCQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM1RCxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7aUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbkIsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSx5RUFBeUU7UUFDekUsOERBQThEO1FBQzlELElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxVQUFVLENBQUMsT0FBd0IsRUFBRSxHQUFRO1FBQ3JELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNqRCwwR0FBMEc7WUFDMUcseUdBQXlHO1lBQ3pHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDTyxZQUFZLENBQUMsR0FBVztRQUNoQyxPQUFPLEdBQUc7YUFDUCxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLGtCQUFrQjthQUN4QyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ2pELENBQUM7SUFFTyxhQUFhLENBQUMsR0FBVyxFQUFFLFdBQWdCO1FBQ2pELE1BQU0sU0FBUyxHQUFHLG9CQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRTVFLGlCQUFpQjtRQUNqQixJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLFdBQVcsS0FBSyxHQUFHO2dCQUN4QixXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDM0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQzVDLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsSUFDRSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDOUIsY0FBYyxLQUFLLENBQUMsRUFDcEIsQ0FBQztZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sVUFBVSxHQUFHLG9CQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLGFBQWEsR0FBRyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxXQUFXLEdBQUcsb0JBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRWhELE1BQU0sY0FBYyxHQUNsQixhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFFL0QsZ0dBQWdHO2dCQUNoRyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBRXJCLHlEQUF5RDtnQkFDekQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztnQkFFRCx1RUFBdUU7Z0JBQ3ZFLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JDLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQ2QsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7b0JBQzFCLENBQUMsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUU5QixPQUFPLEdBQUcsU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLFVBQVUsS0FBSyxHQUFHO1lBQ3ZCLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxVQUFVO1lBQ1osQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBRUQsd0RBQXdEO0FBQ3hELCtDQUErQztBQUMvQyxNQUFNLFNBQVUsU0FBUSxZQUFZO0lBQ0w7SUFBN0IsWUFBNkIsR0FBVztRQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEZ0IsUUFBRyxHQUFILEdBQUcsQ0FBUTtJQUV4QyxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztJQUNySCxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsU0FBUyxDQUFDLEdBQVc7SUFDbkMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sU0FBVSxTQUFRLFlBQVk7SUFTeEI7SUFDQTtJQVRWOzs7OztPQUtHO0lBQ0ssb0JBQW9CLEdBQTJCLEVBQUUsQ0FBQztJQUMxRCxZQUNVLFVBQWtCLEVBQ2xCLFdBQTRCO1FBRXBDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUhWLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO0lBR3RDLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsK0VBQStFO1FBQy9FLE1BQU0sZUFBZSxHQUFHLGdDQUFjLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0Qix3QkFBd0I7WUFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzdELE1BQU0sR0FBRyxHQUFHLFNBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsbUJBQW1CLENBQ2pDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGVBQWUsRUFDZixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO2dCQUVGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFFRCx1RkFBdUY7UUFDdkYsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLGNBQWM7Z0JBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDO2dCQUN0QyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUNwRCxDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQUVELCtDQUErQztBQUMvQyxTQUFnQixHQUFHLENBQUMsVUFBa0IsRUFBRSxLQUFzQjtJQUM1RCxPQUFPLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsR0FBUTtJQUN6QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBTSxjQUFlLFNBQVEsWUFBWTtJQUU3QjtJQUNBO0lBRlYsWUFDVSxNQUFrQixFQUNsQixJQUFrQjtRQUUxQixLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUhoQixXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLFNBQUksR0FBSixJQUFJLENBQWM7SUFHNUIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTlCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJO2FBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sYUFBYSxHQUNqQixPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sYUFBYSxHQUNqQixPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXRELElBQUksYUFBYSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7WUFDbkIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxrQkFBa0I7YUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRVosTUFBTSxVQUFVLEdBQ2Qsc0JBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTTtZQUN4RCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxVQUFVLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFFOUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsY0FBYyxDQUFDLE1BQWtCLEVBQUUsSUFBa0I7SUFDbkUsT0FBTyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFnQixDQUFDO0FBQ3pELENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBTSxxQkFBc0IsU0FBUSxZQUFZO0lBRXBDO0lBQ0E7SUFDQTtJQUhWLFlBQ1UsU0FBcUIsRUFDckIsU0FBcUIsRUFDckIsVUFBc0I7UUFFOUIsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBSnBDLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBR2hDLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RCxNQUFNLElBQUksR0FBRyxHQUFHLFNBQVMsTUFBTSxTQUFTLE1BQU0sVUFBVSxFQUFFLENBQUM7UUFFM0QsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsU0FBcUIsRUFDckIsU0FBcUIsRUFDckIsVUFBc0I7SUFFdEIsT0FBTyxJQUFJLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDckUsQ0FBQztBQW1CRDs7O0dBR0c7QUFDSCxNQUFhLGtCQUFtQixTQUFRLFlBQVk7SUFFeEM7SUFDQTtJQUNBO0lBSFYsWUFDVSxRQUFrQixFQUNsQixJQUFnQixFQUNoQixLQUFrQjtRQUUxQixLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUpoRCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsVUFBSyxHQUFMLEtBQUssQ0FBYTtJQUc1QixDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDOUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUNULElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUztZQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN0QyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDVCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztnQkFDbEUsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hCLGNBQWM7b0JBQ2QsSUFBSSxHQUFHLElBQUksSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDO2dCQUNoQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sV0FBVztvQkFDWCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztnQkFDcEUsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxHQUFHLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQTFDRCxnREEwQ0M7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBTSxZQUFhLFNBQVEsWUFBWTtJQUUzQjtJQUNBO0lBRlYsWUFDVSxJQUFZLEVBQ1osSUFBa0I7UUFFMUIsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFIZCxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osU0FBSSxHQUFKLElBQUksQ0FBYztJQUc1QixDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLDhEQUE4RDtRQUM5RCx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLGdFQUFnRTtRQUNoRSxtRUFBbUU7UUFDbkUscUNBQXFDO1FBQ3JDLEVBQUU7UUFDRiw0REFBNEQ7UUFDNUQsMkRBQTJEO1FBQzNELHFFQUFxRTtRQUNyRSx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxtRUFBbUU7UUFDbkUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxnQ0FBZ0M7UUFDaEMsSUFBSSxLQUFpQyxDQUFDO1FBQ3RDLElBQUksZ0NBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUM7Z0JBQ0gsS0FBSyxHQUFHLGdDQUFjLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxLQUFLLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDcEQsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBRWhELE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRTNCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJO2FBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWQsTUFBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLGNBQWMsR0FBRyxDQUFDO1FBRS9DLE9BQU8sQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUM7UUFDOUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztRQUUxQyxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQUNELCtDQUErQztBQUMvQyxTQUFnQixJQUFJLENBQUMsSUFBWSxFQUFFLElBQWtCO0lBQ25ELE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBZ0IsQ0FBQztBQUNyRCxDQUFDO0FBRVksUUFBQSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEMsUUFBQSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLGFBQWMsU0FBUSxZQUFZO0lBRTVCO0lBQ0E7SUFDQTtJQUhWLFlBQ1UsS0FBaUIsRUFDakIsZUFBMkIsRUFDM0IsYUFBMEI7UUFFbEMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBSnpDLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsb0JBQWUsR0FBZixlQUFlLENBQVk7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWE7SUFHcEMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsMEJBQWtCLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSw0QkFBb0IsQ0FBQyxDQUFDO1FBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1RSxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV4RSxJQUFJLEdBQUcsU0FBUyxHQUFHLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLE9BQU8sU0FBUyxJQUFJLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEdBQUcsU0FBUyxHQUFHLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSyxTQUFTLEdBQUcsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsS0FBaUIsRUFDakIsZUFBMkIsRUFDM0IsYUFBMEI7SUFFMUIsT0FBTyxJQUFJLGFBQWEsQ0FDdEIsS0FBSyxFQUNMLGVBQWUsRUFDZixhQUFhLENBQ0MsQ0FBQztBQUNuQixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sVUFBVyxTQUFRLFlBQVk7SUFDZjtJQUFwQixZQUFvQixVQUFnQztRQUNsRCxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFEQSxlQUFVLEdBQVYsVUFBVSxDQUFzQjtJQUVwRCxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBQ0QsK0NBQStDO0FBQy9DLFNBQWdCLFVBQVUsQ0FBQyxVQUFnQztJQUN6RCxPQUFPLGFBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IElSZXNvbHZhYmxlLCBJUmVzb2x2ZUNvbnRleHQgfSBmcm9tIFwiLi90b2tlbnMvcmVzb2x2YWJsZVwiO1xuaW1wb3J0IHsgSW50cmluc2ljIH0gZnJvbSBcIi4vdG9rZW5zL3ByaXZhdGUvaW50cmluc2ljXCI7XG5pbXBvcnQgeyBUb2tlbml6YXRpb24sIFRva2VuIH0gZnJvbSBcIi4vdG9rZW5zL3Rva2VuXCI7XG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiLi9hcHBcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcIi4vdGVycmFmb3JtLXN0YWNrXCI7XG5pbXBvcnQgeyBJVGVycmFmb3JtRGVwZW5kYWJsZSB9IGZyb20gXCIuL3RlcnJhZm9ybS1kZXBlbmRhYmxlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5jb25zdCBURVJSQUZPUk1fSURFTlRJRklFUl9SRUdFWCA9IC9eW19hLXpBLVpdW19hLXpBLVowLTldKiQvO1xuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gb2JqZWN0IGtleSBhcyBhIFRlcnJhZm9ybSBxdW90ZWQtc3RyaW5nIGxpdGVyYWw6XG4gKiBgSlNPTi5zdHJpbmdpZnlgIGNvdmVycyBxdW90ZXMsIGJhY2tzbGFzaGVzIGFuZCBjb250cm9sIGNoYXJhY3RlcnMsIGFuZFxuICogYCQke2AvYCUle2AgYXJlIFRlcnJhZm9ybSdzIG93biBlc2NhcGVzIGZvciB3aGF0IHdvdWxkIG90aGVyd2lzZSBiZWNvbWVcbiAqIHRlbXBsYXRlIGludGVycG9sYXRpb24vZGlyZWN0aXZlIHNlcXVlbmNlcyBpbnNpZGUgdGhlIHF1b3RlZCBzdHJpbmcuIFRoZVxuICogcHJlLWV4aXN0aW5nIGRpcmVjdC1vYmplY3QgYnJhbmNoZXMgb2YgYHJlc29sdmVFeHByZXNzaW9uUGFydGAgc3RpbGxcbiAqIGludGVycG9sYXRlIGtleXMgdW5lc2NhcGVkIC0gdHJhY2tlZCBpblxuICogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tY29uc3RydWN0cy9jZGstdGVycmFpbi9pc3N1ZXMvMzUwLlxuICovXG5mdW5jdGlvbiBxdW90ZWRTdHJpbmdLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZXBsYWNlciBmdW5jdGlvbnMsIG5vdCByZXBsYWNlbWVudCBzdHJpbmdzOiBpbiBhIHJlcGxhY2VtZW50IHN0cmluZ1xuICAvLyBgJCRgIGlzIGl0c2VsZiBhbiBlc2NhcGUgKGZvciBhIGxpdGVyYWwgYCRgKSwgc28gYFwiJCR7XCJgIHdvdWxkIGVtaXRcbiAgLy8ganVzdCBgJHtgIC0gc2lsZW50bHkgdW5kb2luZyB0aGUgZXNjYXBlIHRoaXMgZXhpc3RzIHRvIHByb2R1Y2UuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShrZXkpXG4gICAgLnJlcGxhY2UoL1xcJFxcey9nLCAoKSA9PiBcIiQke1wiKVxuICAgIC5yZXBsYWNlKC8lXFx7L2csICgpID0+IFwiJSV7XCIpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgVEZFeHByZXNzaW9uIGV4dGVuZHMgSW50cmluc2ljIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCwgYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc29sdmVkQXJnID0gY29udGV4dC5yZXNvbHZlKGFyZyk7XG4gICAgaWYgKFRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoYXJnKSkge1xuICAgICAgLy8gQSByZXNvbHZhYmxlIGFyZyAoZS5nLiBgY2RrdG4uVG9rZW4ubnVsbFZhbHVlKClgLCBhbiBJUmVzb2x2YWJsZVxuICAgICAgLy8gd3JhcHBpbmcgYG51bGxgIC0gc2VlIFRva2VuLm51bGxWYWx1ZSgpL1Rva2VuLmFzQW55KCkpIGNhbiBpdHNlbGZcbiAgICAgIC8vIHJlc29sdmUgdG8gYG51bGxgL2B1bmRlZmluZWRgLiBDb2xsYXBzZSB0aGF0IHRvIHRoZSBsaXRlcmFsIFwibnVsbFwiXG4gICAgICAvLyBzdHJpbmcgdG9vLCBmb3IgdGhlIGV4YWN0IHNhbWUgcmVhc29uIGFzIHRoZSBwbGFpbi1udWxsL3VuZGVmaW5lZFxuICAgICAgLy8gYnJhbmNoIGZ1cnRoZXIgZG93bjogQXJyYXkucHJvdG90eXBlLmpvaW4oKSAodXNlZCBieSBjYWxsZXJzIGxpa2VcbiAgICAgIC8vIEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKCkpIHRyZWF0cyBhIGBudWxsYC9gdW5kZWZpbmVkYCBhcnJheSBFTEVNRU5UIGFzXG4gICAgICAvLyBhbiBlbXB0eSBzdHJpbmcsIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBhcmd1bWVudCBpbnN0ZWFkIG9mXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIFRlcnJhZm9ybSBgbnVsbGAga2V5d29yZC4gV2l0aG91dCB0aGlzLCBvbmx5IGFcbiAgICAgIC8vIGxpdGVyYWwgSlMgYG51bGxgL2B1bmRlZmluZWRgIGFyZ3VtZW50IHJlbmRlcmVkIGNvcnJlY3RseSAtIGFcbiAgICAgIC8vIHJlc29sdmFibGUgdG9rZW4gdGhhdCByZXNvbHZlcyB0byBgbnVsbGAgKHRoZSBvbmx5IHdheSB0byBwYXNzIGFuXG4gICAgICAvLyBleHBsaWNpdCBgbnVsbGAgaW4gYSBqc2lpLXR5cGVkIGZpeGVkIHBvc2l0aW9uLCBzaW5jZSBqc2lpIGNhbid0XG4gICAgICAvLyBleHByZXNzIGEgbGl0ZXJhbCBgbnVsbGAgcGFyYW1ldGVyIHR5cGUpIHNpbGVudGx5IHZhbmlzaGVkIGluc3RlYWQuXG4gICAgICBpZiAocmVzb2x2ZWRBcmcgPT09IG51bGwgfHwgcmVzb2x2ZWRBcmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICB9XG4gICAgICAvLyBBIHJlc29sdmFibGUgY2FuIGl0c2VsZiByZXNvbHZlIHRvIGEgcGxhaW4gKHVuZW5jb2RlZCkgYXJyYXkvb2JqZWN0XG4gICAgICAvLyByYXRoZXIgdGhhbiBhbiBhbHJlYWR5LXJlbmRlcmVkIHN0cmluZyAtIGUuZy4gYSBtYW51YWxseS1jb25zdHJ1Y3RlZFxuICAgICAgLy8gd2hvbGUtY29sbGVjdGlvbiB0b2tlbiBsaWtlIGBjZGt0bi5Ub2tlbi5hc0FueShbdHJ1ZSwgZmFsc2VdKWBcbiAgICAgIC8vIChleGFjdGx5IHRoZSBzaGFwZSBhIGpzaWktdHlwZWQgYEFycmF5PGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZT5cbiAgICAgIC8vIHwgY2RrdG4uSVJlc29sdmFibGVgIHByb3ZpZGVyLWZ1bmN0aW9uIHBhcmFtZXRlciBub3cgYWNjZXB0cyAtIHNlZVxuICAgICAgLy8gcHJvdmlkZXItZnVuY3Rpb24tbW9kZWwudHMpLiBGb3JtYXQgaXQgdGhlIHNhbWUgYnJhY2tldC9icmFjZSB3YXlcbiAgICAgIC8vIHRoZSBwbGFpbiBhcnJheS9vYmplY3QgYnJhbmNoZXMgYmVsb3cgZG8sIHJlY3Vyc2luZyBvblxuICAgICAgLy8gYHJlc29sdmVkQXJnYCdzIG93biBlbGVtZW50cyAoTk9UIGBhcmdgJ3MgLSBgYXJnYCBpcyB0aGUgcmVzb2x2YWJsZVxuICAgICAgLy8gd3JhcHBlciBpdHNlbGYsIG5vdCBpbmRleGFibGUva2V5YWJsZSkuIFdpdGhvdXQgdGhpcywgdGhlIGFycmF5XG4gICAgICAvLyBicmFuY2ggYmVsb3cgaXMgdW5yZWFjaGFibGUgZm9yIGEgcmVzb2x2YWJsZSBhcmcgKHRoaXMgYGlmYCBhbHJlYWR5XG4gICAgICAvLyByZXR1cm5lZCksIHNvIHRoZSByYXcgYXJyYXkvb2JqZWN0IGZlbGwgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIHBsYWluIGByZXR1cm4gcmVzb2x2ZWRBcmdgIGF0IHRoZSBib3R0b20gLSByZWx5aW5nIG9uIHRoZSBjYWxsZXInc1xuICAgICAgLy8gYEFycmF5LnByb3RvdHlwZS5qb2luKClgIChGdW5jdGlvbkNhbGwucmVzb2x2ZSgpIGV0IGFsLikgdG9cbiAgICAgIC8vIHN0cmluZ2lmeSBpdCwgd2hpY2ggZHJvcHMgYW4gYXJyYXkncyBicmFja2V0cy9zcGFjaW5nIChyZW5kZXJzXG4gICAgICAvLyBgdHJ1ZSxmYWxzZWAgaW5zdGVhZCBvZiBgW3RydWUsIGZhbHNlXWApIGFuZCwgZm9yIGFuIG9iamVjdCwgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgdGhlIHVzZWxlc3MgbGl0ZXJhbCBzdHJpbmcgYFtvYmplY3QgT2JqZWN0XWAuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvbHZlZEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtyZXNvbHZlZEFyZ1xuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBpdGVtKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfV1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZEFyZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHJlc29sdmVkQXJnKVxuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAoa2V5KSA9PlxuICAgICAgICAgICAgICBgJHtxdW90ZWRTdHJpbmdLZXkoa2V5KX0gPSAke3RoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCByZXNvbHZlZEFyZ1trZXldKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbihcIiwgXCIpfX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkQXJnO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvbHZlZEFyZykpIHtcbiAgICAgIHJldHVybiBgWyR7cmVzb2x2ZWRBcmdcbiAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmdbaW5kZXhdKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX1dYDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkQXJnID09PSBcIm9iamVjdFwiICYmIHJlc29sdmVkQXJnICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHJlc29sdmVkQXJnKVxuICAgICAgICAubWFwKChrZXkpID0+IGBcIiR7a2V5fVwiID0gJHt0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgYXJnW2tleV0pfWApXG4gICAgICAgIC5qb2luKFwiLCBcIil9fWA7XG4gICAgfVxuXG4gICAgLy8gQSBsaXRlcmFsIGBudWxsYC9gdW5kZWZpbmVkYCBhcmd1bWVudCAoZS5nLiBhIGZpeGVkLWFyaXR5IHByb3ZpZGVyXG4gICAgLy8gZnVuY3Rpb24gcG9zaXRpb25hbCBzbG90IHRoZSBjYWxsZXIgaW50ZW50aW9uYWxseSBsZWZ0IGVtcHR5KSBtdXN0IGJlXG4gICAgLy8gcmVuZGVyZWQgYXMgdGhlIFRlcnJhZm9ybSBgbnVsbGAga2V5d29yZC4gV2l0aG91dCB0aGlzLCBgcmVzb2x2ZWRBcmdgXG4gICAgLy8gc3RheXMgYG51bGxgL2B1bmRlZmluZWRgIGFuZCBBcnJheS5wcm90b3R5cGUuam9pbigpICh1c2VkIGJ5IGNhbGxlcnNcbiAgICAvLyBsaWtlIEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKCkpIHNpbGVudGx5IGNvbGxhcHNlcyBpdCB0byBhbiBlbXB0eSBzdHJpbmcsXG4gICAgLy8gc2hpZnRpbmcvZHJvcHBpbmcgdGhlIGFyZ3VtZW50IGluc3RlYWQgb2YgcmVuZGVyaW5nIGBudWxsYC5cbiAgICBpZiAocmVzb2x2ZWRBcmcgPT09IG51bGwgfHwgcmVzb2x2ZWRBcmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZEFyZztcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQXJnKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCwgYXJnOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc29sdmVkQXJnID0gY29udGV4dC5yZXNvbHZlKGFyZyk7XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3Qgc3RyID0gdGhpcy5yZXNvbHZlU3RyaW5nKGFyZywgcmVzb2x2ZWRBcmcpO1xuICAgICAgLy8gV2hlbiBUb2tlbi5hc1N0cmluZygpIGlzIHVzZWQgb24gYW4gb2JqZWN0LCBzdHIgd2lsbCBiZSB0aGUgb2JqZWN0IGFuZCBuZWVkcyB0byBiZSByZXNvbHZlZCBkaWZmZXJlbnRseVxuICAgICAgLy8gVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIGluIE1hcFRlcnJhZm9ybUl0ZXJhdG9yI19nZXRGb3JFYWNoRXhwcmVzc2lvbiBhbmQgY2FuIGNhdXNlIGlzc3VlcyBsaWtlICMzNTQwXG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRXhwcmVzc2lvblBhcnQoY29udGV4dCwgc3RyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQsIGFyZyk7XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlIHN0cmluZyByZW1vdmVzIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIFRlcnJhZm9ybSBvciBKU09OXG4gICAqIEl0IG11c3Qgb25seSBiZSB1c2VkIG9uIG5vbi10b2tlbiB2YWx1ZXNcbiAgICovXG4gIHByb3RlY3RlZCBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIikgLy8gZXNjYXBlIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFwkey9nLCBcIiQkJHtcIik7IC8vIGVzY2FwZSAkeyB0byAkJHtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0cmluZyhzdHI6IHN0cmluZywgcmVzb2x2ZWRBcmc6IGFueSkge1xuICAgIGNvbnN0IHRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKHN0cik7XG4gICAgY29uc3QgbnVtYmVyT2ZUb2tlbnMgPSB0b2tlbkxpc3QudG9rZW5zLmxlbmd0aCArIHRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoO1xuXG4gICAgLy8gU3RyaW5nIGxpdGVyYWxcbiAgICBpZiAobnVtYmVyT2ZUb2tlbnMgPT09IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlZEFyZyAhPT0gYFwiYCAmJlxuICAgICAgICByZXNvbHZlZEFyZy5zdGFydHNXaXRoKCdcIicpICYmXG4gICAgICAgIHJlc29sdmVkQXJnLmVuZHNXaXRoKCdcIicpXG4gICAgICAgID8gdGhpcy5lc2NhcGVTdHJpbmcocmVzb2x2ZWRBcmcpXG4gICAgICAgIDogYFwiJHt0aGlzLmVzY2FwZVN0cmluZyhyZXNvbHZlZEFyZyl9XCJgO1xuICAgIH1cblxuICAgIC8vIE9ubHkgYSB0b2tlbiByZWZlcmVuY2VcbiAgICBpZiAoXG4gICAgICB0b2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAwICYmXG4gICAgICB0b2tlbkxpc3QuZXNjYXBlcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIG51bWJlck9mVG9rZW5zID09PSAxXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRBcmc7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIGxpdGVyYWwgKyB0b2tlbiByZWZlcmVuY2UgY29tYmluYXRpb25cbiAgICBjb25zdCBqb2luUmVzdWx0ID0gdG9rZW5MaXN0LmpvaW4oe1xuICAgICAgam9pbjogKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZnRUb2tlbnMgPSBUb2tlbml6YXRpb24ucmV2ZXJzZShsZWZ0KTtcbiAgICAgICAgY29uc3QgbGVmdFRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodFRva2VucyA9IFRva2VuaXphdGlvbi5yZXZlcnNlKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCBsZWZ0VG9rZW5Db3VudCA9XG4gICAgICAgICAgbGVmdFRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoICsgbGVmdFRva2VuTGlzdC50b2tlbnMubGVuZ3RoO1xuXG4gICAgICAgIC8vIGlmIGxlZnQgaXMgbWl4ZWQsIG5lZWRzIHRvIGJlIGxlZnQgYWxvbmUgKGJlY2F1c2UgaXQncyBhIHJlc3VsdCBvZiBhIHByZXZpb3VzIGpvaW4gaXRlcmF0aW9uKVxuICAgICAgICBsZXQgbGVmdFZhbHVlID0gbGVmdDtcblxuICAgICAgICAvLyBpZiBsZWZ0IGlzIGEgc3RyaW5nIGxpdGVyYWwsIHRoZW4gd2UgbmVlZCB0byBlc2NhcGUgaXRcbiAgICAgICAgaWYgKGxlZnRUb2tlbkxpc3QubGl0ZXJhbHMubGVuZ3RoID09PSAxICYmIGxlZnRUb2tlbkNvdW50ID09PSAwKSB7XG4gICAgICAgICAgbGVmdFZhbHVlID0gdGhpcy5lc2NhcGVTdHJpbmcobGVmdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBsZWZ0IGlzIG9ubHkgYSB0b2tlbiwgbmVlZHMgdG8gYmUgd3JhcHBlZCBhcyB0ZXJyYWZvcm0gZXhwcmVzc2lvblxuICAgICAgICBpZiAobGVmdFRva2VuTGlzdC5saXRlcmFscy5sZW5ndGggPT09IDAgJiYgbGVmdFRva2VuQ291bnQgPT09IDEpIHtcbiAgICAgICAgICBsZWZ0VmFsdWUgPSBgXFwkeyR7bGVmdFRva2Vuc1swXX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPVxuICAgICAgICAgIHJpZ2h0VG9rZW5zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyB0aGlzLmVzY2FwZVN0cmluZyhyaWdodClcbiAgICAgICAgICAgIDogYFxcJHske3JpZ2h0VG9rZW5zWzBdfX1gO1xuXG4gICAgICAgIHJldHVybiBgJHtsZWZ0VmFsdWV9JHtyaWdodFZhbHVlfWA7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGpvaW5SZXN1bHQgIT09IGBcImAgJiZcbiAgICAgIGpvaW5SZXN1bHQuc3RhcnRzV2l0aCgnXCInKSAmJlxuICAgICAgam9pblJlc3VsdC5lbmRzV2l0aCgnXCInKVxuICAgICAgPyBqb2luUmVzdWx0XG4gICAgICA6IGBcIiR7am9pblJlc3VsdH1cImA7XG4gIH1cbn1cblxuLy8gQSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGFuIGlucHV0IHZhbHVlIHRvIGJlIGVzY2FwZWRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5jbGFzcyBSYXdTdHJpbmcgZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN0cjogc3RyaW5nKSB7XG4gICAgc3VwZXIoc3RyKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIGNvbnN0IHF0cyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPyBgXCJgIDogYGA7XG4gICAgcmV0dXJuIGAke3F0c30ke3RoaXMuZXNjYXBlU3RyaW5nKHRoaXMuc3RyKS5yZXBsYWNlKC9cXFwiL2csICdcXFxcXCInKX0ke3F0c31gOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gcmF3U3RyaW5nKHN0cjogc3RyaW5nKTogSVJlc29sdmFibGUge1xuICByZXR1cm4gbmV3IFJhd1N0cmluZyhzdHIpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgUmVmZXJlbmNlIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIHJlZmVyZW5jZSBjb3VsZCBiZSB1c2VkIGluIG11bHRpcGxlIHN0YWNrcyxcbiAgICogZS5nLiBpZiB3ZSBleHBvc2UgdGhlIHJlZiBkaXJlY3RseSBvciBhcyB0b2tlbiBvbiB0aGUgc3RhY2suXG4gICAqIFdlIG5lZWQgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgZm9yIGVhY2ggc3RhY2ssXG4gICAqIHNvIHRoYXQgdGhlIHJlc29sdmVkIGlkZW50aWZpZXIgc3RyaW5nIG1hdGNoZXMgdGhlIHN0YWNrIGl0J3MgcmVzb2x2ZWQgaW4uXG4gICAqL1xuICBwcml2YXRlIGNyb3NzU3RhY2tJZGVudGlmaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHByaXZhdGUgb3JpZ2luU3RhY2s/OiBUZXJyYWZvcm1TdGFjayxcbiAgKSB7XG4gICAgc3VwZXIoaWRlbnRpZmllcik7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIC8vIFdlIGNoZWNrIGZvciBjcm9zcyBzdGFjayByZWZlcmVuY2VzIG9uIHByZXBhcmF0aW9uLCBzZXR0aW5nIGEgbmV3IGlkZW50aWZpZXJcbiAgICBjb25zdCByZXNvbHV0aW9uU3RhY2sgPSBUZXJyYWZvcm1TdGFjay5vZihjb250ZXh0LnNjb3BlKTtcbiAgICBjb25zdCBzdGFja05hbWUgPSByZXNvbHV0aW9uU3RhY2sudG9TdHJpbmcoKTtcbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG5cbiAgICBpZiAoY29udGV4dC5wcmVwYXJpbmcpIHtcbiAgICAgIC8vIENyb3NzIHN0YWNrIHJlZmVyZW5jZVxuICAgICAgaWYgKHRoaXMub3JpZ2luU3RhY2sgJiYgdGhpcy5vcmlnaW5TdGFjayAhPT0gcmVzb2x1dGlvblN0YWNrKSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IEFwcC5vZih0aGlzLm9yaWdpblN0YWNrKTtcbiAgICAgICAgY29uc3QgY3NyID0gYXBwLmNyb3NzU3RhY2tSZWZlcmVuY2UoXG4gICAgICAgICAgdGhpcy5vcmlnaW5TdGFjayxcbiAgICAgICAgICByZXNvbHV0aW9uU3RhY2ssXG4gICAgICAgICAgdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuY3Jvc3NTdGFja0lkZW50aWZpZXJbc3RhY2tOYW1lXSA9IGNzcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgY3Jvc3Mgc3RhY2sgcmVmZXJlbmNlIHdlIHdpbGwgcmVzb2x2ZSB0byBhIHJlZmVyZW5jZSB3aXRoaW4gdGhpcyBzdGFjay5cbiAgICBpZiAodGhpcy5jcm9zc1N0YWNrSWRlbnRpZmllcltzdGFja05hbWVdKSB7XG4gICAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXNcbiAgICAgICAgPyB0aGlzLmNyb3NzU3RhY2tJZGVudGlmaWVyW3N0YWNrTmFtZV1cbiAgICAgICAgOiBgXFwkeyR7dGhpcy5jcm9zc1N0YWNrSWRlbnRpZmllcltzdGFja05hbWVdfX1gO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBwcmVzc0JyYWNlcyA/IHRoaXMuaWRlbnRpZmllciA6IGBcXCR7JHt0aGlzLmlkZW50aWZpZXJ9fWA7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiByZWYoaWRlbnRpZmllcjogc3RyaW5nLCBzdGFjaz86IFRlcnJhZm9ybVN0YWNrKTogSVJlc29sdmFibGUge1xuICByZXR1cm4gbmV3IFJlZmVyZW5jZShpZGVudGlmaWVyLCBzdGFjayk7XG59XG5cbi8qKlxuICogbWFya3MgdGhlIGFyZ3VtZW50IGFzIGJlaW5nIHVzZWQgaW4gYSB0ZXJyYWZvcm0gZXhwcmVzc2lvblxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2lkZVRmRXhwcmVzc2lvbihhcmc6IGFueSkge1xuICByZXR1cm4gYXJnO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuY2xhc3MgUHJvcGVydHlBY2Nlc3MgZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRhcmdldDogRXhwcmVzc2lvbixcbiAgICBwcml2YXRlIGFyZ3M6IEV4cHJlc3Npb25bXSxcbiAgKSB7XG4gICAgc3VwZXIoeyB0YXJnZXQsIGFyZ3MgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1cHByZXNzQnJhY2VzID0gY29udGV4dC5zdXBwcmVzc0JyYWNlcztcbiAgICBjb250ZXh0LnN1cHByZXNzQnJhY2VzID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRBcmdzID0gdGhpcy5hcmdzXG4gICAgICAubWFwKChhcmcpID0+IHtcbiAgICAgICAgaWYgKGFyZyA9PT0gYCpgKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWypdXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIGFyZyk7XG4gICAgICAgIGNvbnN0IGlzUGxhaW5TdHJpbmcgPVxuICAgICAgICAgIHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgJiYgVEVSUkFGT1JNX0lERU5USUZJRVJfUkVHRVgudGVzdChhcmcpO1xuICAgICAgICBjb25zdCBpc1BsYWluTnVtYmVyID1cbiAgICAgICAgICB0eXBlb2YgYXJnID09PSBcIm51bWJlclwiICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoYXJnKTtcblxuICAgICAgICBpZiAoaXNQbGFpblN0cmluZyB8fCBpc1BsYWluTnVtYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHthcmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgWyR7YX1dYDtcbiAgICAgIH0pIC8vIHByb3BlcnR5IGFjY2Vzc1xuICAgICAgLmpvaW4oXCJcIik7XG5cbiAgICBjb25zdCB0YXJnZXRFeHByID1cbiAgICAgIENvbnN0cnVjdC5pc0NvbnN0cnVjdCh0aGlzLnRhcmdldCkgJiYgXCJmcW5cIiBpbiB0aGlzLnRhcmdldFxuICAgICAgICA/IHRoaXMudGFyZ2V0LmZxblxuICAgICAgICA6IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLnRhcmdldCk7XG5cbiAgICBjb25zdCBleHByID0gYCR7dGFyZ2V0RXhwcn0ke3NlcmlhbGl6ZWRBcmdzfWA7XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyBleHByIDogYFxcJHske2V4cHJ9fWA7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUFjY2Vzcyh0YXJnZXQ6IEV4cHJlc3Npb24sIGFyZ3M6IEV4cHJlc3Npb25bXSkge1xuICByZXR1cm4gbmV3IFByb3BlcnR5QWNjZXNzKHRhcmdldCwgYXJncykgYXMgSVJlc29sdmFibGU7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5jbGFzcyBDb25kaXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmRpdGlvbjogRXhwcmVzc2lvbixcbiAgICBwcml2YXRlIHRydWVWYWx1ZTogRXhwcmVzc2lvbixcbiAgICBwcml2YXRlIGZhbHNlVmFsdWU6IEV4cHJlc3Npb24sXG4gICkge1xuICAgIHN1cGVyKHsgY29uZGl0aW9uLCB0cnVlVmFsdWUsIGZhbHNlVmFsdWUgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1cHByZXNzQnJhY2VzID0gY29udGV4dC5zdXBwcmVzc0JyYWNlcztcbiAgICBjb250ZXh0LnN1cHByZXNzQnJhY2VzID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCB0aGlzLmNvbmRpdGlvbik7XG4gICAgY29uc3QgdHJ1ZVZhbHVlID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHRoaXMudHJ1ZVZhbHVlKTtcbiAgICBjb25zdCBmYWxzZVZhbHVlID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHRoaXMuZmFsc2VWYWx1ZSk7XG5cbiAgICBjb25zdCBleHByID0gYCR7Y29uZGl0aW9ufSA/ICR7dHJ1ZVZhbHVlfSA6ICR7ZmFsc2VWYWx1ZX1gO1xuXG4gICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzID8gZXhwciA6IGBcXCR7JHtleHByfX1gO1xuICB9XG59XG5cbi8qKlxuICogY3JlYXRlcyBhbiBleHByZXNzaW9uIGxpa2UgYHRydWUgPyAxIDogMGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsKFxuICBjb25kaXRpb246IEV4cHJlc3Npb24sXG4gIHRydWVWYWx1ZTogRXhwcmVzc2lvbixcbiAgZmFsc2VWYWx1ZTogRXhwcmVzc2lvbixcbikge1xuICByZXR1cm4gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbihjb25kaXRpb24sIHRydWVWYWx1ZSwgZmFsc2VWYWx1ZSk7XG59XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2V4cHJlc3Npb25zL29wZXJhdG9yc1xuZXhwb3J0IHR5cGUgT3BlcmF0b3IgPVxuICB8IFwiIVwiXG4gIHwgXCItXCJcbiAgfCBcIipcIlxuICB8IFwiL1wiXG4gIHwgXCIlXCJcbiAgfCBcIitcIlxuICB8IFwiPlwiXG4gIHwgXCI+PVwiXG4gIHwgXCI8XCJcbiAgfCBcIjw9XCJcbiAgfCBcIj09XCJcbiAgfCBcIiE9XCJcbiAgfCBcIiYmXCJcbiAgfCBcInx8XCI7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgT3BlcmF0b3IgRXhwcmVzc2lvbnNcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0b3JFeHByZXNzaW9uIGV4dGVuZHMgVEZFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvcGVyYXRvcjogT3BlcmF0b3IsXG4gICAgcHJpdmF0ZSBsZWZ0OiBFeHByZXNzaW9uLFxuICAgIHByaXZhdGUgcmlnaHQ/OiBFeHByZXNzaW9uLCAvLyBvcHRpb25hbCBmb3IgISBhbmQgLSBvcGVyYXRvclxuICApIHtcbiAgICBzdXBlcih7IG9wZXJhdG9yLCBsZWZ0VmFsdWU6IGxlZnQsIHJpZ2h0VmFsdWU6IHJpZ2h0IH0pO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG5cbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHRoaXMubGVmdCk7XG4gICAgY29uc3QgcmlnaHQgPVxuICAgICAgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHRoaXMucmlnaHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgbGV0IGV4cHIgPSBcIlwiO1xuICAgIHN3aXRjaCAodGhpcy5vcGVyYXRvcikge1xuICAgICAgY2FzZSBcIiFcIjoge1xuICAgICAgICBleHByID0gYCEke2xlZnR9YDsgLy8gbm8gYnJhY2VzIG5lZWRlZCBhcyAhIGhhcyBoaWdoZXN0IHByZWNlZGVuY2VcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiLVwiOiB7XG4gICAgICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gc3VidHJhY3Rpb25cbiAgICAgICAgICBleHByID0gYCgke2xlZnR9IC0gJHtyaWdodH0pYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBuZWdhdGlvblxuICAgICAgICAgIGV4cHIgPSBgLSR7bGVmdH1gOyAvLyBubyBicmFjZXMgbmVlZGVkIGFzIC0gaGFzIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBleHByID0gYCgke2xlZnR9ICR7dGhpcy5vcGVyYXRvcn0gJHtyaWdodH0pYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyBleHByIDogYFxcJHske2V4cHJ9fWA7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmNsYXNzIEZ1bmN0aW9uQ2FsbCBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgYXJnczogRXhwcmVzc2lvbltdLFxuICApIHtcbiAgICBzdXBlcih7IG5hbWUsIGFyZ3MgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIC8vIFJlY29yZGluZyBoZXJlLCBhdCByZXNvbHZlIHRpbWUsIGlzIGRlbGliZXJhdGU6IGEgYEZuLiooKWAvXG4gICAgLy8gYFRlcnJhZm9ybVByb3ZpZGVyRnVuY3Rpb24uaW52b2tlKClgIGNhbGwgb25seSBwcm9kdWNlcyBhIHRva2VuOiB0aGlzXG4gICAgLy8gaXMgdGhlIHBvaW50IHdoZXJlIHRoYXQgdG9rZW4gYWN0dWFsbHkgbGFuZHMgaW4gYSByZW5kZXJlZCBzdGFjaywgc29cbiAgICAvLyB1c2FnZSBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBTVEFDSyB3aG9zZSBzeW50aGVzaXMgaXMgZG9pbmcgdGhlXG4gICAgLy8gcmVuZGVyaW5nIC0gc2VlIGBUZXJyYWZvcm1TdGFjay5fdXNlZEZ1bmN0aW9uc2AgZm9yIHdoeSB1c2FnZSBpc1xuICAgIC8vIHN0YWNrLW93bmVkIHJhdGhlciB0aGFuIEFwcC1vd25lZC5cbiAgICAvL1xuICAgIC8vIGBjb250ZXh0LnNjb3BlYCBJUyB0aGUgcmVzb2x2aW5nIFRlcnJhZm9ybVN0YWNrIGZvciBldmVyeVxuICAgIC8vIHN5bnRoLWRyaXZlbiByZXNvbHZlIChBcHAuc3ludGgsIFRlc3Rpbmcuc3ludGgvc3ludGhIY2wsXG4gICAgLy8gU3RhY2tTeW50aGVzaXplci5zeW50aGVzaXplIGFsbCByZXNvbHZlIGVsZW1lbnRzIHdpdGggdGhlaXIgb3duaW5nXG4gICAgLy8gc3RhY2sgYXMgc2NvcGUpLCBzbyBgVGVycmFmb3JtU3RhY2suaXNTdGFja2AgaXMgY2hlY2tlZCBmaXJzdCBhcyB0aGVcbiAgICAvLyBjb21tb24gY2FzZS4gYFRlcnJhZm9ybVN0YWNrLm9mKClgIGlzIGEgZmFsbGJhY2sgZm9yIGEgc2NvcGUgdGhhdCBpc1xuICAgIC8vIHNvbWUgb3RoZXIgY29uc3RydWN0IHdpdGhpbiBhIHN0YWNrLiBJZiBuZWl0aGVyIGZpbmRzIGEgc3RhY2sgKGFcbiAgICAvLyB1c2VyLWRyaXZlbiBgVG9rZW5zLnJlc29sdmUoKWAgY2FsbCBhZ2FpbnN0IGEgYmFyZSBzY29wZSB3aXRoIG5vXG4gICAgLy8gc3RhY2sgaW4gaXRzIGFuY2VzdHJ5KSwgdGhlcmUgaXMgbm93aGVyZSB0byByZWNvcmQgaW50byAtIGFuZCBub3RoaW5nXG4gICAgLy8gd291bGQgZXZlciByZWFkIGl0IGJhY2sgdG8gdmFsaWRhdGUgYW55d2F5IC0gc28gcmVjb3JkaW5nIGlzIHF1aWV0bHlcbiAgICAvLyBza2lwcGVkIHJhdGhlciB0aGFuIHRocm93aW5nLlxuICAgIGxldCBzdGFjazogVGVycmFmb3JtU3RhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFRlcnJhZm9ybVN0YWNrLmlzU3RhY2soY29udGV4dC5zY29wZSkpIHtcbiAgICAgIHN0YWNrID0gY29udGV4dC5zY29wZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhY2sgPSBUZXJyYWZvcm1TdGFjay5vZihjb250ZXh0LnNjb3BlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzdGFjayA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIGlmICh0aGlzLm5hbWUuc3RhcnRzV2l0aChcInByb3ZpZGVyOjpcIikpIHtcbiAgICAgICAgc3RhY2suX3JlY29yZFByb3ZpZGVyRnVuY3Rpb25Vc2FnZSh0aGlzLm5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhY2suX3JlY29yZEZ1bmN0aW9uVXNhZ2UodGhpcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29uc3Qgb3JpZ2luYWxJZ25vcmVFc2NhcGVzID0gY29udGV4dC5pZ25vcmVFc2NhcGVzO1xuICAgIGNvbnN0IG9yaWdpbmFsV2FybkVzY2FwZXMgPSBjb250ZXh0Lndhcm5Fc2NhcGVzO1xuXG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG4gICAgY29udGV4dC5pZ25vcmVFc2NhcGVzID0gdHJ1ZTtcbiAgICBjb250ZXh0Lndhcm5Fc2NhcGVzID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRBcmdzID0gdGhpcy5hcmdzXG4gICAgICAubWFwKChhcmcpID0+IHRoaXMucmVzb2x2ZUFyZyhjb250ZXh0LCBhcmcpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IGV4cHIgPSBgJHt0aGlzLm5hbWV9KCR7c2VyaWFsaXplZEFyZ3N9KWA7XG5cbiAgICBjb250ZXh0Lmlnbm9yZUVzY2FwZXMgPSBvcmlnaW5hbElnbm9yZUVzY2FwZXM7XG4gICAgY29udGV4dC53YXJuRXNjYXBlcyA9IG9yaWdpbmFsV2FybkVzY2FwZXM7XG5cbiAgICByZXR1cm4gc3VwcHJlc3NCcmFjZXMgPyBleHByIDogYFxcJHske2V4cHJ9fWA7XG4gIH1cbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gY2FsbChuYW1lOiBzdHJpbmcsIGFyZ3M6IEV4cHJlc3Npb25bXSkge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uQ2FsbChuYW1lLCBhcmdzKSBhcyBJUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGNvbnN0IEZPUl9FWFBSRVNTSU9OX0tFWSA9IHJlZihcImtleVwiKTtcbmV4cG9ydCBjb25zdCBGT1JfRVhQUkVTU0lPTl9WQUxVRSA9IHJlZihcInZhbFwiKTtcblxuLyoqXG4gKiBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9leHByZXNzaW9ucy9mb3JcbiAqL1xuY2xhc3MgRm9yRXhwcmVzc2lvbiBleHRlbmRzIFRGRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5wdXQ6IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSB2YWx1ZUV4cHJlc3Npb246IEV4cHJlc3Npb24sXG4gICAgcHJpdmF0ZSBrZXlFeHByZXNzaW9uPzogRXhwcmVzc2lvbixcbiAgKSB7XG4gICAgc3VwZXIoeyBpbnB1dCwgdmFsdWVFeHByZXNzaW9uLCBrZXlFeHByZXNzaW9uIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdXBwcmVzc0JyYWNlcyA9IGNvbnRleHQuc3VwcHJlc3NCcmFjZXM7XG4gICAgY29udGV4dC5zdXBwcmVzc0JyYWNlcyA9IHRydWU7XG4gICAgY29udGV4dC5pdGVyYXRvckNvbnRleHQgPSBcIkZPUl9FWFBSRVNTSU9OXCI7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIEZPUl9FWFBSRVNTSU9OX0tFWSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlc29sdmVBcmcoY29udGV4dCwgRk9SX0VYUFJFU1NJT05fVkFMVUUpO1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIHRoaXMuaW5wdXQpO1xuICAgIGNvbnN0IHZhbHVlRXhwciA9IHRoaXMucmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQsIHRoaXMudmFsdWVFeHByZXNzaW9uKTtcblxuICAgIGxldCBleHByOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMua2V5RXhwcmVzc2lvbikge1xuICAgICAgY29uc3Qga2V5RXhwciA9IHRoaXMucmVzb2x2ZUV4cHJlc3Npb25QYXJ0KGNvbnRleHQsIHRoaXMua2V5RXhwcmVzc2lvbik7XG5cbiAgICAgIGV4cHIgPSBgeyBmb3IgJHtrZXl9LCAke3ZhbHVlfSBpbiAke2lucHV0fTogJHtrZXlFeHByfSA9PiAke3ZhbHVlRXhwcn0gfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cHIgPSBgWyBmb3IgJHtrZXl9LCAke3ZhbHVlfSBpbiAke2lucHV0fTogJHt2YWx1ZUV4cHJ9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cHByZXNzQnJhY2VzID8gZXhwciA6IGBcXCR7JHtleHByfX1gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZvciBleHByZXNzaW9uLCB1c2VkIGZvciBhZHZhbmNlZCBpbnRlcm5hbCB1c2UgY2FzZXMgKGUuZy4gaW4gdGhlIEBjZGt0bi9hd3MtYWRhcHRlcilcbiAqIEl0IGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUgdG8gdXNlIHRoaXMgdmlhIEpTSUkgaW4gb3RoZXIgbGFuZ3VhZ2VzLiBVc3VhbGx5IHlvdSBtaWdodCB3YW50IHRvXG4gKiB1c2UgVGVycmFmb3JtSXRlcmF0b3IgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IGZvciB0aGUgZXhwcmVzc2lvbiBlLmcuIGEgbGlzdCBvciBhbiBvYmplY3RcbiAqIEBwYXJhbSB2YWx1ZUV4cHJlc3Npb24gd2lsbCBleHByZXNzIHRoZSB2YWx1ZSBlLmcuIFsgZm9yIGkgaW4gJmx0O2lucHV0Jmd0OyA6ICZsdDt2YWx1ZUV4cHJlc3Npb24mZ3Q7IF1cbiAqIEBwYXJhbSBrZXlFeHByZXNzaW9uIGlmIHNldCB3aWxsIHJldHVybiBhbiBvYmplY3QgZS5nLiB7IGZvciBrLHYgaW4gJmx0O2lucHV0Jmd0OyA6ICZsdDtrZXlFeHByZXNzaW9uJmd0OyA9PiAmbHQ7dmFsdWVFeHByZXNzaW9uJmd0O31cbiAqIEByZXR1cm5zIGEgZm9yIGV4cHJlc3Npb25cbiAqXG4gKiBUaGUgdmFyaWFibGVzIGZvciBrZXkgKGZvciBtYXBzKSAvIGluZGV4IChmb3IgbGlzdHMpIGFuZCB2YWx1ZSB0aGF0IGFyZSB2YWxpZCBpbiB0aGUga2V5LSBhbmQgdmFsdWVFeHByZXNzaW9uXG4gKiBjYW4gYmUgcmVmZXJlbmNlZCBieSB1c2luZyB0aGVzZSBjb25zdGFudHM6IEZPUl9FWFBSRVNTSU9OX0tFWSBhbmQgRk9SX0VYUFJFU1NJT05fVkFMVUUuXG4gKlxuICogQ3VycmVudGx5IG5lc3RpbmcgZm9yIGV4cHJlc3Npb25zIGlzIG5vdCBzdXBwb3J0ZWQgZHVlIHRvIHRoaXMgc2ltcGxpZmljYXRpb24uXG4gKlxuICogQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgZmlsdGVyaW5nIGVsZW1lbnRzIChpZiBjbGF1c2UpIG9yIGdyb3VwaW5nIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckV4cHJlc3Npb24oXG4gIGlucHV0OiBFeHByZXNzaW9uLFxuICB2YWx1ZUV4cHJlc3Npb246IEV4cHJlc3Npb24sXG4gIGtleUV4cHJlc3Npb24/OiBFeHByZXNzaW9uLFxuKSB7XG4gIHJldHVybiBuZXcgRm9yRXhwcmVzc2lvbihcbiAgICBpbnB1dCxcbiAgICB2YWx1ZUV4cHJlc3Npb24sXG4gICAga2V5RXhwcmVzc2lvbixcbiAgKSBhcyBJUmVzb2x2YWJsZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmNsYXNzIERlcGVuZGFibGUgZXh0ZW5kcyBURkV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlcGVuZGFibGU6IElUZXJyYWZvcm1EZXBlbmRhYmxlKSB7XG4gICAgc3VwZXIoZGVwZW5kYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnRleHQuc3VwcHJlc3NCcmFjZXMgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kYWJsZS5mcW47XG4gIH1cbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kYWJsZShkZXBlbmRhYmxlOiBJVGVycmFmb3JtRGVwZW5kYWJsZSk6IHN0cmluZyB7XG4gIHJldHVybiBUb2tlbi5hc1N0cmluZyhuZXcgRGVwZW5kYWJsZShkZXBlbmRhYmxlKSk7XG59XG5cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb24gPVxuICB8IFJlZmVyZW5jZVxuICB8IEZ1bmN0aW9uQ2FsbFxuICB8IFByb3BlcnR5QWNjZXNzXG4gIHwgQ29uZGl0aW9uYWxFeHByZXNzaW9uXG4gIHwgT3BlcmF0b3JFeHByZXNzaW9uXG4gIHwgRGVwZW5kYWJsZVxuICB8IEZvckV4cHJlc3Npb25cbiAgfCBzdHJpbmdcbiAgfCBzdHJpbmdbXVxuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBJUmVzb2x2YWJsZVxuICB8IHsgW2tleTogc3RyaW5nXTogYW55IH1cbiAgfCBudWxsXG4gIHwgYW55IC8vIHVsdGltYXRlbHkgYW55IHZhbGlkIFRlcnJhZm9ybSB0eXBlIGNhbiBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb25cbiAgfCBhbnlbXTtcbiJdfQ==
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZFeHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RmRXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0UkEsOEJBRUM7QUEyREQsa0JBRUM7QUFNRCxnREFFQztBQXNERCx3Q0FFQztBQStCRCxrQ0FNQztBQThJRCxvQkFFQztBQXdERCxzQ0FVQztBQXFCRCxnQ0FFQztBQXRxQkQsMERBQXVEO0FBQ3ZELDBDQUFxRDtBQUNyRCwrQkFBNEI7QUFDNUIsdURBQW1EO0FBRW5ELDJDQUF1QztBQUN2QywrREFHaUM7QUFFakMsTUFBTSwwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQztBQUU5RDs7R0FFRztBQUNILE1BQU0sWUFBYSxTQUFRLHFCQUFTO0lBQ3hCLHFCQUFxQixDQUFDLE9BQXdCLEVBQUUsR0FBUTtRQUNoRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksb0JBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxtRUFBbUU7WUFDbkUsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUsb0VBQW9FO1lBQ3BFLHVFQUF1RTtZQUN2RSw2REFBNkQ7WUFDN0QsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSxvRUFBb0U7WUFDcEUsbUVBQW1FO1lBQ25FLHNFQUFzRTtZQUN0RSxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0Qsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSxpRUFBaUU7WUFDakUsc0VBQXNFO1lBQ3RFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUseURBQXlEO1lBQ3pELHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUsc0VBQXNFO1lBQ3RFLGtFQUFrRTtZQUNsRSxxRUFBcUU7WUFDckUsOERBQThEO1lBQzlELGlFQUFpRTtZQUNqRSxxRUFBcUU7WUFDckUsd0RBQXdEO1lBQ3hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLElBQUksV0FBVztxQkFDbkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztxQkFDaEMsR0FBRyxDQUNGLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDTixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FDM0Y7cUJBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbkIsQ0FBQztZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksV0FBVztpQkFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUQseUVBQXlFO1lBQ3pFLG1FQUFtRTtZQUNuRSxxRUFBcUU7WUFDckUsK0RBQStEO1lBQy9ELG1FQUFtRTtZQUNuRSx5RUFBeUU7WUFDekUscUVBQXFFO1lBQ3JFLHVFQUF1RTtZQUN2RSxhQUFhO1lBQ2IsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2lCQUN4QixNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO2lCQUN4RCxHQUFHLENBQ0YsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUNuRjtpQkFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQixDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHlFQUF5RTtRQUN6RSw4REFBOEQ7UUFDOUQsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVTLFVBQVUsQ0FBQyxPQUF3QixFQUFFLEdBQVE7UUFDckQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2pELDBHQUEwRztZQUMxRyx5R0FBeUc7WUFDekcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsb0VBQW9FO0lBQ3BFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDbkUsZ0JBQWdCLENBQUMsT0FBd0IsRUFBRSxHQUFXO1FBQzVELE1BQU0sU0FBUyxHQUFHLG9CQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxPQUFPLElBQUEsbUNBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDbkQsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSx3QkFBd0I7SUFDaEIsZUFBZSxDQUFDLE9BQXdCLEVBQUUsR0FBVztRQUMzRCxNQUFNLFNBQVMsR0FBRyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUU1RSx3RUFBd0U7UUFDeEUsZ0VBQWdFO1FBQ2hFLElBQ0UsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMvQixTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzlCLGNBQWMsS0FBSyxDQUFDLEVBQ3BCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQixNQUFNLFVBQVUsR0FBRyxvQkFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxhQUFhLEdBQUcsb0JBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sV0FBVyxHQUFHLG9CQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVoRCxNQUFNLGNBQWMsR0FDbEIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBRS9ELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztnQkFFckIsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxTQUFTLEdBQUcsSUFBQSwyQ0FBdUIsRUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztnQkFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNyQyxDQUFDO2dCQUVELE1BQU0sVUFBVSxHQUNkLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLElBQUEsMkNBQXVCLEVBQUMsS0FBSyxDQUFDO29CQUNoQyxDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFFOUIsT0FBTyxHQUFHLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLFVBQVUsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDTyxZQUFZLENBQUMsR0FBVztRQUNoQyxPQUFPLEdBQUc7YUFDUCxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLGtCQUFrQjthQUN4QyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ2pELENBQUM7SUFFTyxhQUFhLENBQUMsR0FBVyxFQUFFLFdBQWdCO1FBQ2pELE1BQU0sU0FBUyxHQUFHLG9CQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRTVFLGlCQUFpQjtRQUNqQixJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLFdBQVcsS0FBSyxHQUFHO2dCQUN4QixXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDM0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQzVDLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsSUFDRSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDOUIsY0FBYyxLQUFLLENBQUMsRUFDcEIsQ0FBQztZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sVUFBVSxHQUFHLG9CQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLGFBQWEsR0FBRyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxXQUFXLEdBQUcsb0JBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRWhELE1BQU0sY0FBYyxHQUNsQixhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFFL0QsZ0dBQWdHO2dCQUNoRyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBRXJCLHlEQUF5RDtnQkFDekQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztnQkFFRCx1RUFBdUU7Z0JBQ3ZFLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JDLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQ2QsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7b0JBQzFCLENBQUMsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUU5QixPQUFPLEdBQUcsU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLFVBQVUsS0FBSyxHQUFHO1lBQ3ZCLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxVQUFVO1lBQ1osQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFNBQVUsU0FBUSxZQUFZO0lBQ0w7SUFBN0IsWUFBNkIsR0FBVztRQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEZ0IsUUFBRyxHQUFILEdBQUcsQ0FBUTtJQUV4QyxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEdBQVc7SUFDbkMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxTQUFVLFNBQVEsWUFBWTtJQVN4QjtJQUNBO0lBVFY7Ozs7O09BS0c7SUFDSyxvQkFBb0IsR0FBMkIsRUFBRSxDQUFDO0lBQzFELFlBQ1UsVUFBa0IsRUFDbEIsV0FBNEI7UUFFcEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBSFYsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7SUFHdEMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQywrRUFBK0U7UUFDL0UsTUFBTSxlQUFlLEdBQUcsZ0NBQWMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLHdCQUF3QjtZQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxlQUFlLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxHQUFHLEdBQUcsU0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FDakMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsZUFBZSxFQUNmLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7Z0JBRUYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUVELHVGQUF1RjtRQUN2RixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sY0FBYztnQkFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3BELENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixHQUFHLENBQUMsVUFBa0IsRUFBRSxLQUFzQjtJQUM1RCxPQUFPLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsR0FBUTtJQUN6QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sY0FBZSxTQUFRLFlBQVk7SUFFN0I7SUFDQTtJQUZWLFlBQ1UsTUFBa0IsRUFDbEIsSUFBa0I7UUFFMUIsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFjO0lBRzVCLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSTthQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNYLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4QyxNQUFNLGFBQWEsR0FDakIsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxNQUFNLGFBQWEsR0FDakIsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsYUFBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0RCxJQUFJLGFBQWEsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ25CLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO2FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVaLE1BQU0sVUFBVSxHQUNkLHNCQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRztZQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLE1BQU0sSUFBSSxHQUFHLEdBQUcsVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBRTlDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixjQUFjLENBQUMsTUFBa0IsRUFBRSxJQUFrQjtJQUNuRSxPQUFPLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQWdCLENBQUM7QUFDekQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxxQkFBc0IsU0FBUSxZQUFZO0lBRXBDO0lBQ0E7SUFDQTtJQUhWLFlBQ1UsU0FBcUIsRUFDckIsU0FBcUIsRUFDckIsVUFBc0I7UUFFOUIsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBSnBDLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBR2hDLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM5QyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RCxNQUFNLElBQUksR0FBRyxHQUFHLFNBQVMsTUFBTSxTQUFTLE1BQU0sVUFBVSxFQUFFLENBQUM7UUFFM0QsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsU0FBcUIsRUFDckIsU0FBcUIsRUFDckIsVUFBc0I7SUFFdEIsT0FBTyxJQUFJLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDckUsQ0FBQztBQW1CRDs7O0dBR0c7QUFDSCxNQUFhLGtCQUFtQixTQUFRLFlBQVk7SUFFeEM7SUFDQTtJQUNBO0lBSFYsWUFDVSxRQUFrQixFQUNsQixJQUFnQixFQUNoQixLQUFrQjtRQUUxQixLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUpoRCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsVUFBSyxHQUFMLEtBQUssQ0FBYTtJQUc1QixDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDOUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUNULElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUztZQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN0QyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDVCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztnQkFDbEUsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hCLGNBQWM7b0JBQ2QsSUFBSSxHQUFHLElBQUksSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDO2dCQUNoQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sV0FBVztvQkFDWCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLCtDQUErQztnQkFDcEUsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxHQUFHLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQTFDRCxnREEwQ0M7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFlBQWEsU0FBUSxZQUFZO0lBRTNCO0lBQ0E7SUFGVixZQUNVLElBQVksRUFDWixJQUFrQjtRQUUxQixLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUhkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFjO0lBRzVCLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBd0I7UUFDckMsOERBQThEO1FBQzlELHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUsZ0VBQWdFO1FBQ2hFLG1FQUFtRTtRQUNuRSxxQ0FBcUM7UUFDckMsRUFBRTtRQUNGLDREQUE0RDtRQUM1RCwyREFBMkQ7UUFDM0QscUVBQXFFO1FBQ3JFLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsbUVBQW1FO1FBQ25FLG1FQUFtRTtRQUNuRSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLGdDQUFnQztRQUNoQyxJQUFJLEtBQWlDLENBQUM7UUFDdEMsSUFBSSxnQ0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQztnQkFDSCxLQUFLLEdBQUcsZ0NBQWMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNwRCxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFFaEQsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDN0IsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFM0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQzthQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFZCxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksY0FBYyxHQUFHLENBQUM7UUFFL0MsT0FBTyxDQUFDLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQztRQUM5QyxPQUFPLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO1FBRTFDLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFnQixJQUFJLENBQUMsSUFBWSxFQUFFLElBQWtCO0lBQ25ELE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBZ0IsQ0FBQztBQUNyRCxDQUFDO0FBRVksUUFBQSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEMsUUFBQSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLGFBQWMsU0FBUSxZQUFZO0lBRTVCO0lBQ0E7SUFDQTtJQUhWLFlBQ1UsS0FBaUIsRUFDakIsZUFBMkIsRUFDM0IsYUFBMEI7UUFFbEMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBSnpDLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsb0JBQWUsR0FBZixlQUFlLENBQVk7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWE7SUFHcEMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsMEJBQWtCLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSw0QkFBb0IsQ0FBQyxDQUFDO1FBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1RSxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV4RSxJQUFJLEdBQUcsU0FBUyxHQUFHLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLE9BQU8sU0FBUyxJQUFJLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEdBQUcsU0FBUyxHQUFHLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSyxTQUFTLEdBQUcsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsS0FBaUIsRUFDakIsZUFBMkIsRUFDM0IsYUFBMEI7SUFFMUIsT0FBTyxJQUFJLGFBQWEsQ0FDdEIsS0FBSyxFQUNMLGVBQWUsRUFDZixhQUFhLENBQ0MsQ0FBQztBQUNuQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVcsU0FBUSxZQUFZO0lBQ2Y7SUFBcEIsWUFBb0IsVUFBZ0M7UUFDbEQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBREEsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7SUFFcEQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxPQUF3QjtRQUNyQyxPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQUNEOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQUMsVUFBZ0M7SUFDekQsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcIi4vdG9rZW5zL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IEludHJpbnNpYyB9IGZyb20gXCIuL3Rva2Vucy9wcml2YXRlL2ludHJpbnNpY1wiO1xuaW1wb3J0IHsgVG9rZW5pemF0aW9uLCBUb2tlbiB9IGZyb20gXCIuL3Rva2Vucy90b2tlblwiO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSBcIi4vYXBwXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCIuL3RlcnJhZm9ybS1zdGFja1wiO1xuaW1wb3J0IHsgSVRlcnJhZm9ybURlcGVuZGFibGUgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZGVwZW5kYWJsZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIHF1b3RlZFN0cmluZ0tleSxcbiAgcXVvdGVkU3RyaW5nS2V5RnJhZ21lbnQsXG59IGZyb20gXCIuL2hjbC9xdW90ZWQtc3RyaW5nLWtleVwiO1xuXG5jb25zdCBURVJSQUZPUk1fSURFTlRJRklFUl9SRUdFWCA9IC9eW19hLXpBLVpdW19hLXpBLVowLTldKiQvO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFRlcnJhZm9ybSBleHByZXNzaW9uIHRva2Vucywgd2l0aCBoZWxwZXJzIHRoYXQgcmVuZGVyIHJlc29sdmVkIGFyZ3VtZW50cyBhcyBUZXJyYWZvcm0gc3ludGF4LlxuICovXG5jbGFzcyBURkV4cHJlc3Npb24gZXh0ZW5kcyBJbnRyaW5zaWMgaW1wbGVtZW50cyBJUmVzb2x2YWJsZSB7XG4gIHByb3RlY3RlZCByZXNvbHZlRXhwcmVzc2lvblBhcnQoY29udGV4dDogSVJlc29sdmVDb250ZXh0LCBhcmc6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzb2x2ZWRBcmcgPSBjb250ZXh0LnJlc29sdmUoYXJnKTtcbiAgICBpZiAoVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShhcmcpKSB7XG4gICAgICAvLyBBIHJlc29sdmFibGUgYXJnIChlLmcuIGBjZGt0bi5Ub2tlbi5udWxsVmFsdWUoKWAsIGFuIElSZXNvbHZhYmxlXG4gICAgICAvLyB3cmFwcGluZyBgbnVsbGAgLSBzZWUgVG9rZW4ubnVsbFZhbHVlKCkvVG9rZW4uYXNBbnkoKSkgY2FuIGl0c2VsZlxuICAgICAgLy8gcmVzb2x2ZSB0byBgbnVsbGAvYHVuZGVmaW5lZGAuIENvbGxhcHNlIHRoYXQgdG8gdGhlIGxpdGVyYWwgXCJudWxsXCJcbiAgICAgIC8vIHN0cmluZyB0b28sIGZvciB0aGUgZXhhY3Qgc2FtZSByZWFzb24gYXMgdGhlIHBsYWluLW51bGwvdW5kZWZpbmVkXG4gICAgICAvLyBicmFuY2ggZnVydGhlciBkb3duOiBBcnJheS5wcm90b3R5cGUuam9pbigpICh1c2VkIGJ5IGNhbGxlcnMgbGlrZVxuICAgICAgLy8gRnVuY3Rpb25DYWxsLnJlc29sdmUoKSkgdHJlYXRzIGEgYG51bGxgL2B1bmRlZmluZWRgIGFycmF5IEVMRU1FTlQgYXNcbiAgICAgIC8vIGFuIGVtcHR5IHN0cmluZywgc2lsZW50bHkgZHJvcHBpbmcgdGhlIGFyZ3VtZW50IGluc3RlYWQgb2ZcbiAgICAgIC8vIHJlbmRlcmluZyB0aGUgVGVycmFmb3JtIGBudWxsYCBrZXl3b3JkLiBXaXRob3V0IHRoaXMsIG9ubHkgYVxuICAgICAgLy8gbGl0ZXJhbCBKUyBgbnVsbGAvYHVuZGVmaW5lZGAgYXJndW1lbnQgcmVuZGVyZWQgY29ycmVjdGx5IC0gYVxuICAgICAgLy8gcmVzb2x2YWJsZSB0b2tlbiB0aGF0IHJlc29sdmVzIHRvIGBudWxsYCAodGhlIG9ubHkgd2F5IHRvIHBhc3MgYW5cbiAgICAgIC8vIGV4cGxpY2l0IGBudWxsYCBpbiBhIGpzaWktdHlwZWQgZml4ZWQgcG9zaXRpb24sIHNpbmNlIGpzaWkgY2FuJ3RcbiAgICAgIC8vIGV4cHJlc3MgYSBsaXRlcmFsIGBudWxsYCBwYXJhbWV0ZXIgdHlwZSkgc2lsZW50bHkgdmFuaXNoZWQgaW5zdGVhZC5cbiAgICAgIGlmIChyZXNvbHZlZEFyZyA9PT0gbnVsbCB8fCByZXNvbHZlZEFyZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVzb2x2YWJsZSBjYW4gaXRzZWxmIHJlc29sdmUgdG8gYSBwbGFpbiAodW5lbmNvZGVkKSBhcnJheS9vYmplY3RcbiAgICAgIC8vIHJhdGhlciB0aGFuIGFuIGFscmVhZHktcmVuZGVyZWQgc3RyaW5nIC0gZS5nLiBhIG1hbnVhbGx5LWNvbnN0cnVjdGVkXG4gICAgICAvLyB3aG9sZS1jb2xsZWN0aW9uIHRva2VuIGxpa2UgYGNka3RuLlRva2VuLmFzQW55KFt0cnVlLCBmYWxzZV0pYFxuICAgICAgLy8gKGV4YWN0bHkgdGhlIHNoYXBlIGEganNpaS10eXBlZCBgQXJyYXk8Ym9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlPlxuICAgICAgLy8gfCBjZGt0bi5JUmVzb2x2YWJsZWAgcHJvdmlkZXItZnVuY3Rpb24gcGFyYW1ldGVyIG5vdyBhY2NlcHRzIC0gc2VlXG4gICAgICAvLyBwcm92aWRlci1mdW5jdGlvbi1tb2RlbC50cykuIEZvcm1hdCBpdCB0aGUgc2FtZSBicmFja2V0L2JyYWNlIHdheVxuICAgICAgLy8gdGhlIHBsYWluIGFycmF5L29iamVjdCBicmFuY2hlcyBiZWxvdyBkbywgcmVjdXJzaW5nIG9uXG4gICAgICAvLyBgcmVzb2x2ZWRBcmdgJ3Mgb3duIGVsZW1lbnRzIChOT1QgYGFyZ2AncyAtIGBhcmdgIGlzIHRoZSByZXNvbHZhYmxlXG4gICAgICAvLyB3cmFwcGVyIGl0c2VsZiwgbm90IGluZGV4YWJsZS9rZXlhYmxlKS4gV2l0aG91dCB0aGlzLCB0aGUgYXJyYXlcbiAgICAgIC8vIGJyYW5jaCBiZWxvdyBpcyB1bnJlYWNoYWJsZSBmb3IgYSByZXNvbHZhYmxlIGFyZyAodGhpcyBgaWZgIGFscmVhZHlcbiAgICAgIC8vIHJldHVybmVkKSwgc28gdGhlIHJhdyBhcnJheS9vYmplY3QgZmVsbCBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZVxuICAgICAgLy8gcGxhaW4gYHJldHVybiByZXNvbHZlZEFyZ2AgYXQgdGhlIGJvdHRvbSAtIHJlbHlpbmcgb24gdGhlIGNhbGxlcidzXG4gICAgICAvLyBgQXJyYXkucHJvdG90eXBlLmpvaW4oKWAgKEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKCkgZXQgYWwuKSB0b1xuICAgICAgLy8gc3RyaW5naWZ5IGl0LCB3aGljaCBkcm9wcyBhbiBhcnJheSdzIGJyYWNrZXRzL3NwYWNpbmcgKHJlbmRlcnNcbiAgICAgIC8vIGB0cnVlLGZhbHNlYCBpbnN0ZWFkIG9mIGBbdHJ1ZSwgZmFsc2VdYCkgYW5kLCBmb3IgYW4gb2JqZWN0LCB3b3VsZFxuICAgICAgLy8gcHJvZHVjZSB0aGUgdXNlbGVzcyBsaXRlcmFsIHN0cmluZyBgW29iamVjdCBPYmplY3RdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc29sdmVkQXJnKSkge1xuICAgICAgICByZXR1cm4gYFske3Jlc29sdmVkQXJnXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQXJnKGNvbnRleHQsIGl0ZW0pKVxuICAgICAgICAgIC5qb2luKFwiLCBcIil9XWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmVkQXJnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBgeyR7T2JqZWN0LmtleXMocmVzb2x2ZWRBcmcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChrZXkpID0+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;