@cdktn/hcl2cdk 0.23.0-pre.7 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/ambient.d.ts +0 -1
  2. package/build/__tests__/coerceType.test.js +165 -0
  3. package/build/__tests__/expressionToTs.test.js +693 -0
  4. package/build/__tests__/expressions.test.js +415 -0
  5. package/build/__tests__/findExpressionType.test.js +105 -0
  6. package/build/__tests__/functions.test.js +605 -0
  7. package/build/__tests__/generation.test.js +45 -0
  8. package/build/__tests__/jsii-rosetta-workarounds.test.js +86 -0
  9. package/build/__tests__/partialCode.test.js +390 -0
  10. package/build/__tests__/terraformSchema.test.js +105 -0
  11. package/build/__tests__/testHelpers.js +16 -0
  12. package/build/coerceType.js +240 -0
  13. package/build/dynamic-blocks.js +44 -0
  14. package/build/expressions.js +633 -0
  15. package/build/function-bindings/functions.generated.js +1142 -0
  16. package/build/function-bindings/functions.js +73 -0
  17. package/{lib → build}/generation.js +4 -4
  18. package/{lib → build}/index.d.ts +2 -2
  19. package/build/index.js +364 -0
  20. package/build/iteration.js +87 -0
  21. package/build/jsii-rosetta-workarounds.js +126 -0
  22. package/build/partialCode.js +116 -0
  23. package/build/provider.js +40 -0
  24. package/build/references.js +141 -0
  25. package/build/schema.js +81 -0
  26. package/build/telemetryAllowList.json +24 -0
  27. package/build/terraformSchema.js +136 -0
  28. package/build/types.js +3 -0
  29. package/build/utils.js +25 -0
  30. package/build/variables.js +172 -0
  31. package/package.json +13 -14
  32. package/tsconfig.json +4 -2
  33. package/lib/__tests__/coerceType.test.js +0 -165
  34. package/lib/__tests__/expressionToTs.test.js +0 -693
  35. package/lib/__tests__/expressions.test.js +0 -415
  36. package/lib/__tests__/findExpressionType.test.js +0 -105
  37. package/lib/__tests__/functions.test.js +0 -605
  38. package/lib/__tests__/generation.test.js +0 -45
  39. package/lib/__tests__/jsii-rosetta-workarounds.test.js +0 -86
  40. package/lib/__tests__/partialCode.test.js +0 -390
  41. package/lib/__tests__/terraformSchema.test.js +0 -105
  42. package/lib/__tests__/testHelpers.js +0 -16
  43. package/lib/coerceType.js +0 -240
  44. package/lib/dynamic-blocks.js +0 -44
  45. package/lib/expressions.js +0 -634
  46. package/lib/function-bindings/functions.generated.js +0 -1142
  47. package/lib/function-bindings/functions.js +0 -73
  48. package/lib/index.js +0 -364
  49. package/lib/iteration.js +0 -87
  50. package/lib/jsii-rosetta-workarounds.js +0 -126
  51. package/lib/partialCode.js +0 -116
  52. package/lib/provider.js +0 -40
  53. package/lib/references.js +0 -141
  54. package/lib/schema.js +0 -81
  55. package/lib/terraformSchema.js +0 -136
  56. package/lib/types.js +0 -3
  57. package/lib/utils.js +0 -25
  58. package/lib/variables.js +0 -172
  59. /package/{lib → build}/__tests__/coerceType.test.d.ts +0 -0
  60. /package/{lib → build}/__tests__/expressionToTs.test.d.ts +0 -0
  61. /package/{lib → build}/__tests__/expressions.test.d.ts +0 -0
  62. /package/{lib → build}/__tests__/findExpressionType.test.d.ts +0 -0
  63. /package/{lib → build}/__tests__/functions.test.d.ts +0 -0
  64. /package/{lib → build}/__tests__/generation.test.d.ts +0 -0
  65. /package/{lib → build}/__tests__/jsii-rosetta-workarounds.test.d.ts +0 -0
  66. /package/{lib → build}/__tests__/partialCode.test.d.ts +0 -0
  67. /package/{lib → build}/__tests__/terraformSchema.test.d.ts +0 -0
  68. /package/{lib → build}/__tests__/testHelpers.d.ts +0 -0
  69. /package/{lib → build}/coerceType.d.ts +0 -0
  70. /package/{lib → build}/dynamic-blocks.d.ts +0 -0
  71. /package/{lib → build}/expressions.d.ts +0 -0
  72. /package/{lib → build}/function-bindings/functions.d.ts +0 -0
  73. /package/{lib → build}/function-bindings/functions.generated.d.ts +0 -0
  74. /package/{lib → build}/generation.d.ts +0 -0
  75. /package/{lib → build}/iteration.d.ts +0 -0
  76. /package/{lib → build}/jsii-rosetta-workarounds.d.ts +0 -0
  77. /package/{lib → build}/partialCode.d.ts +0 -0
  78. /package/{lib → build}/provider.d.ts +0 -0
  79. /package/{lib → build}/references.d.ts +0 -0
  80. /package/{lib → build}/schema.d.ts +0 -0
  81. /package/{lib → build}/terraformSchema.d.ts +0 -0
  82. /package/{lib → build}/types.d.ts +0 -0
  83. /package/{lib → build}/utils.d.ts +0 -0
  84. /package/{lib → build}/variables.d.ts +0 -0
  85. /package/{lib → src}/telemetryAllowList.json +0 -0
@@ -1,605 +0,0 @@
1
- "use strict";
2
- /**
3
- * Copyright (c) HashiCorp, Inc.
4
- * SPDX-License-Identifier: MPL-2.0
5
- */
6
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- var desc = Object.getOwnPropertyDescriptor(m, k);
9
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
- desc = { enumerable: true, get: function() { return m[k]; } };
11
- }
12
- Object.defineProperty(o, k2, desc);
13
- }) : (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- o[k2] = m[k];
16
- }));
17
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
- Object.defineProperty(o, "default", { enumerable: true, value: v });
19
- }) : function(o, v) {
20
- o["default"] = v;
21
- });
22
- var __importStar = (this && this.__importStar) || function (mod) {
23
- if (mod && mod.__esModule) return mod;
24
- var result = {};
25
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
- __setModuleDefault(result, mod);
27
- return result;
28
- };
29
- Object.defineProperty(exports, "__esModule", { value: true });
30
- const t = __importStar(require("@babel/types"));
31
- const coerceType_1 = require("../coerceType");
32
- const functions_1 = require("../function-bindings/functions");
33
- const testHelpers_1 = require("./testHelpers");
34
- const scope = {
35
- providerSchema: {},
36
- providerGenerator: {},
37
- constructs: new Set(),
38
- variables: {},
39
- hasTokenBasedTypeCoercion: false,
40
- nodeIds: [],
41
- importables: [],
42
- topLevelConfig: {},
43
- };
44
- // '${replace(module.foo.output, "-", var.bar)}'
45
- // from https://github.com/hashicorp/terraform-cdk/pull/2729
46
- const dummy2 = {
47
- children: [
48
- {
49
- children: [
50
- {
51
- children: [],
52
- meta: {
53
- traversal: [
54
- {
55
- range: {
56
- End: {
57
- Byte: 16,
58
- Column: 16,
59
- Line: 0,
60
- },
61
- Filename: "",
62
- Start: {
63
- Byte: 10,
64
- Column: 10,
65
- Line: 0,
66
- },
67
- },
68
- segment: "module",
69
- },
70
- {
71
- range: {
72
- End: {
73
- Byte: 20,
74
- Column: 20,
75
- Line: 0,
76
- },
77
- Filename: "",
78
- Start: {
79
- Byte: 16,
80
- Column: 16,
81
- Line: 0,
82
- },
83
- },
84
- segment: "foo",
85
- },
86
- {
87
- range: {
88
- End: {
89
- Byte: 27,
90
- Column: 27,
91
- Line: 0,
92
- },
93
- Filename: "",
94
- Start: {
95
- Byte: 20,
96
- Column: 20,
97
- Line: 0,
98
- },
99
- },
100
- segment: "output",
101
- },
102
- ],
103
- },
104
- range: {
105
- end: {
106
- byte: 27,
107
- column: 27,
108
- line: 0,
109
- },
110
- start: {
111
- byte: 10,
112
- column: 10,
113
- line: 0,
114
- },
115
- },
116
- type: "ScopeTraversal",
117
- },
118
- {
119
- children: [
120
- {
121
- children: [],
122
- meta: {
123
- type: "string",
124
- value: "-",
125
- },
126
- range: {
127
- end: {
128
- byte: 31,
129
- column: 31,
130
- line: 0,
131
- },
132
- start: {
133
- byte: 30,
134
- column: 30,
135
- line: 0,
136
- },
137
- },
138
- type: "LiteralValue",
139
- },
140
- ],
141
- range: {
142
- end: {
143
- byte: 31,
144
- column: 31,
145
- line: 0,
146
- },
147
- start: {
148
- byte: 30,
149
- column: 30,
150
- line: 0,
151
- },
152
- },
153
- type: "Template",
154
- },
155
- {
156
- children: [],
157
- meta: {
158
- traversal: [
159
- {
160
- range: {
161
- End: {
162
- Byte: 37,
163
- Column: 37,
164
- Line: 0,
165
- },
166
- Filename: "",
167
- Start: {
168
- Byte: 34,
169
- Column: 34,
170
- Line: 0,
171
- },
172
- },
173
- segment: "var",
174
- },
175
- {
176
- range: {
177
- End: {
178
- Byte: 41,
179
- Column: 41,
180
- Line: 0,
181
- },
182
- Filename: "",
183
- Start: {
184
- Byte: 37,
185
- Column: 37,
186
- Line: 0,
187
- },
188
- },
189
- segment: "bar",
190
- },
191
- ],
192
- },
193
- range: {
194
- end: {
195
- byte: 41,
196
- column: 41,
197
- line: 0,
198
- },
199
- start: {
200
- byte: 34,
201
- column: 34,
202
- line: 0,
203
- },
204
- },
205
- type: "ScopeTraversal",
206
- },
207
- ],
208
- meta: {
209
- closeParenRange: {
210
- end: {
211
- byte: 42,
212
- column: 42,
213
- line: 0,
214
- },
215
- start: {
216
- byte: 41,
217
- column: 41,
218
- line: 0,
219
- },
220
- },
221
- expandedFinalArgument: false,
222
- name: "replace",
223
- nameRange: {
224
- end: {
225
- byte: 9,
226
- column: 9,
227
- line: 0,
228
- },
229
- start: {
230
- byte: 2,
231
- column: 2,
232
- line: 0,
233
- },
234
- },
235
- openParenRange: {
236
- end: {
237
- byte: 10,
238
- column: 10,
239
- line: 0,
240
- },
241
- start: {
242
- byte: 9,
243
- column: 9,
244
- line: 0,
245
- },
246
- },
247
- },
248
- range: {
249
- end: {
250
- byte: 10,
251
- column: 10,
252
- line: 0,
253
- },
254
- start: {
255
- byte: 2,
256
- column: 2,
257
- line: 0,
258
- },
259
- },
260
- type: "function",
261
- },
262
- ],
263
- range: {
264
- end: {
265
- byte: 43,
266
- column: 43,
267
- line: 0,
268
- },
269
- start: {
270
- byte: 0,
271
- column: 0,
272
- line: 0,
273
- },
274
- },
275
- type: "TemplateWrap",
276
- };
277
- describe("bindings for Terraform functions", () => {
278
- it("should convert Terraform AST into TS AST", () => {
279
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, dummy2, "dynamic"))).toMatchInlineSnapshot(`"Fn.replace(TodoReference-module-foo-output, "-", TodoReference-var-bar)"`);
280
- });
281
- it("should convert Terraform AST into TS AST for overriden function name", () => {
282
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
283
- type: "function",
284
- meta: {
285
- name: "length",
286
- },
287
- children: [
288
- {
289
- type: "ScopeTraversal",
290
- meta: {
291
- traversal: [
292
- {
293
- segment: "var",
294
- },
295
- {
296
- segment: "list",
297
- },
298
- ],
299
- },
300
- children: [],
301
- },
302
- ],
303
- }, "number"))).toMatchInlineSnapshot(`"Fn.lengthOf(TodoReference-var-list)"`);
304
- });
305
- it("should convert Terraform AST into TS AST for overriden function with variadic args for optional params", () => {
306
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
307
- type: "function",
308
- meta: {
309
- name: "bcrypt",
310
- },
311
- children: [
312
- {
313
- type: "ScopeTraversal",
314
- meta: {
315
- traversal: [
316
- {
317
- segment: "var",
318
- },
319
- {
320
- segment: "str",
321
- },
322
- ],
323
- },
324
- children: [],
325
- },
326
- {
327
- type: "ScopeTraversal",
328
- meta: {
329
- traversal: [
330
- {
331
- segment: "var",
332
- },
333
- {
334
- segment: "cost",
335
- },
336
- ],
337
- },
338
- children: [],
339
- },
340
- ],
341
- }, "string"))).toMatchInlineSnapshot(`"Fn.bcrypt(TodoReference-var-str, TodoReference-var-cost)"`);
342
- });
343
- it("should convert Terraform AST into TS AST for overriden function with variadic args for optional params that are not passed", () => {
344
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
345
- type: "function",
346
- meta: {
347
- name: "bcrypt",
348
- },
349
- children: [
350
- {
351
- type: "ScopeTraversal",
352
- meta: {
353
- traversal: [
354
- {
355
- segment: "var",
356
- },
357
- {
358
- segment: "str",
359
- },
360
- ],
361
- },
362
- children: [],
363
- },
364
- ],
365
- }, "string"))).toMatchInlineSnapshot(`"Fn.bcrypt(TodoReference-var-str)"`);
366
- });
367
- it("should convert Terraform AST into TS AST for function with variadic param", () => {
368
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
369
- type: "function",
370
- meta: {
371
- name: "try",
372
- },
373
- children: [
374
- {
375
- type: "ScopeTraversal",
376
- meta: {
377
- traversal: [
378
- {
379
- segment: "var",
380
- },
381
- {
382
- segment: "strA",
383
- },
384
- ],
385
- },
386
- children: [],
387
- },
388
- {
389
- type: "ScopeTraversal",
390
- meta: {
391
- traversal: [
392
- {
393
- segment: "var",
394
- },
395
- {
396
- segment: "strB",
397
- },
398
- ],
399
- },
400
- children: [],
401
- },
402
- ],
403
- }, "dynamic"))).toMatchInlineSnapshot(`"Fn.try([TodoReference-var-strA, TodoReference-var-strB])"`);
404
- });
405
- it("should convert Terraform AST into TS AST for join function with single list param", () => {
406
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
407
- type: "function",
408
- meta: {
409
- name: "join",
410
- },
411
- children: [
412
- {
413
- type: "ScopeTraversal",
414
- meta: {
415
- traversal: [
416
- {
417
- segment: "var",
418
- },
419
- {
420
- segment: "str",
421
- },
422
- ],
423
- },
424
- children: [],
425
- },
426
- {
427
- type: "ScopeTraversal",
428
- meta: {
429
- traversal: [
430
- {
431
- segment: "var",
432
- },
433
- {
434
- segment: "list",
435
- },
436
- ],
437
- },
438
- children: [],
439
- },
440
- ],
441
- }, "string"))).toMatchInlineSnapshot(`"Fn.join(TodoReference-var-str, TodoReference-var-list)"`);
442
- });
443
- it("should convert Terraform AST into TS AST for join function with multiple list params", () => {
444
- expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
445
- type: "function",
446
- meta: {
447
- name: "join",
448
- },
449
- children: [
450
- {
451
- type: "ScopeTraversal",
452
- meta: {
453
- traversal: [
454
- {
455
- segment: "var",
456
- },
457
- {
458
- segment: "str",
459
- },
460
- ],
461
- },
462
- children: [],
463
- },
464
- {
465
- type: "ScopeTraversal",
466
- meta: {
467
- traversal: [
468
- {
469
- segment: "var",
470
- },
471
- {
472
- segment: "listA",
473
- },
474
- ],
475
- },
476
- children: [],
477
- },
478
- {
479
- type: "ScopeTraversal",
480
- meta: {
481
- traversal: [
482
- {
483
- segment: "var",
484
- },
485
- {
486
- segment: "listB",
487
- },
488
- ],
489
- },
490
- children: [],
491
- },
492
- ],
493
- }, "string"))).toMatchInlineSnapshot(`"Fn.join(TodoReference-var-str, Token.asList(Fn.concat([TodoReference-var-listA, TodoReference-var-listB])))"`);
494
- });
495
- it("should throw if not enough parameters were passed", () => {
496
- expect(() => (0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
497
- type: "function",
498
- meta: {
499
- name: "bcrypt",
500
- },
501
- children: [],
502
- }, "string"))).toThrowErrorMatchingInlineSnapshot(`"Terraform function call to "bcrypt" is not valid! Parameter at index 0 of type string is not optional but received no value. The following parameters were passed: []"`);
503
- });
504
- // TODO: tests for type coercion
505
- });
506
- function terraformThingToTs(scope, tfAst, targetType) {
507
- switch (tfAst.type) {
508
- case "function": {
509
- return terraformFunctionCallToTs(scope, tfAst, targetType);
510
- }
511
- case "TemplateWrap": {
512
- // If there's just one child, we can skip them
513
- if (tfAst.children.length === 1) {
514
- return terraformThingToTs(scope, tfAst.children[0], targetType);
515
- }
516
- throw new Error("TemplateWrap with not exactly one child is not supported yet: " +
517
- tfAst.children);
518
- }
519
- case "ScopeTraversal": {
520
- return terraformScopeTraversalToTs(tfAst, targetType);
521
- }
522
- case "Template": {
523
- return terraformTemplateToTs(scope, tfAst, targetType);
524
- }
525
- case "LiteralValue": {
526
- return terraformLiteralValueToTs(tfAst, targetType);
527
- }
528
- default:
529
- throw new Error("Unsupported type: " + tfAst.type);
530
- }
531
- }
532
- function terraformScopeTraversalToTs(tfAst, _targetType) {
533
- return t.identifier("TodoReference-" + tfAst.meta.traversal.map((t) => t.segment).join("-"));
534
- }
535
- function terraformTemplateToTs(scope, tfAst, targetType) {
536
- if (tfAst.children.length === 1) {
537
- return terraformThingToTs(scope, tfAst.children[0], targetType);
538
- }
539
- throw new Error("Template currently only supports exactly one child");
540
- }
541
- function terraformLiteralValueToTs(tfAst, targetType) {
542
- const literalExpression = t.stringLiteral(tfAst.meta.value);
543
- return (0, coerceType_1.coerceType)(
544
- // TODO: scope should be passed instead, even if coerceType won't need it probably
545
- {
546
- constructs: new Set(),
547
- hasTokenBasedTypeCoercion: false,
548
- providerGenerator: {},
549
- providerSchema: {},
550
- variables: {},
551
- nodeIds: [],
552
- importables: [],
553
- topLevelConfig: {},
554
- }, literalExpression, tfAst.meta.type, targetType);
555
- }
556
- function terraformFunctionCallToTs(scope, tfAst, targetType) {
557
- const { name } = tfAst.meta;
558
- const mapping = functions_1.functionsMap[name];
559
- if (!mapping) {
560
- throw new Error(`Mapping not found for function: ${name}`);
561
- }
562
- if (mapping.transformer) {
563
- const newTfAst = mapping.transformer(tfAst);
564
- if (newTfAst !== tfAst)
565
- return terraformFunctionCallToTs(scope, newTfAst, targetType);
566
- }
567
- scope.importables.push({
568
- constructName: "Fn",
569
- provider: "cdktn",
570
- });
571
- const callee = t.memberExpression(t.identifier("Fn"), t.identifier(mapping.name));
572
- const args = [];
573
- mapping.parameters.forEach((param, idx) => {
574
- if (param.variadic) {
575
- // return an array with all remaining children (each mapped accordingly)
576
- args.push(t.arrayExpression(tfAst.children
577
- .slice(idx)
578
- .map((child) => terraformThingToTs(scope, child, param.type))));
579
- }
580
- else {
581
- const child = tfAst.children[idx];
582
- if (child) {
583
- args.push(terraformThingToTs(scope, child, param.type));
584
- }
585
- else if (!param.optional) {
586
- throw new Error(`Terraform function call to "${name}" is not valid! Parameter at index ${idx} of type ${param.type} is not optional but received no value. The following parameters were passed: ${JSON.stringify(tfAst.children)}`);
587
- }
588
- }
589
- });
590
- const returnType = mapping.returnType;
591
- const callExpression = t.callExpression(callee, args);
592
- return (0, coerceType_1.coerceType)(
593
- // TODO: scope should be passed instead, even if coerceType won't need it probably
594
- {
595
- constructs: new Set(),
596
- hasTokenBasedTypeCoercion: false,
597
- providerGenerator: {},
598
- providerSchema: {},
599
- variables: {},
600
- nodeIds: [],
601
- importables: [],
602
- topLevelConfig: {},
603
- }, callExpression, returnType, targetType);
604
- }
605
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmdW5jdGlvbnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsZ0RBQWtDO0FBRWxDLDhDQUEyQztBQUMzQyw4REFBOEQ7QUFFOUQsK0NBQTBDO0FBOEMxQyxNQUFNLEtBQUssR0FBaUI7SUFDMUIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixVQUFVLEVBQUUsSUFBSSxHQUFHLEVBQUU7SUFDckIsU0FBUyxFQUFFLEVBQUU7SUFDYix5QkFBeUIsRUFBRSxLQUFLO0lBQ2hDLE9BQU8sRUFBRSxFQUFFO0lBQ1gsV0FBVyxFQUFFLEVBQUU7SUFDZixjQUFjLEVBQUUsRUFBRTtDQUNuQixDQUFDO0FBU0YsZ0RBQWdEO0FBQ2hELDREQUE0RDtBQUM1RCxNQUFNLE1BQU0sR0FBVTtJQUNwQixRQUFRLEVBQUU7UUFDUjtZQUNFLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxRQUFRLEVBQUUsRUFBRTtvQkFDWixJQUFJLEVBQUU7d0JBQ0osU0FBUyxFQUFFOzRCQUNUO2dDQUNFLEtBQUssRUFBRTtvQ0FDTCxHQUFHLEVBQUU7d0NBQ0gsSUFBSSxFQUFFLEVBQUU7d0NBQ1IsTUFBTSxFQUFFLEVBQUU7d0NBQ1YsSUFBSSxFQUFFLENBQUM7cUNBQ1I7b0NBQ0QsUUFBUSxFQUFFLEVBQUU7b0NBQ1osS0FBSyxFQUFFO3dDQUNMLElBQUksRUFBRSxFQUFFO3dDQUNSLE1BQU0sRUFBRSxFQUFFO3dDQUNWLElBQUksRUFBRSxDQUFDO3FDQUNSO2lDQUNGO2dDQUNELE9BQU8sRUFBRSxRQUFROzZCQUNsQjs0QkFDRDtnQ0FDRSxLQUFLLEVBQUU7b0NBQ0wsR0FBRyxFQUFFO3dDQUNILElBQUksRUFBRSxFQUFFO3dDQUNSLE1BQU0sRUFBRSxFQUFFO3dDQUNWLElBQUksRUFBRSxDQUFD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LEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQkFBK0IsSUFBSSxzQ0FBc0MsR0FBRyxZQUMxRSxLQUFLLENBQUMsSUFDUixpRkFBaUYsSUFBSSxDQUFDLFNBQVMsQ0FDN0YsS0FBSyxDQUFDLFFBQVEsQ0FDZixFQUFFLENBQ0osQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBRXRDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXRELE9BQU8sSUFBQSx1QkFBVTtJQUNmLGtGQUFrRjtJQUNsRjtRQUNFLFVBQVUsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNyQix5QkFBeUIsRUFBRSxLQUFLO1FBQ2hDLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsY0FBYyxFQUFFLEVBQUU7UUFDbEIsU0FBUyxFQUFFLEVBQUU7UUFDYixPQUFPLEVBQUUsRUFBRTtRQUNYLFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUU7S0FDbkIsRUFDRCxjQUFjLEVBQ2QsVUFBVSxFQUNWLFVBQVUsQ0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgdCBmcm9tIFwiQGJhYmVsL3R5cGVzXCI7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUeXBlIH0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBjb2VyY2VUeXBlIH0gZnJvbSBcIi4uL2NvZXJjZVR5cGVcIjtcbmltcG9ydCB7IGZ1bmN0aW9uc01hcCB9IGZyb20gXCIuLi9mdW5jdGlvbi1iaW5kaW5ncy9mdW5jdGlvbnNcIjtcbmltcG9ydCB7IFByb2dyYW1TY29wZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgYXN0VG9Db2RlIH0gZnJvbSBcIi4vdGVzdEhlbHBlcnNcIjtcblxudHlwZSBCYXNlVGhpbmcgPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgY2hpbGRyZW46IFRoaW5nW107XG4gIG1ldGE/OiBvYmplY3Q7XG4gIHJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxufTtcblxudHlwZSBGdW5jdGlvbkNhbGwgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiZnVuY3Rpb25cIjtcbiAgbWV0YToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHBhbmRlZEZpbmFsQXJndW1lbnQ/OiBib29sZWFuOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgY2xvc2VQYXJlblJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxuICAgIG9wZW5QYXJlblJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxuICAgIG5hbWVSYW5nZT86IHVua25vd247IC8vIG9wdGlvbmFsIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRcbiAgfTtcbn07XG5cbnR5cGUgVGVtcGxhdGVXcmFwID0gQmFzZVRoaW5nICYge1xuICB0eXBlOiBcIlRlbXBsYXRlV3JhcFwiO1xufTtcblxudHlwZSBUZW1wbGF0ZSA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJUZW1wbGF0ZVwiO1xufTtcblxudHlwZSBMaXRlcmFsVmFsdWUgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiTGl0ZXJhbFZhbHVlXCI7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiO1xuICAgIHZhbHVlOiBzdHJpbmc7IC8vIHRoaXMgaXMgYXZhaWxhYmxlIGluIG90aGVyIFwiVGhpbmdzXCIgdG9vIGJ1dCB3ZSBvbmx5IG5lZWQgaXQgaGVyZSB5ZXRcbiAgfTtcbn07XG5cbnR5cGUgU2NvcGVUcmF2ZXJzYWwgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIjtcbiAgbWV0YToge1xuICAgIHRyYXZlcnNhbDoge1xuICAgICAgc2VnbWVudDogc3RyaW5nO1xuICAgICAgcmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgfVtdO1xuICB9O1xufTtcblxuY29uc3Qgc2NvcGU6IFByb2dyYW1TY29wZSA9IHtcbiAgcHJvdmlkZXJTY2hlbWE6IHt9LFxuICBwcm92aWRlckdlbmVyYXRvcjoge30sXG4gIGNvbnN0cnVjdHM6IG5ldyBTZXQoKSxcbiAgdmFyaWFibGVzOiB7fSxcbiAgaGFzVG9rZW5CYXNlZFR5cGVDb2VyY2lvbjogZmFsc2UsXG4gIG5vZGVJZHM6IFtdLFxuICBpbXBvcnRhYmxlczogW10sXG4gIHRvcExldmVsQ29uZmlnOiB7fSxcbn07XG5cbnR5cGUgVGhpbmcgPVxuICB8IEZ1bmN0aW9uQ2FsbFxuICB8IFRlbXBsYXRlV3JhcFxuICB8IFRlbXBsYXRlXG4gIHwgU2NvcGVUcmF2ZXJzYWxcbiAgfCBMaXRlcmFsVmFsdWU7XG5cbi8vICcke3JlcGxhY2UobW9kdWxlLmZvby5vdXRwdXQsIFwiLVwiLCB2YXIuYmFyKX0nXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9wdWxsLzI3MjlcbmNvbnN0IGR1bW15MjogVGhpbmcgPSB7XG4gIGNoaWxkcmVuOiBbXG4gICAge1xuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMTYsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMTYsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcIm1vZHVsZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIEVuZDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBGaWxlbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIFN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDE2LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDE2LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwiZm9vXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgICAgRW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDI3LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDI3LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIEZpbGVuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMjAsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMjAsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VnbWVudDogXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDI3LFxuICAgICAgICAgICAgICBjb2x1bW46IDI3LFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDEwLFxuICAgICAgICAgICAgICBjb2x1bW46IDEwLFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiLVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgYnl0ZTogMzEsXG4gICAgICAgICAgICAgICAgICBjb2x1bW46IDMxLFxuICAgICAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICBieXRlOiAzMCxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogMzAsXG4gICAgICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHR5cGU6IFwiTGl0ZXJhbFZhbHVlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICBieXRlOiAzMSxcbiAgICAgICAgICAgICAgY29sdW1uOiAzMSxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICBieXRlOiAzMCxcbiAgICAgICAgICAgICAgY29sdW1uOiAzMCxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiBcIlRlbXBsYXRlXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgICAgRW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDM3LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDM3LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIEZpbGVuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMzQsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMzQsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogNDEsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogNDEsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAzNyxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAzNyxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcImJhclwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogNDEsXG4gICAgICAgICAgICAgIGNvbHVtbjogNDEsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogMzQsXG4gICAgICAgICAgICAgIGNvbHVtbjogMzQsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgY2xvc2VQYXJlblJhbmdlOiB7XG4gICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICBieXRlOiA0MixcbiAgICAgICAgICAgIGNvbHVtbjogNDIsXG4gICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIGJ5dGU6IDQxLFxuICAgICAgICAgICAgY29sdW1uOiA0MSxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwYW5kZWRGaW5hbEFyZ3VtZW50OiBmYWxzZSxcbiAgICAgICAgbmFtZTogXCJyZXBsYWNlXCIsXG4gICAgICAgIG5hbWVSYW5nZToge1xuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgYnl0ZTogOSxcbiAgICAgICAgICAgIGNvbHVtbjogOSxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgYnl0ZTogMixcbiAgICAgICAgICAgIGNvbHVtbjogMixcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgb3BlblBhcmVuUmFuZ2U6IHtcbiAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgIGJ5dGU6IDEwLFxuICAgICAgICAgICAgY29sdW1uOiAxMCxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgYnl0ZTogOSxcbiAgICAgICAgICAgIGNvbHVtbjogOSxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByYW5nZToge1xuICAgICAgICBlbmQ6IHtcbiAgICAgICAgICBieXRlOiAxMCxcbiAgICAgICAgICBjb2x1bW46IDEwLFxuICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgYnl0ZTogMixcbiAgICAgICAgICBjb2x1bW46IDIsXG4gICAgICAgICAgbGluZTogMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgfSxcbiAgXSxcbiAgcmFuZ2U6IHtcbiAgICBlbmQ6IHtcbiAgICAgIGJ5dGU6IDQzLFxuICAgICAgY29sdW1uOiA0MyxcbiAgICAgIGxpbmU6IDAsXG4gICAgfSxcbiAgICBzdGFydDoge1xuICAgICAgYnl0ZTogMCxcbiAgICAgIGNvbHVtbjogMCxcbiAgICAgIGxpbmU6IDAsXG4gICAgfSxcbiAgfSxcbiAgdHlwZTogXCJUZW1wbGF0ZVdyYXBcIixcbn07XG5cbmRlc2NyaWJlKFwiYmluZGluZ3MgZm9yIFRlcnJhZm9ybSBmdW5jdGlvbnNcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1RcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZSh0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIGR1bW15MiwgXCJkeW5hbWljXCIpKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIkZuLnJlcGxhY2UoVG9kb1JlZmVyZW5jZS1tb2R1bGUtZm9vLW91dHB1dCwgXCItXCIsIFRvZG9SZWZlcmVuY2UtdmFyLWJhcilcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBvdmVycmlkZW4gZnVuY3Rpb24gbmFtZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImxlbmd0aFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KGBcIkZuLmxlbmd0aE9mKFRvZG9SZWZlcmVuY2UtdmFyLWxpc3QpXCJgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBvdmVycmlkZW4gZnVuY3Rpb24gd2l0aCB2YXJpYWRpYyBhcmdzIGZvciBvcHRpb25hbCBwYXJhbXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJiY3J5cHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwiY29zdFwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInN0cmluZ1wiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIkZuLmJjcnlwdChUb2RvUmVmZXJlbmNlLXZhci1zdHIsIFRvZG9SZWZlcmVuY2UtdmFyLWNvc3QpXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVCBmb3Igb3ZlcnJpZGVuIGZ1bmN0aW9uIHdpdGggdmFyaWFkaWMgYXJncyBmb3Igb3B0aW9uYWwgcGFyYW1zIHRoYXQgYXJlIG5vdCBwYXNzZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJiY3J5cHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KGBcIkZuLmJjcnlwdChUb2RvUmVmZXJlbmNlLXZhci1zdHIpXCJgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBmdW5jdGlvbiB3aXRoIHZhcmlhZGljIHBhcmFtXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwidHJ5XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0ckFcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJCXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZHluYW1pY1wiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIkZuLnRyeShbVG9kb1JlZmVyZW5jZS12YXItc3RyQSwgVG9kb1JlZmVyZW5jZS12YXItc3RyQl0pXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVCBmb3Igam9pbiBmdW5jdGlvbiB3aXRoIHNpbmdsZSBsaXN0IHBhcmFtXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiam9pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4uam9pbihUb2RvUmVmZXJlbmNlLXZhci1zdHIsIFRvZG9SZWZlcmVuY2UtdmFyLWxpc3QpXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVCBmb3Igam9pbiBmdW5jdGlvbiB3aXRoIG11bHRpcGxlIGxpc3QgcGFyYW1zXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiam9pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJsaXN0QVwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RCXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4uam9pbihUb2RvUmVmZXJlbmNlLXZhci1zdHIsIFRva2VuLmFzTGlzdChGbi5jb25jYXQoW1RvZG9SZWZlcmVuY2UtdmFyLWxpc3RBLCBUb2RvUmVmZXJlbmNlLXZhci1saXN0Ql0pKSlcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgdGhyb3cgaWYgbm90IGVub3VnaCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkXCIsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJiY3J5cHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInN0cmluZ1wiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLnRvVGhyb3dFcnJvck1hdGNoaW5nSW5saW5lU25hcHNob3QoXG4gICAgICBgXCJUZXJyYWZvcm0gZnVuY3Rpb24gY2FsbCB0byBcImJjcnlwdFwiIGlzIG5vdCB2YWxpZCEgUGFyYW1ldGVyIGF0IGluZGV4IDAgb2YgdHlwZSBzdHJpbmcgaXMgbm90IG9wdGlvbmFsIGJ1dCByZWNlaXZlZCBubyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkOiBbXVwiYCxcbiAgICApO1xuICB9KTtcblxuICAvLyBUT0RPOiB0ZXN0cyBmb3IgdHlwZSBjb2VyY2lvblxufSk7XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgc2NvcGU6IFByb2dyYW1TY29wZSxcbiAgdGZBc3Q6IFRoaW5nLFxuICB0YXJnZXRUeXBlOiBBdHRyaWJ1dGVUeXBlIHwgdW5kZWZpbmVkLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgc3dpdGNoICh0ZkFzdC50eXBlKSB7XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIHJldHVybiB0ZXJyYWZvcm1GdW5jdGlvbkNhbGxUb1RzKHNjb3BlLCB0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGNhc2UgXCJUZW1wbGF0ZVdyYXBcIjoge1xuICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IG9uZSBjaGlsZCwgd2UgY2FuIHNraXAgdGhlbVxuICAgICAgaWYgKHRmQXN0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGVycmFmb3JtVGhpbmdUb1RzKHNjb3BlLCB0ZkFzdC5jaGlsZHJlblswXSwgdGFyZ2V0VHlwZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGVtcGxhdGVXcmFwIHdpdGggbm90IGV4YWN0bHkgb25lIGNoaWxkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0OiBcIiArXG4gICAgICAgICAgdGZBc3QuY2hpbGRyZW4sXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlIFwiU2NvcGVUcmF2ZXJzYWxcIjoge1xuICAgICAgcmV0dXJuIHRlcnJhZm9ybVNjb3BlVHJhdmVyc2FsVG9Ucyh0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGNhc2UgXCJUZW1wbGF0ZVwiOiB7XG4gICAgICByZXR1cm4gdGVycmFmb3JtVGVtcGxhdGVUb1RzKHNjb3BlLCB0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGNhc2UgXCJMaXRlcmFsVmFsdWVcIjoge1xuICAgICAgcmV0dXJuIHRlcnJhZm9ybUxpdGVyYWxWYWx1ZVRvVHModGZBc3QsIHRhcmdldFR5cGUpO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdHlwZTogXCIgKyAodGZBc3QgYXMgYW55KS50eXBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1TY29wZVRyYXZlcnNhbFRvVHMoXG4gIHRmQXN0OiBTY29wZVRyYXZlcnNhbCxcbiAgX3RhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICByZXR1cm4gdC5pZGVudGlmaWVyKFxuICAgIFwiVG9kb1JlZmVyZW5jZS1cIiArIHRmQXN0Lm1ldGEudHJhdmVyc2FsLm1hcCgodCkgPT4gdC5zZWdtZW50KS5qb2luKFwiLVwiKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdGVycmFmb3JtVGVtcGxhdGVUb1RzKFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICB0ZkFzdDogVGVtcGxhdGUsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBpZiAodGZBc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHRlcnJhZm9ybVRoaW5nVG9UcyhzY29wZSwgdGZBc3QuY2hpbGRyZW5bMF0sIHRhcmdldFR5cGUpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIlRlbXBsYXRlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGV4YWN0bHkgb25lIGNoaWxkXCIpO1xufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1MaXRlcmFsVmFsdWVUb1RzKFxuICB0ZkFzdDogTGl0ZXJhbFZhbHVlLFxuICB0YXJnZXRUeXBlOiBBdHRyaWJ1dGVUeXBlIHwgdW5kZWZpbmVkLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgY29uc3QgbGl0ZXJhbEV4cHJlc3Npb24gPSB0LnN0cmluZ0xpdGVyYWwodGZBc3QubWV0YS52YWx1ZSk7XG4gIHJldHVybiBjb2VyY2VUeXBlKFxuICAgIC8vIFRPRE86IHNjb3BlIHNob3VsZCBiZSBwYXNzZWQgaW5zdGVhZCwgZXZlbiBpZiBjb2VyY2VUeXBlIHdvbid0IG5lZWQgaXQgcHJvYmFibHlcbiAgICB7XG4gICAgICBjb25zdHJ1Y3RzOiBuZXcgU2V0KCksXG4gICAgICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgICAgIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgICAgIHByb3ZpZGVyU2NoZW1hOiB7fSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBub2RlSWRzOiBbXSxcbiAgICAgIGltcG9ydGFibGVzOiBbXSxcbiAgICAgIHRvcExldmVsQ29uZmlnOiB7fSxcbiAgICB9LFxuICAgIGxpdGVyYWxFeHByZXNzaW9uLFxuICAgIHRmQXN0Lm1ldGEudHlwZSxcbiAgICB0YXJnZXRUeXBlLFxuICApO1xufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1GdW5jdGlvbkNhbGxUb1RzKFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICB0ZkFzdDogRnVuY3Rpb25DYWxsLFxuICB0YXJnZXRUeXBlOiBBdHRyaWJ1dGVUeXBlIHwgdW5kZWZpbmVkLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgY29uc3QgeyBuYW1lIH0gPSB0ZkFzdC5tZXRhO1xuXG4gIGNvbnN0IG1hcHBpbmcgPSBmdW5jdGlvbnNNYXBbbmFtZV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWFwcGluZyBub3QgZm91bmQgZm9yIGZ1bmN0aW9uOiAke25hbWV9YCk7XG4gIH1cblxuICBpZiAobWFwcGluZy50cmFuc2Zvcm1lcikge1xuICAgIGNvbnN0IG5ld1RmQXN0ID0gbWFwcGluZy50cmFuc2Zvcm1lcih0ZkFzdCk7XG4gICAgaWYgKG5ld1RmQXN0ICE9PSB0ZkFzdClcbiAgICAgIHJldHVybiB0ZXJyYWZvcm1GdW5jdGlvbkNhbGxUb1RzKHNjb3BlLCBuZXdUZkFzdCwgdGFyZ2V0VHlwZSk7XG4gIH1cblxuICBzY29wZS5pbXBvcnRhYmxlcy5wdXNoKHtcbiAgICBjb25zdHJ1Y3ROYW1lOiBcIkZuXCIsXG4gICAgcHJvdmlkZXI6IFwiY2RrdG5cIixcbiAgfSk7XG5cbiAgY29uc3QgY2FsbGVlID0gdC5tZW1iZXJFeHByZXNzaW9uKFxuICAgIHQuaWRlbnRpZmllcihcIkZuXCIpLFxuICAgIHQuaWRlbnRpZmllcihtYXBwaW5nLm5hbWUpLFxuICApO1xuXG4gIGNvbnN0IGFyZ3M6IHQuRXhwcmVzc2lvbltdID0gW107XG4gIG1hcHBpbmcucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSwgaWR4KSA9PiB7XG4gICAgaWYgKHBhcmFtLnZhcmlhZGljKSB7XG4gICAgICAvLyByZXR1cm4gYW4gYXJyYXkgd2l0aCBhbGwgcmVtYWluaW5nIGNoaWxkcmVuIChlYWNoIG1hcHBlZCBhY2NvcmRpbmdseSlcbiAgICAgIGFyZ3MucHVzaChcbiAgICAgICAgdC5hcnJheUV4cHJlc3Npb24oXG4gICAgICAgICAgdGZBc3QuY2hpbGRyZW5cbiAgICAgICAgICAgIC5zbGljZShpZHgpXG4gICAgICAgICAgICAubWFwKChjaGlsZCkgPT4gdGVycmFmb3JtVGhpbmdUb1RzKHNjb3BlLCBjaGlsZCwgcGFyYW0udHlwZSkpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hpbGQgPSB0ZkFzdC5jaGlsZHJlbltpZHhdO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIGFyZ3MucHVzaCh0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIGNoaWxkLCBwYXJhbS50eXBlKSk7XG4gICAgICB9IGVsc2UgaWYgKCFwYXJhbS5vcHRpb25hbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlcnJhZm9ybSBmdW5jdGlvbiBjYWxsIHRvIFwiJHtuYW1lfVwiIGlzIG5vdCB2YWxpZCEgUGFyYW1ldGVyIGF0IGluZGV4ICR7aWR4fSBvZiB0eXBlICR7XG4gICAgICAgICAgICBwYXJhbS50eXBlXG4gICAgICAgICAgfSBpcyBub3Qgb3B0aW9uYWwgYnV0IHJlY2VpdmVkIG5vIHZhbHVlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0ZkFzdC5jaGlsZHJlbixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZXR1cm5UeXBlID0gbWFwcGluZy5yZXR1cm5UeXBlO1xuXG4gIGNvbnN0IGNhbGxFeHByZXNzaW9uID0gdC5jYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpO1xuXG4gIHJldHVybiBjb2VyY2VUeXBlKFxuICAgIC8vIFRPRE86IHNjb3BlIHNob3VsZCBiZSBwYXNzZWQgaW5zdGVhZCwgZXZlbiBpZiBjb2VyY2VUeXBlIHdvbid0IG5lZWQgaXQgcHJvYmFibHlcbiAgICB7XG4gICAgICBjb25zdHJ1Y3RzOiBuZXcgU2V0KCksXG4gICAgICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgICAgIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgICAgIHByb3ZpZGVyU2NoZW1hOiB7fSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBub2RlSWRzOiBbXSxcbiAgICAgIGltcG9ydGFibGVzOiBbXSxcbiAgICAgIHRvcExldmVsQ29uZmlnOiB7fSxcbiAgICB9LFxuICAgIGNhbGxFeHByZXNzaW9uLFxuICAgIHJldHVyblR5cGUsXG4gICAgdGFyZ2V0VHlwZSxcbiAgKTtcbn1cbiJdfQ==