@cdktn/hcl2cdk 0.23.0-pre.4 → 0.23.0-pre.41
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.
- package/ambient.d.ts +0 -1
- package/build/__tests__/coerceType.test.js +165 -0
- package/build/__tests__/expressionToTs.test.js +693 -0
- package/build/__tests__/expressions.test.js +415 -0
- package/build/__tests__/findExpressionType.test.js +105 -0
- package/build/__tests__/functions.test.js +605 -0
- package/build/__tests__/generation.test.js +45 -0
- package/build/__tests__/jsii-rosetta-workarounds.test.js +86 -0
- package/build/__tests__/partialCode.test.js +390 -0
- package/build/__tests__/terraformSchema.test.js +105 -0
- package/build/__tests__/testHelpers.js +16 -0
- package/build/coerceType.js +240 -0
- package/build/dynamic-blocks.js +44 -0
- package/build/expressions.js +633 -0
- package/build/function-bindings/functions.generated.js +1142 -0
- package/build/function-bindings/functions.js +73 -0
- package/build/generation.js +676 -0
- package/{lib → build}/index.d.ts +2 -2
- package/build/index.js +364 -0
- package/build/iteration.js +87 -0
- package/build/jsii-rosetta-workarounds.js +126 -0
- package/build/partialCode.js +116 -0
- package/build/provider.js +40 -0
- package/build/references.js +141 -0
- package/build/schema.js +81 -0
- package/build/telemetryAllowList.json +24 -0
- package/build/terraformSchema.js +136 -0
- package/build/types.js +3 -0
- package/build/utils.js +25 -0
- package/build/variables.js +172 -0
- package/package.json +19 -19
- package/tsconfig.json +4 -2
- package/lib/__tests__/coerceType.test.js +0 -165
- package/lib/__tests__/expressionToTs.test.js +0 -693
- package/lib/__tests__/expressions.test.js +0 -415
- package/lib/__tests__/findExpressionType.test.js +0 -105
- package/lib/__tests__/functions.test.js +0 -605
- package/lib/__tests__/generation.test.js +0 -45
- package/lib/__tests__/jsii-rosetta-workarounds.test.js +0 -86
- package/lib/__tests__/partialCode.test.js +0 -390
- package/lib/__tests__/terraformSchema.test.js +0 -105
- package/lib/__tests__/testHelpers.js +0 -16
- package/lib/coerceType.js +0 -240
- package/lib/dynamic-blocks.js +0 -44
- package/lib/expressions.js +0 -634
- package/lib/function-bindings/functions.generated.js +0 -1142
- package/lib/function-bindings/functions.js +0 -73
- package/lib/generation.js +0 -676
- package/lib/index.js +0 -364
- package/lib/iteration.js +0 -87
- package/lib/jsii-rosetta-workarounds.js +0 -126
- package/lib/partialCode.js +0 -116
- package/lib/provider.js +0 -40
- package/lib/references.js +0 -141
- package/lib/schema.js +0 -81
- package/lib/terraformSchema.js +0 -136
- package/lib/types.js +0 -3
- package/lib/utils.js +0 -25
- package/lib/variables.js +0 -172
- /package/{lib → build}/__tests__/coerceType.test.d.ts +0 -0
- /package/{lib → build}/__tests__/expressionToTs.test.d.ts +0 -0
- /package/{lib → build}/__tests__/expressions.test.d.ts +0 -0
- /package/{lib → build}/__tests__/findExpressionType.test.d.ts +0 -0
- /package/{lib → build}/__tests__/functions.test.d.ts +0 -0
- /package/{lib → build}/__tests__/generation.test.d.ts +0 -0
- /package/{lib → build}/__tests__/jsii-rosetta-workarounds.test.d.ts +0 -0
- /package/{lib → build}/__tests__/partialCode.test.d.ts +0 -0
- /package/{lib → build}/__tests__/terraformSchema.test.d.ts +0 -0
- /package/{lib → build}/__tests__/testHelpers.d.ts +0 -0
- /package/{lib → build}/coerceType.d.ts +0 -0
- /package/{lib → build}/dynamic-blocks.d.ts +0 -0
- /package/{lib → build}/expressions.d.ts +0 -0
- /package/{lib → build}/function-bindings/functions.d.ts +0 -0
- /package/{lib → build}/function-bindings/functions.generated.d.ts +0 -0
- /package/{lib → build}/generation.d.ts +0 -0
- /package/{lib → build}/iteration.d.ts +0 -0
- /package/{lib → build}/jsii-rosetta-workarounds.d.ts +0 -0
- /package/{lib → build}/partialCode.d.ts +0 -0
- /package/{lib → build}/provider.d.ts +0 -0
- /package/{lib → build}/references.d.ts +0 -0
- /package/{lib → build}/schema.d.ts +0 -0
- /package/{lib → build}/terraformSchema.d.ts +0 -0
- /package/{lib → build}/types.d.ts +0 -0
- /package/{lib → build}/utils.d.ts +0 -0
- /package/{lib → build}/variables.d.ts +0 -0
- /package/{lib → src}/telemetryAllowList.json +0 -0
|
@@ -0,0 +1,605 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Z1bmN0aW9ucy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxnREFBa0M7QUFFbEMsOENBQTJDO0FBQzNDLDhEQUE4RDtBQUU5RCwrQ0FBMEM7QUE4QzFDLE1BQU0sS0FBSyxHQUFpQjtJQUMxQixjQUFjLEVBQUUsRUFBRTtJQUNsQixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLFVBQVUsRUFBRSxJQUFJLEdBQUcsRUFBRTtJQUNyQixTQUFTLEVBQUUsRUFBRTtJQUNiLHlCQUF5QixFQUFFLEtBQUs7SUFDaEMsT0FBTyxFQUFFLEVBQUU7SUFDWCxXQUFXLEVBQUUsRUFBRTtJQUNmLGNBQWMsRUFBRSxFQUFFO0NBQ25CLENBQUM7QUFTRixnREFBZ0Q7QUFDaEQsNERBQTREO0FBQzVELE1BQU0sTUFBTSxHQUFVO0lBQ3BCLFFBQVEsRUFBRTtRQUNSO1lBQ0UsUUFBUSxFQUFFO2dCQUNSO29CQUNFLFFBQVEsRUFBRSxFQUFFO29CQUNaLElBQUksRUFBRTt3QkFDSixTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsS0FBSyxFQUFFO29DQUNMLEdBQUcsRUFBRTt3Q0FDSCxJQUFJLEVBQUUsRUFBRTt3Q0FDUixNQUFNLEVBQUUsRUFBRTt3Q0FDVixJQUFJLEVBQUUsQ0FBQztxQ0FDUjtvQ0FDRCxRQUFRLEVBQUUsRUFBRTtvQ0FDWixLQUFLLEVBQUU7d0NBQ0wsSUFBSSxFQUFFLEVBQUU7d0NBQ1IsTUFBTSxFQUFFLEVBQUU7d0NBQ1YsSUFBSSxFQUFFLENBQUM7cUNBQ1I7aUNBQ0Y7Z0NBQ0QsT0FBTyxFQUFFLFFBQVE7NkJBQ2xCOzRCQUNEO2dDQUNFLEtBQUssRUFBRTtvQ0FDTCxHQUFHLEVBQUU7d0NBQ0gsSUFBSSxFQUFFLEVBQUU7d0NBQ1IsTUFBTSxFQUFFLEVBQUU7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Q0FBQztpQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLCtCQUErQixJQUFJLHNDQUFzQyxHQUFHLFlBQzFFLEtBQUssQ0FBQyxJQUNSLGlGQUFpRixJQUFJLENBQUMsU0FBUyxDQUM3RixLQUFLLENBQUMsUUFBUSxDQUNmLEVBQUUsQ0FDSixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFFdEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFdEQsT0FBTyxJQUFBLHVCQUFVO0lBQ2Ysa0ZBQWtGO0lBQ2xGO1FBQ0UsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3JCLHlCQUF5QixFQUFFLEtBQUs7UUFDaEMsaUJBQWlCLEVBQUUsRUFBRTtRQUNyQixjQUFjLEVBQUUsRUFBRTtRQUNsQixTQUFTLEVBQUUsRUFBRTtRQUNiLE9BQU8sRUFBRSxFQUFFO1FBQ1gsV0FBVyxFQUFFLEVBQUU7UUFDZixjQUFjLEVBQUUsRUFBRTtLQUNuQixFQUNELGNBQWMsRUFDZCxVQUFVLEVBQ1YsVUFBVSxDQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gXCJAYmFiZWwvdHlwZXNcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IGNvZXJjZVR5cGUgfSBmcm9tIFwiLi4vY29lcmNlVHlwZVwiO1xuaW1wb3J0IHsgZnVuY3Rpb25zTWFwIH0gZnJvbSBcIi4uL2Z1bmN0aW9uLWJpbmRpbmdzL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IHsgUHJvZ3JhbVNjb3BlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3RUb0NvZGUgfSBmcm9tIFwiLi90ZXN0SGVscGVyc1wiO1xuXG50eXBlIEJhc2VUaGluZyA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBjaGlsZHJlbjogVGhpbmdbXTtcbiAgbWV0YT86IG9iamVjdDtcbiAgcmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG59O1xuXG50eXBlIEZ1bmN0aW9uQ2FsbCA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJmdW5jdGlvblwiO1xuICBtZXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4cGFuZGVkRmluYWxBcmd1bWVudD86IGJvb2xlYW47IC8vIG9wdGlvbmFsIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRcbiAgICBjbG9zZVBhcmVuUmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgb3BlblBhcmVuUmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgbmFtZVJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxuICB9O1xufTtcblxudHlwZSBUZW1wbGF0ZVdyYXAgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiVGVtcGxhdGVXcmFwXCI7XG59O1xuXG50eXBlIFRlbXBsYXRlID0gQmFzZVRoaW5nICYge1xuICB0eXBlOiBcIlRlbXBsYXRlXCI7XG59O1xuXG50eXBlIExpdGVyYWxWYWx1ZSA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJMaXRlcmFsVmFsdWVcIjtcbiAgbWV0YToge1xuICAgIHR5cGU6IFwic3RyaW5nXCI7XG4gICAgdmFsdWU6IHN0cmluZzsgLy8gdGhpcyBpcyBhdmFpbGFibGUgaW4gb3RoZXIgXCJUaGluZ3NcIiB0b28gYnV0IHdlIG9ubHkgbmVlZCBpdCBoZXJlIHlldFxuICB9O1xufTtcblxudHlwZSBTY29wZVRyYXZlcnNhbCA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiO1xuICBtZXRhOiB7XG4gICAgdHJhdmVyc2FsOiB7XG4gICAgICBzZWdtZW50OiBzdHJpbmc7XG4gICAgICByYW5nZT86IHVua25vd247IC8vIG9wdGlvbmFsIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRcbiAgICB9W107XG4gIH07XG59O1xuXG5jb25zdCBzY29wZTogUHJvZ3JhbVNjb3BlID0ge1xuICBwcm92aWRlclNjaGVtYToge30sXG4gIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgY29uc3RydWN0czogbmV3IFNldCgpLFxuICB2YXJpYWJsZXM6IHt9LFxuICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgbm9kZUlkczogW10sXG4gIGltcG9ydGFibGVzOiBbXSxcbiAgdG9wTGV2ZWxDb25maWc6IHt9LFxufTtcblxudHlwZSBUaGluZyA9XG4gIHwgRnVuY3Rpb25DYWxsXG4gIHwgVGVtcGxhdGVXcmFwXG4gIHwgVGVtcGxhdGVcbiAgfCBTY29wZVRyYXZlcnNhbFxuICB8IExpdGVyYWxWYWx1ZTtcblxuLy8gJyR7cmVwbGFjZShtb2R1bGUuZm9vLm91dHB1dCwgXCItXCIsIHZhci5iYXIpfSdcbi8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL3B1bGwvMjcyOVxuY29uc3QgZHVtbXkyOiBUaGluZyA9IHtcbiAgY2hpbGRyZW46IFtcbiAgICB7XG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIEVuZDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAxNixcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAxNixcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBGaWxlbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIFN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDEwLFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDEwLFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwibW9kdWxlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgICAgRW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDIwLFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDIwLFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIEZpbGVuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMTYsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMTYsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VnbWVudDogXCJmb29cIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMjcsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMjcsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcIm91dHB1dFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogMjcsXG4gICAgICAgICAgICAgIGNvbHVtbjogMjcsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogMTAsXG4gICAgICAgICAgICAgIGNvbHVtbjogMTAsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCItXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgICBieXRlOiAzMSxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogMzEsXG4gICAgICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgIGJ5dGU6IDMwLFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiAzMCxcbiAgICAgICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHlwZTogXCJMaXRlcmFsVmFsdWVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDMxLFxuICAgICAgICAgICAgICBjb2x1bW46IDMxLFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDMwLFxuICAgICAgICAgICAgICBjb2x1bW46IDMwLFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6IFwiVGVtcGxhdGVcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMzcsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMzcsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAzNCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAzNCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIEVuZDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiA0MSxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiA0MSxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBGaWxlbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIFN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDM3LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDM3LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwiYmFyXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICBieXRlOiA0MSxcbiAgICAgICAgICAgICAgY29sdW1uOiA0MSxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICBieXRlOiAzNCxcbiAgICAgICAgICAgICAgY29sdW1uOiAzNCxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbWV0YToge1xuICAgICAgICBjbG9zZVBhcmVuUmFuZ2U6IHtcbiAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgIGJ5dGU6IDQyLFxuICAgICAgICAgICAgY29sdW1uOiA0MixcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgYnl0ZTogNDEsXG4gICAgICAgICAgICBjb2x1bW46IDQxLFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBleHBhbmRlZEZpbmFsQXJndW1lbnQ6IGZhbHNlLFxuICAgICAgICBuYW1lOiBcInJlcGxhY2VcIixcbiAgICAgICAgbmFtZVJhbmdlOiB7XG4gICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICBieXRlOiA5LFxuICAgICAgICAgICAgY29sdW1uOiA5LFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICBieXRlOiAyLFxuICAgICAgICAgICAgY29sdW1uOiAyLFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBvcGVuUGFyZW5SYW5nZToge1xuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgYnl0ZTogMTAsXG4gICAgICAgICAgICBjb2x1bW46IDEwLFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICBieXRlOiA5LFxuICAgICAgICAgICAgY29sdW1uOiA5LFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIGVuZDoge1xuICAgICAgICAgIGJ5dGU6IDEwLFxuICAgICAgICAgIGNvbHVtbjogMTAsXG4gICAgICAgICAgbGluZTogMCxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICBieXRlOiAyLFxuICAgICAgICAgIGNvbHVtbjogMixcbiAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICB9LFxuICBdLFxuICByYW5nZToge1xuICAgIGVuZDoge1xuICAgICAgYnl0ZTogNDMsXG4gICAgICBjb2x1bW46IDQzLFxuICAgICAgbGluZTogMCxcbiAgICB9LFxuICAgIHN0YXJ0OiB7XG4gICAgICBieXRlOiAwLFxuICAgICAgY29sdW1uOiAwLFxuICAgICAgbGluZTogMCxcbiAgICB9LFxuICB9LFxuICB0eXBlOiBcIlRlbXBsYXRlV3JhcFwiLFxufTtcblxuZGVzY3JpYmUoXCJiaW5kaW5ncyBmb3IgVGVycmFmb3JtIGZ1bmN0aW9uc1wiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKHRlcnJhZm9ybVRoaW5nVG9UcyhzY29wZSwgZHVtbXkyLCBcImR5bmFtaWNcIikpLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4ucmVwbGFjZShUb2RvUmVmZXJlbmNlLW1vZHVsZS1mb28tb3V0cHV0LCBcIi1cIiwgVG9kb1JlZmVyZW5jZS12YXItYmFyKVwiYCxcbiAgICApO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1QgZm9yIG92ZXJyaWRlbiBmdW5jdGlvbiBuYW1lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoYFwiRm4ubGVuZ3RoT2YoVG9kb1JlZmVyZW5jZS12YXItbGlzdClcImApO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1QgZm9yIG92ZXJyaWRlbiBmdW5jdGlvbiB3aXRoIHZhcmlhZGljIGFyZ3MgZm9yIG9wdGlvbmFsIHBhcmFtc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImJjcnlwdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJjb3N0XCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4uYmNyeXB0KFRvZG9SZWZlcmVuY2UtdmFyLXN0ciwgVG9kb1JlZmVyZW5jZS12YXItY29zdClcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBvdmVycmlkZW4gZnVuY3Rpb24gd2l0aCB2YXJpYWRpYyBhcmdzIGZvciBvcHRpb25hbCBwYXJhbXMgdGhhdCBhcmUgbm90IHBhc3NlZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImJjcnlwdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzdHJpbmdcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoYFwiRm4uYmNyeXB0KFRvZG9SZWZlcmVuY2UtdmFyLXN0cilcImApO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1QgZm9yIGZ1bmN0aW9uIHdpdGggdmFyaWFkaWMgcGFyYW1cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJ0cnlcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwic3RyQVwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0ckJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJkeW5hbWljXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4udHJ5KFtUb2RvUmVmZXJlbmNlLXZhci1zdHJBLCBUb2RvUmVmZXJlbmNlLXZhci1zdHJCXSlcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBqb2luIGZ1bmN0aW9uIHdpdGggc2luZ2xlIGxpc3QgcGFyYW1cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJqb2luXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0clwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzdHJpbmdcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoXG4gICAgICBgXCJGbi5qb2luKFRvZG9SZWZlcmVuY2UtdmFyLXN0ciwgVG9kb1JlZmVyZW5jZS12YXItbGlzdClcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBqb2luIGZ1bmN0aW9uIHdpdGggbXVsdGlwbGUgbGlzdCBwYXJhbXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJqb2luXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0clwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RBXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwibGlzdEJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzdHJpbmdcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoXG4gICAgICBgXCJGbi5qb2luKFRvZG9SZWZlcmVuY2UtdmFyLXN0ciwgVG9rZW4uYXNMaXN0KEZuLmNvbmNhdChbVG9kb1JlZmVyZW5jZS12YXItbGlzdEEsIFRvZG9SZWZlcmVuY2UtdmFyLWxpc3RCXSkpKVwiYCxcbiAgICApO1xuICB9KTtcblxuICBpdChcInNob3VsZCB0aHJvdyBpZiBub3QgZW5vdWdoIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImJjcnlwdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9UaHJvd0Vycm9yTWF0Y2hpbmdJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIlRlcnJhZm9ybSBmdW5jdGlvbiBjYWxsIHRvIFwiYmNyeXB0XCIgaXMgbm90IHZhbGlkISBQYXJhbWV0ZXIgYXQgaW5kZXggMCBvZiB0eXBlIHN0cmluZyBpcyBub3Qgb3B0aW9uYWwgYnV0IHJlY2VpdmVkIG5vIHZhbHVlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQ6IFtdXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIFRPRE86IHRlc3RzIGZvciB0eXBlIGNvZXJjaW9uXG59KTtcblxuZnVuY3Rpb24gdGVycmFmb3JtVGhpbmdUb1RzKFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICB0ZkFzdDogVGhpbmcsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBzd2l0Y2ggKHRmQXN0LnR5cGUpIHtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIHRlcnJhZm9ybUZ1bmN0aW9uQ2FsbFRvVHMoc2NvcGUsIHRmQXN0LCB0YXJnZXRUeXBlKTtcbiAgICB9XG4gICAgY2FzZSBcIlRlbXBsYXRlV3JhcFwiOiB7XG4gICAgICAvLyBJZiB0aGVyZSdzIGp1c3Qgb25lIGNoaWxkLCB3ZSBjYW4gc2tpcCB0aGVtXG4gICAgICBpZiAodGZBc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIHRmQXN0LmNoaWxkcmVuWzBdLCB0YXJnZXRUeXBlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUZW1wbGF0ZVdyYXAgd2l0aCBub3QgZXhhY3RseSBvbmUgY2hpbGQgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6IFwiICtcbiAgICAgICAgICB0ZkFzdC5jaGlsZHJlbixcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgXCJTY29wZVRyYXZlcnNhbFwiOiB7XG4gICAgICByZXR1cm4gdGVycmFmb3JtU2NvcGVUcmF2ZXJzYWxUb1RzKHRmQXN0LCB0YXJnZXRUeXBlKTtcbiAgICB9XG4gICAgY2FzZSBcIlRlbXBsYXRlXCI6IHtcbiAgICAgIHJldHVybiB0ZXJyYWZvcm1UZW1wbGF0ZVRvVHMoc2NvcGUsIHRmQXN0LCB0YXJnZXRUeXBlKTtcbiAgICB9XG4gICAgY2FzZSBcIkxpdGVyYWxWYWx1ZVwiOiB7XG4gICAgICByZXR1cm4gdGVycmFmb3JtTGl0ZXJhbFZhbHVlVG9Ucyh0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB0eXBlOiBcIiArICh0ZkFzdCBhcyBhbnkpLnR5cGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybVNjb3BlVHJhdmVyc2FsVG9UcyhcbiAgdGZBc3Q6IFNjb3BlVHJhdmVyc2FsLFxuICBfdGFyZ2V0VHlwZTogQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCxcbik6IHQuRXhwcmVzc2lvbiB7XG4gIHJldHVybiB0LmlkZW50aWZpZXIoXG4gICAgXCJUb2RvUmVmZXJlbmNlLVwiICsgdGZBc3QubWV0YS50cmF2ZXJzYWwubWFwKCh0KSA9PiB0LnNlZ21lbnQpLmpvaW4oXCItXCIpLFxuICApO1xufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1UZW1wbGF0ZVRvVHMoXG4gIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gIHRmQXN0OiBUZW1wbGF0ZSxcbiAgdGFyZ2V0VHlwZTogQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCxcbik6IHQuRXhwcmVzc2lvbiB7XG4gIGlmICh0ZkFzdC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdGVycmFmb3JtVGhpbmdUb1RzKHNjb3BlLCB0ZkFzdC5jaGlsZHJlblswXSwgdGFyZ2V0VHlwZSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVGVtcGxhdGUgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgZXhhY3RseSBvbmUgY2hpbGRcIik7XG59XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybUxpdGVyYWxWYWx1ZVRvVHMoXG4gIHRmQXN0OiBMaXRlcmFsVmFsdWUsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBjb25zdCBsaXRlcmFsRXhwcmVzc2lvbiA9IHQuc3RyaW5nTGl0ZXJhbCh0ZkFzdC5tZXRhLnZhbHVlKTtcbiAgcmV0dXJuIGNvZXJjZVR5cGUoXG4gICAgLy8gVE9ETzogc2NvcGUgc2hvdWxkIGJlIHBhc3NlZCBpbnN0ZWFkLCBldmVuIGlmIGNvZXJjZVR5cGUgd29uJ3QgbmVlZCBpdCBwcm9iYWJseVxuICAgIHtcbiAgICAgIGNvbnN0cnVjdHM6IG5ldyBTZXQoKSxcbiAgICAgIGhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb246IGZhbHNlLFxuICAgICAgcHJvdmlkZXJHZW5lcmF0b3I6IHt9LFxuICAgICAgcHJvdmlkZXJTY2hlbWE6IHt9LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIG5vZGVJZHM6IFtdLFxuICAgICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgICAgdG9wTGV2ZWxDb25maWc6IHt9LFxuICAgIH0sXG4gICAgbGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgdGZBc3QubWV0YS50eXBlLFxuICAgIHRhcmdldFR5cGUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybUZ1bmN0aW9uQ2FsbFRvVHMoXG4gIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gIHRmQXN0OiBGdW5jdGlvbkNhbGwsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBjb25zdCB7IG5hbWUgfSA9IHRmQXN0Lm1ldGE7XG5cbiAgY29uc3QgbWFwcGluZyA9IGZ1bmN0aW9uc01hcFtuYW1lXTtcbiAgaWYgKCFtYXBwaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNYXBwaW5nIG5vdCBmb3VuZCBmb3IgZnVuY3Rpb246ICR7bmFtZX1gKTtcbiAgfVxuXG4gIGlmIChtYXBwaW5nLnRyYW5zZm9ybWVyKSB7XG4gICAgY29uc3QgbmV3VGZBc3QgPSBtYXBwaW5nLnRyYW5zZm9ybWVyKHRmQXN0KTtcbiAgICBpZiAobmV3VGZBc3QgIT09IHRmQXN0KVxuICAgICAgcmV0dXJuIHRlcnJhZm9ybUZ1bmN0aW9uQ2FsbFRvVHMoc2NvcGUsIG5ld1RmQXN0LCB0YXJnZXRUeXBlKTtcbiAgfVxuXG4gIHNjb3BlLmltcG9ydGFibGVzLnB1c2goe1xuICAgIGNvbnN0cnVjdE5hbWU6IFwiRm5cIixcbiAgICBwcm92aWRlcjogXCJjZGt0blwiLFxuICB9KTtcblxuICBjb25zdCBjYWxsZWUgPSB0Lm1lbWJlckV4cHJlc3Npb24oXG4gICAgdC5pZGVudGlmaWVyKFwiRm5cIiksXG4gICAgdC5pZGVudGlmaWVyKG1hcHBpbmcubmFtZSksXG4gICk7XG5cbiAgY29uc3QgYXJnczogdC5FeHByZXNzaW9uW10gPSBbXTtcbiAgbWFwcGluZy5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpZHgpID0+IHtcbiAgICBpZiAocGFyYW0udmFyaWFkaWMpIHtcbiAgICAgIC8vIHJldHVybiBhbiBhcnJheSB3aXRoIGFsbCByZW1haW5pbmcgY2hpbGRyZW4gKGVhY2ggbWFwcGVkIGFjY29yZGluZ2x5KVxuICAgICAgYXJncy5wdXNoKFxuICAgICAgICB0LmFycmF5RXhwcmVzc2lvbihcbiAgICAgICAgICB0ZkFzdC5jaGlsZHJlblxuICAgICAgICAgICAgLnNsaWNlKGlkeClcbiAgICAgICAgICAgIC5tYXAoKGNoaWxkKSA9PiB0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIGNoaWxkLCBwYXJhbS50eXBlKSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHRmQXN0LmNoaWxkcmVuW2lkeF07XG4gICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgYXJncy5wdXNoKHRlcnJhZm9ybVRoaW5nVG9UcyhzY29wZSwgY2hpbGQsIHBhcmFtLnR5cGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXBhcmFtLm9wdGlvbmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVycmFmb3JtIGZ1bmN0aW9uIGNhbGwgdG8gXCIke25hbWV9XCIgaXMgbm90IHZhbGlkISBQYXJhbWV0ZXIgYXQgaW5kZXggJHtpZHh9IG9mIHR5cGUgJHtcbiAgICAgICAgICAgIHBhcmFtLnR5cGVcbiAgICAgICAgICB9IGlzIG5vdCBvcHRpb25hbCBidXQgcmVjZWl2ZWQgbm8gdmFsdWUuIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRmQXN0LmNoaWxkcmVuLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHJldHVyblR5cGUgPSBtYXBwaW5nLnJldHVyblR5cGU7XG5cbiAgY29uc3QgY2FsbEV4cHJlc3Npb24gPSB0LmNhbGxFeHByZXNzaW9uKGNhbGxlZSwgYXJncyk7XG5cbiAgcmV0dXJuIGNvZXJjZVR5cGUoXG4gICAgLy8gVE9ETzogc2NvcGUgc2hvdWxkIGJlIHBhc3NlZCBpbnN0ZWFkLCBldmVuIGlmIGNvZXJjZVR5cGUgd29uJ3QgbmVlZCBpdCBwcm9iYWJseVxuICAgIHtcbiAgICAgIGNvbnN0cnVjdHM6IG5ldyBTZXQoKSxcbiAgICAgIGhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb246IGZhbHNlLFxuICAgICAgcHJvdmlkZXJHZW5lcmF0b3I6IHt9LFxuICAgICAgcHJvdmlkZXJTY2hlbWE6IHt9LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIG5vZGVJZHM6IFtdLFxuICAgICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgICAgdG9wTGV2ZWxDb25maWc6IHt9LFxuICAgIH0sXG4gICAgY2FsbEV4cHJlc3Npb24sXG4gICAgcmV0dXJuVHlwZSxcbiAgICB0YXJnZXRUeXBlLFxuICApO1xufVxuIl19
|