@cdktn/hcl2cdk 0.23.0-pre.8 → 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
package/build/index.js ADDED
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.attributeNameToCdktfName = exports.isRegistryModule = exports.convertProject = exports.getTerraformConfigFromDir = exports.convert = exports.convertToTypescript = exports.parseProviderRequirements = exports.getParsedHcl = exports.CODE_MARKER = void 0;
30
+ // Copyright (c) HashiCorp, Inc
31
+ // SPDX-License-Identifier: MPL-2.0
32
+ const hcl2json_1 = require("@cdktn/hcl2json");
33
+ const provider_generator_1 = require("@cdktn/provider-generator");
34
+ Object.defineProperty(exports, "isRegistryModule", { enumerable: true, get: function () { return provider_generator_1.isRegistryModule; } });
35
+ const t = __importStar(require("@babel/types"));
36
+ const prettier_1 = __importDefault(require("prettier"));
37
+ const path = __importStar(require("path"));
38
+ const glob = __importStar(require("glob"));
39
+ const fs = __importStar(require("fs"));
40
+ const graphology_1 = require("graphology");
41
+ const rosetta = __importStar(require("jsii-rosetta"));
42
+ const schema_1 = require("./schema");
43
+ const references_1 = require("./references");
44
+ const generation_1 = require("./generation");
45
+ const iteration_1 = require("./iteration");
46
+ const provider_1 = require("./provider");
47
+ const utils_1 = require("./utils");
48
+ const generation_2 = require("./generation");
49
+ Object.defineProperty(exports, "attributeNameToCdktfName", { enumerable: true, get: function () { return generation_2.attributeNameToCdktfName; } });
50
+ const jsii_rosetta_workarounds_1 = require("./jsii-rosetta-workarounds");
51
+ const iteration_2 = require("./iteration");
52
+ exports.CODE_MARKER = "// define resources here";
53
+ async function getParsedHcl(hcl) {
54
+ utils_1.logger.debug(`Parsing HCL: ${hcl}`);
55
+ // Get the JSON representation of the HCL
56
+ let json;
57
+ try {
58
+ json = await (0, hcl2json_1.parse)("terraform.tf", hcl);
59
+ }
60
+ catch (err) {
61
+ utils_1.logger.error(`Failed to parse HCL: ${err}`);
62
+ throw new Error(`Error: Could not parse HCL, this means either that the HCL passed is invalid or that you found a bug. If the HCL seems valid, please file a bug under https://cdk.tf/bugs/new/convert`);
63
+ }
64
+ // Ensure the JSON representation matches the expected structure
65
+ let plan;
66
+ try {
67
+ plan = schema_1.schema.parse(json);
68
+ }
69
+ catch (err) {
70
+ throw new Error(`Error: HCL-JSON does not conform to schema. This is not expected, please file a bug under https://cdk.tf/bugs/new/convert
71
+ Please include this information:
72
+ ${JSON.stringify(err.errors)}`);
73
+ }
74
+ return plan;
75
+ }
76
+ exports.getParsedHcl = getParsedHcl;
77
+ async function parseProviderRequirements(hcl) {
78
+ utils_1.logger.debug("Parsing provider requirements");
79
+ const plan = await getParsedHcl(hcl);
80
+ return (0, provider_1.getProviderRequirements)(plan);
81
+ }
82
+ exports.parseProviderRequirements = parseProviderRequirements;
83
+ async function convertToTypescript(hcl, providerSchema, codeContainer) {
84
+ var _a;
85
+ utils_1.logger.debug("Converting to typescript");
86
+ const plan = await getParsedHcl(hcl);
87
+ // Each key in the scope needs to be unique, therefore we save them in a set
88
+ // Each variable needs to be unique as well, we save them in a record so we can identify if two variables are the same
89
+ const scope = {
90
+ providerSchema,
91
+ providerGenerator: Object.keys(providerSchema.provider_schemas || {}).reduce((carry, fqpn) => {
92
+ const providerGenerator = new provider_generator_1.TerraformProviderGenerator(new provider_generator_1.CodeMaker(), providerSchema);
93
+ providerGenerator.buildResourceModels(fqpn); // can't use that type on the keys yet, since we are not on TS >=4.4 yet :sadcat:
94
+ return { ...carry, [fqpn]: providerGenerator };
95
+ }, {}),
96
+ constructs: new Set(),
97
+ variables: {},
98
+ hasTokenBasedTypeCoercion: false,
99
+ nodeIds: [],
100
+ importables: [],
101
+ topLevelConfig: {},
102
+ };
103
+ const graph = new graphology_1.DirectedGraph();
104
+ // Get all items in the JSON as a map of id to function that generates the AST
105
+ // We will use this to construct the nodes for a dependency graph
106
+ // We need to use a function here because the same node has different representation based on if it's referenced by another one
107
+ const nodeMap = {
108
+ ...(0, iteration_1.forEachProvider)(scope, plan.provider, generation_1.provider),
109
+ ...(0, iteration_1.forEachGlobal)(scope, "var", plan.variable, generation_1.variable),
110
+ // locals are a special case
111
+ ...(0, iteration_1.forEachGlobal)(scope, "local", Array.isArray(plan.locals)
112
+ ? plan.locals.reduce((carry, locals) => ({ ...carry, ...locals }), {})
113
+ : {}, generation_1.local),
114
+ ...(0, iteration_1.forEachGlobal)(scope, "out", plan.output, generation_1.output),
115
+ ...(0, iteration_1.forEachGlobal)(scope, "module", plan.module, generation_1.modules),
116
+ ...(0, iteration_2.forEachImport)(scope, "import", plan.import, generation_1.imports),
117
+ ...(0, iteration_1.forEachNamespaced)(scope, plan.resource, generation_1.resource),
118
+ ...(0, iteration_1.forEachNamespaced)(scope, plan.data, generation_1.resource, "data"),
119
+ };
120
+ // Add all nodes to the dependency graph so we can detect if an edge is added for an unknown link
121
+ Object.entries(nodeMap).forEach(([key, value]) => {
122
+ utils_1.logger.debug(`Adding node '${key}' to graph`);
123
+ graph.addNode(key, value);
124
+ });
125
+ // Finding references becomes easier of the to be referenced ids are already known
126
+ const nodeIds = Object.keys(nodeMap);
127
+ scope.nodeIds = nodeIds;
128
+ async function addEdges(id, value) {
129
+ (await (0, references_1.findUsedReferences)(nodeIds, value)).forEach((ref) => {
130
+ if (!graph.hasDirectedEdge(ref.referencee.id, id) &&
131
+ graph.hasNode(ref.referencee.id) // in case the referencee is a dynamic variable
132
+ ) {
133
+ if (!graph.hasNode(id)) {
134
+ throw new Error(`The dependency graph is expected to link from ${ref.referencee.id} to ${id} but ${id} does not exist.
135
+ These nodes exist: ${graph.nodes().join("\n")}`);
136
+ }
137
+ // The graph should have no self-references
138
+ if (id === ref.referencee.id) {
139
+ utils_1.logger.debug(`Skipping self-reference for ${id}`);
140
+ return;
141
+ }
142
+ utils_1.logger.debug(`Adding edge from ${ref.referencee.id} to ${id}`);
143
+ graph.addDirectedEdge(ref.referencee.id, id, { ref });
144
+ }
145
+ });
146
+ }
147
+ // We recursively inspect each resource value to find references to other values
148
+ // We add these to a dependency graph so that the programming code has the right order
149
+ async function addGlobalEdges(_scope, _key, id, value) {
150
+ await addEdges(id, value);
151
+ }
152
+ async function addProviderEdges(_scope, _key, id, value) {
153
+ await addEdges(id, value);
154
+ }
155
+ async function addNamespacedEdges(_scope, _type, _key, id, value) {
156
+ await addEdges(id, value);
157
+ }
158
+ await Promise.all(Object.values({
159
+ ...(0, iteration_1.forEachProvider)(scope, plan.provider, addProviderEdges),
160
+ ...(0, iteration_1.forEachGlobal)(scope, "var", plan.variable, addGlobalEdges),
161
+ // locals are a special case
162
+ ...(0, iteration_1.forEachGlobal)(scope, "local", Array.isArray(plan.locals)
163
+ ? plan.locals.reduce((carry, locals) => ({ ...carry, ...locals }), {})
164
+ : {}, addGlobalEdges),
165
+ ...(0, iteration_1.forEachGlobal)(scope, "out", plan.output, addGlobalEdges),
166
+ ...(0, iteration_1.forEachGlobal)(scope, "module", plan.module, addGlobalEdges),
167
+ ...(0, iteration_1.forEachNamespaced)(scope, plan.resource, addNamespacedEdges),
168
+ ...(0, iteration_1.forEachNamespaced)(scope, plan.data, addNamespacedEdges, "data"),
169
+ }).map(({ code: addEdgesToGraph }) => addEdgesToGraph(graph)));
170
+ utils_1.logger.debug(`Graph: ${JSON.stringify(graph, null, 2)}`);
171
+ utils_1.logger.debug(`Starting to assemble the typescript code`);
172
+ // We traverse the dependency graph to get the unordered JSON nodes into an ordered array
173
+ // where no node is referenced before it's defined
174
+ // As we check that the nodes on both ends of an edge exist we can be sure
175
+ // that no infinite loop exists, there can be no stray dependency on a node
176
+ const expressions = [];
177
+ let nodesToVisit = [...nodeIds];
178
+ // This ensures we detect cycles and don't end up in an endless loop
179
+ let nodesVisitedThisIteration = 0;
180
+ do {
181
+ nodesVisitedThisIteration = 0;
182
+ // Find next nodes to visit
183
+ const nodeExpressionGenerators = graph.mapNodes((nodeId, { code }) => {
184
+ if (!nodesToVisit.includes(nodeId)) {
185
+ return undefined;
186
+ }
187
+ const unresolvedDependencies = graph
188
+ .inNeighbors(nodeId)
189
+ .filter((item) => nodesToVisit.includes(item));
190
+ if (unresolvedDependencies.length === 0) {
191
+ nodesToVisit = nodesToVisit.filter((id) => nodeId !== id);
192
+ nodesVisitedThisIteration = nodesVisitedThisIteration + 1;
193
+ utils_1.logger.debug(`Visiting node ${nodeId}`);
194
+ return code;
195
+ }
196
+ return undefined;
197
+ });
198
+ // Generate the code for the nodes
199
+ for (const code of nodeExpressionGenerators) {
200
+ if (code) {
201
+ expressions.push(...(await code(graph)));
202
+ }
203
+ }
204
+ utils_1.logger.debug(`${nodesToVisit.length} unvisited nodes: ${nodesToVisit.join(", ")}`);
205
+ } while (nodesToVisit.length > 0 && nodesVisitedThisIteration != 0);
206
+ if (nodesToVisit.length > 0) {
207
+ throw new Error(`There are ${nodesToVisit.length} terraform elements that could not be visited.
208
+ This is likely due to a cycle in the dependency graph.
209
+ These nodes are: ${nodesToVisit.join(", ")}`);
210
+ }
211
+ utils_1.logger.debug(`${nodesToVisit.length} unvisited nodes: ${nodesToVisit.join(", ")}`);
212
+ const backendExpressions = (await Promise.all(((_a = plan.terraform) === null || _a === void 0 ? void 0 : _a.map((terraform) => (0, generation_1.backendToExpression)(scope, terraform.backend))) || [Promise.resolve([])])).reduce((carry, item) => [...carry, ...item], []);
213
+ utils_1.logger.debug(`Using these backend expressions: ${JSON.stringify(backendExpressions, null, 2)}`);
214
+ // We collect all module sources
215
+ const moduleRequirements = [
216
+ ...new Set(Object.values(plan.module || {}).reduce((carry, moduleBlock) => [
217
+ ...carry,
218
+ ...moduleBlock.reduce((arr, { source, version }) => [
219
+ ...arr,
220
+ version ? `${source}@${version}` : source,
221
+ ], []),
222
+ ], []) || []),
223
+ ];
224
+ utils_1.logger.debug(`Found these modules: ${JSON.stringify(moduleRequirements, null, 2)}`);
225
+ if (Object.keys(plan.variable || {}).length > 0 && expressions.length > 0) {
226
+ expressions[0] = t.addComment(expressions[0], "leading", `Terraform Variables are not always the best fit for getting inputs in the context of Terraform CDK.
227
+ You can read more about this at https://cdk.tf/variables`);
228
+ }
229
+ const providerRequirements = (0, provider_1.getProviderRequirements)(plan);
230
+ utils_1.logger.debug(`Found these provider requirements: ${JSON.stringify(providerRequirements, null, 2)}`);
231
+ // We add a comment if there are providers with missing schema information
232
+ const providersLackingSchema = Object.keys(providerRequirements).filter((providerName) => providerName !== "terraform" &&
233
+ !Object.keys(providerSchema.provider_schemas || {}).some((schemaName) => schemaName.endsWith(providerName)));
234
+ utils_1.logger.debug(`${providersLackingSchema.length} providers lack schema information: ${providersLackingSchema.join(", ")}`);
235
+ if (providersLackingSchema.length > 0) {
236
+ expressions[0] = t.addComment(expressions[0], "leading", `The following providers are missing schema information and might need manual adjustments to synthesize correctly: ${providersLackingSchema.join(", ")}.
237
+ For a more precise conversion please use the --provider flag in convert.`);
238
+ }
239
+ // Always add constructs
240
+ scope.importables.push({
241
+ constructName: "Construct",
242
+ provider: "constructs",
243
+ });
244
+ if (scope.hasTokenBasedTypeCoercion) {
245
+ scope.importables.push({
246
+ constructName: "Token",
247
+ provider: "cdktn",
248
+ });
249
+ }
250
+ // Add specific import for codeContainer
251
+ (0, generation_1.addImportForCodeContainer)(scope, codeContainer);
252
+ const constructImports = (0, generation_1.buildImports)(scope.importables);
253
+ const code = [...(backendExpressions || []), ...expressions];
254
+ const configTypeName = Object.keys(scope.topLevelConfig).length > 0 ? "MyConfig" : undefined;
255
+ const classConfig = configTypeName
256
+ ? [(0, generation_1.generateConfigType)(configTypeName, scope.topLevelConfig)]
257
+ : [];
258
+ // We split up the generated code so that users can have more control over what to insert where
259
+ return {
260
+ // TODO: Remove imports and code because rosetta won't be able to translate them
261
+ all: await (0, generation_1.gen)([
262
+ ...constructImports,
263
+ ...(0, generation_1.moduleImports)(plan.module),
264
+ ...classConfig,
265
+ (0, generation_1.wrapCodeInConstructor)(codeContainer, code, "MyConvertedCode", configTypeName),
266
+ ]),
267
+ imports: await (0, generation_1.gen)([...constructImports, ...(0, generation_1.moduleImports)(plan.module)]),
268
+ code: await (0, generation_1.gen)(code),
269
+ providers: Object.entries(providerRequirements).map(([source, version]) => version === "*" ? source : `${source}@${version}`),
270
+ modules: moduleRequirements,
271
+ // We track some usage data to make it easier to understand what is used
272
+ stats: {
273
+ numberOfModules: moduleRequirements.length,
274
+ numberOfProviders: Object.keys(providerRequirements).length,
275
+ resources: (0, iteration_1.resourceStats)(plan.resource || {}),
276
+ data: (0, iteration_1.resourceStats)(plan.data || {}),
277
+ convertedLines: hcl.split("\n").length,
278
+ },
279
+ };
280
+ }
281
+ exports.convertToTypescript = convertToTypescript;
282
+ const translators = {
283
+ python: {
284
+ visitor: () => new rosetta.PythonVisitor(),
285
+ postTranslationMutation: jsii_rosetta_workarounds_1.replacePythonImports,
286
+ },
287
+ java: {
288
+ visitor: () => new rosetta.JavaVisitor(),
289
+ postTranslationMutation: jsii_rosetta_workarounds_1.replaceJavaImports,
290
+ },
291
+ csharp: {
292
+ visitor: () => new rosetta.CSharpVisitor(),
293
+ postTranslationMutation: jsii_rosetta_workarounds_1.replaceCsharpImports,
294
+ },
295
+ go: {
296
+ visitor: () => new rosetta.GoVisitor(),
297
+ postTranslationMutation: jsii_rosetta_workarounds_1.replaceGoImports,
298
+ },
299
+ };
300
+ function translatorForLanguage(language) {
301
+ return (file, throwOnTranslationError) => {
302
+ const { visitor, postTranslationMutation } = translators[language];
303
+ const { translation, diagnostics } = rosetta.translateTypeScript(file, visitor(), throwOnTranslationError ? { includeCompilerDiagnostics: true } : {});
304
+ if (throwOnTranslationError &&
305
+ diagnostics.filter((diag) => diag.isError).length > 0) {
306
+ utils_1.logger.debug(`Could not translate TS to ${language}:\n${file.contents}`);
307
+ throw new Error(`Could not translate TS to ${language}: ${diagnostics
308
+ .map((diag) => diag.formattedMessage)
309
+ .join("\n")}`);
310
+ }
311
+ return postTranslationMutation(translation);
312
+ };
313
+ }
314
+ async function convert(hcl, { language, providerSchema, throwOnTranslationError = false, codeContainer = "cdktn.TerraformStack", }) {
315
+ const fileName = "terraform.tf";
316
+ const translater = language === "typescript"
317
+ ? (file, _throwOnTranslationError) => file.contents
318
+ : translatorForLanguage(language);
319
+ if (!translater) {
320
+ throw new Error("Unsupported language used: " + language);
321
+ }
322
+ const tsCode = await convertToTypescript(hcl, providerSchema, codeContainer);
323
+ return {
324
+ ...tsCode,
325
+ all: translater({ fileName, contents: tsCode.all }, throwOnTranslationError),
326
+ imports: translater({ fileName, contents: tsCode.imports }, false),
327
+ code: translater({ fileName, contents: tsCode.code }, false),
328
+ stats: { ...tsCode.stats, language },
329
+ };
330
+ }
331
+ exports.convert = convert;
332
+ function getTerraformConfigFromDir(importPath) {
333
+ const absPath = path.resolve(importPath);
334
+ const fileContents = glob
335
+ .sync("./*.tf", { cwd: absPath })
336
+ .map((p) => fs.readFileSync(path.resolve(absPath, p), "utf8"));
337
+ return fileContents.join("\n");
338
+ }
339
+ exports.getTerraformConfigFromDir = getTerraformConfigFromDir;
340
+ async function convertProject(combinedHcl, { language, providerSchema }) {
341
+ if (language !== "typescript") {
342
+ throw new Error("Unsupported language used: " + language);
343
+ }
344
+ const { imports, code, providers, modules: tfModules, stats, } = await convert(combinedHcl, {
345
+ language,
346
+ providerSchema,
347
+ });
348
+ return {
349
+ code: (inputMainFile) => {
350
+ const importMainFile = [imports, inputMainFile].join("\n");
351
+ const outputMainFile = importMainFile.replace(exports.CODE_MARKER, code);
352
+ return prettier_1.default.format(outputMainFile, { parser: "babel" });
353
+ },
354
+ cdktfJson: (inputCdktfJson) => {
355
+ const cdktfJson = { ...inputCdktfJson };
356
+ cdktfJson.terraformProviders = providers;
357
+ cdktfJson.terraformModules = tfModules;
358
+ return cdktfJson;
359
+ },
360
+ stats,
361
+ };
362
+ }
363
+ exports.convertProject = convertProject;
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDhDQUF3QztBQUN4QyxrRUFJbUM7QUFna0IxQixpR0Fua0JQLHFDQUFnQixPQW1rQk87QUE5akJ6QixnREFBa0M7QUFDbEMsd0RBQWdDO0FBQ2hDLDJDQUE2QjtBQUM3QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBQ3pCLDJDQUEyQztBQUMzQyxzREFBd0M7QUFHeEMscUNBQWtDO0FBQ2xDLDZDQUFrRDtBQUNsRCw2Q0Flc0I7QUFFdEIsMkNBS3FCO0FBQ3JCLHlDQUFxRDtBQUNyRCxtQ0FBaUM7QUFFakMsNkNBQXdEO0FBeWhCN0IseUdBemhCbEIscUNBQXdCLE9BeWhCa0I7QUF4aEJuRCx5RUFLb0M7QUFFcEMsMkNBQTRDO0FBRS9CLFFBQUEsV0FBVyxHQUFHLDBCQUEwQixDQUFDO0FBRS9DLEtBQUssVUFBVSxZQUFZLENBQUMsR0FBVztJQUM1QyxjQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLHlDQUF5QztJQUN6QyxJQUFJLElBQTZCLENBQUM7SUFDbEMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxHQUFHLE1BQU0sSUFBQSxnQkFBSyxFQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLGNBQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDYix1TEFBdUwsQ0FDeEwsQ0FBQztJQUNKLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsSUFBSSxJQUE0QixDQUFDO0lBQ2pDLElBQUksQ0FBQztRQUNILElBQUksR0FBRyxlQUFNLENBQUMs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LEVBQUU7WUFDdkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ3hDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDekMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztZQUN2QyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsS0FBSztLQUNOLENBQUM7QUFDSixDQUFDO0FBakNELHdDQWlDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCJAY2RrdG4vaGNsMmpzb25cIjtcbmltcG9ydCB7XG4gIGlzUmVnaXN0cnlNb2R1bGUsXG4gIFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yLFxuICBDb2RlTWFrZXIsXG59IGZyb20gXCJAY2RrdG4vcHJvdmlkZXItZ2VuZXJhdG9yXCI7XG5cbmltcG9ydCAqIGFzIHQgZnJvbSBcIkBiYWJlbC90eXBlc1wiO1xuaW1wb3J0IHByZXR0aWVyIGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgZ2xvYiBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBEaXJlY3RlZEdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcbmltcG9ydCAqIGFzIHJvc2V0dGEgZnJvbSBcImpzaWktcm9zZXR0YVwiO1xuaW1wb3J0ICogYXMgeiBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHsgZmluZFVzZWRSZWZlcmVuY2VzIH0gZnJvbSBcIi4vcmVmZXJlbmNlc1wiO1xuaW1wb3J0IHtcbiAgYmFja2VuZFRvRXhwcmVzc2lvbixcbiAgZ2VuLFxuICBsb2NhbCxcbiAgbW9kdWxlSW1wb3J0cyxcbiAgbW9kdWxlcyxcbiAgb3V0cHV0LFxuICBwcm92aWRlcixcbiAgcmVzb3VyY2UsXG4gIHZhcmlhYmxlLFxuICB3cmFwQ29kZUluQ29uc3RydWN0b3IsXG4gIGFkZEltcG9ydEZvckNvZGVDb250YWluZXIsXG4gIGJ1aWxkSW1wb3J0cyxcbiAgZ2VuZXJhdGVDb25maWdUeXBlLFxuICBpbXBvcnRzLFxufSBmcm9tIFwiLi9nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1SZXNvdXJjZUJsb2NrLCBQcm9ncmFtU2NvcGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZm9yRWFjaFByb3ZpZGVyLFxuICBmb3JFYWNoR2xvYmFsLFxuICBmb3JFYWNoTmFtZXNwYWNlZCxcbiAgcmVzb3VyY2VTdGF0cyxcbn0gZnJvbSBcIi4vaXRlcmF0aW9uXCI7XG5pbXBvcnQgeyBnZXRQcm92aWRlclJlcXVpcmVtZW50cyB9IGZyb20gXCIuL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgRlFQTiB9IGZyb20gXCJAY2RrdG4vcHJvdmlkZXItc2NoZW1hXCI7XG5pbXBvcnQgeyBhdHRyaWJ1dGVOYW1lVG9DZGt0Zk5hbWUgfSBmcm9tIFwiLi9nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICByZXBsYWNlQ3NoYXJwSW1wb3J0cyxcbiAgcmVwbGFjZUdvSW1wb3J0cyxcbiAgcmVwbGFjZUphdmFJbXBvcnRzLFxuICByZXBsYWNlUHl0aG9uSW1wb3J0cyxcbn0gZnJvbSBcIi4vanNpaS1yb3NldHRhLXdvcmthcm91bmRzXCI7XG5pbXBvcnQgeyBQcm92aWRlclNjaGVtYSB9IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgZm9yRWFjaEltcG9ydCB9IGZyb20gXCIuL2l0ZXJhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgQ09ERV9NQVJLRVIgPSBcIi8vIGRlZmluZSByZXNvdXJjZXMgaGVyZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFyc2VkSGNsKGhjbDogc3RyaW5nKSB7XG4gIGxvZ2dlci5kZWJ1ZyhgUGFyc2luZyBIQ0w6ICR7aGNsfWApO1xuICAvLyBHZXQgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIEhDTFxuICBsZXQganNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAganNvbiA9IGF3YWl0IHBhcnNlKFwidGVycmFmb3JtLnRmXCIsIGhjbCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIEhDTDogJHtlcnJ9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yOiBDb3VsZCBub3QgcGFyc2UgSENMLCB0aGlzIG1lYW5zIGVpdGhlciB0aGF0IHRoZSBIQ0wgcGFzc2VkIGlzIGludmFsaWQgb3IgdGhhdCB5b3UgZm91bmQgYSBidWcuIElmIHRoZSBIQ0wgc2VlbXMgdmFsaWQsIHBsZWFzZSBmaWxlIGEgYnVnIHVuZGVyIGh0dHBzOi8vY2RrLnRmL2J1Z3MvbmV3L2NvbnZlcnRgLFxuICAgICk7XG4gIH1cblxuICAvLyBFbnN1cmUgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgc3RydWN0dXJlXG4gIGxldCBwbGFuOiB6LmluZmVyPHR5cGVvZiBzY2hlbWE+O1xuICB0cnkge1xuICAgIHBsYW4gPSBzY2hlbWEucGFyc2UoanNvbik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IEhDTC1KU09OIGRvZXMgbm90IGNvbmZvcm0gdG8gc2NoZW1hLiBUaGlzIGlzIG5vdCBleHBlY3RlZCwgcGxlYXNlIGZpbGUgYSBidWcgdW5kZXIgaHR0cHM6Ly9jZGsudGYvYnVncy9uZXcvY29udmVydFxuUGxlYXNlIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbjpcbiR7SlNPTi5zdHJpbmdpZnkoKGVyciBhcyB6LlpvZEVycm9yKS5lcnJvcnMpfWApO1xuICB9XG5cbiAgcmV0dXJuIHBsYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVByb3ZpZGVyUmVxdWlyZW1lbnRzKGhjbDogc3RyaW5nKSB7XG4gIGxvZ2dlci5kZWJ1ZyhcIlBhcnNpbmcgcHJvdmlkZXIgcmVxdWlyZW1lbnRzXCIpO1xuICBjb25zdCBwbGFuID0gYXdhaXQgZ2V0UGFyc2VkSGNsKGhjbCk7XG4gIHJldHVybiBnZXRQcm92aWRlclJlcXVpcmVtZW50cyhwbGFuKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRUb1R5cGVzY3JpcHQoXG4gIGhjbDogc3RyaW5nLFxuICBwcm92aWRlclNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIGNvZGVDb250YWluZXI6IHN0cmluZyxcbikge1xuICBsb2dnZXIuZGVidWcoXCJDb252ZXJ0aW5nIHRvIHR5cGVzY3JpcHRcIik7XG4gIGNvbnN0IHBsYW4gPSBhd2FpdCBnZXRQYXJzZWRIY2woaGNsKTtcblxuICAvLyBFYWNoIGtleSBpbiB0aGUgc2NvcGUgbmVlZHMgdG8gYmUgdW5pcXVlLCB0aGVyZWZvcmUgd2Ugc2F2ZSB0aGVtIGluIGEgc2V0XG4gIC8vIEVhY2ggdmFyaWFibGUgbmVlZHMgdG8gYmUgdW5pcXVlIGFzIHdlbGwsIHdlIHNhdmUgdGhlbSBpbiBhIHJlY29yZCBzbyB3ZSBjYW4gaWRlbnRpZnkgaWYgdHdvIHZhcmlhYmxlcyBhcmUgdGhlIHNhbWVcbiAgY29uc3Qgc2NvcGU6IFByb2dyYW1TY29wZSA9IHtcbiAgICBwcm92aWRlclNjaGVtYSxcbiAgICBwcm92aWRlckdlbmVyYXRvcjogT2JqZWN0LmtleXMoXG4gICAgICBwcm92aWRlclNjaGVtYS5wcm92aWRlcl9zY2hlbWFzIHx8IHt9LFxuICAgICkucmVkdWNlKChjYXJyeSwgZnFwbikgPT4ge1xuICAgICAgY29uc3QgcHJvdmlkZXJHZW5lcmF0b3IgPSBuZXcgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IoXG4gICAgICAgIG5ldyBDb2RlTWFrZXIoKSxcbiAgICAgICAgcHJvdmlkZXJTY2hlbWEsXG4gICAgICApO1xuICAgICAgcHJvdmlkZXJHZW5lcmF0b3IuYnVpbGRSZXNvdXJjZU1vZGVscyhmcXBuIGFzIEZRUE4pOyAvLyBjYW4ndCB1c2UgdGhhdCB0eXBlIG9uIHRoZSBrZXlzIHlldCwgc2luY2Ugd2UgYXJlIG5vdCBvbiBUUyA+PTQuNCB5ZXQgOnNhZGNhdDpcbiAgICAgIHJldHVybiB7IC4uLmNhcnJ5LCBbZnFwbl06IHByb3ZpZGVyR2VuZXJhdG9yIH07XG4gICAgfSwge30pLFxuICAgIGNvbnN0cnVjdHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIHZhcmlhYmxlczoge30sXG4gICAgaGFzVG9rZW5CYXNlZFR5cGVDb2VyY2lvbjogZmFsc2UsXG4gICAgbm9kZUlkczogW10sXG4gICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgIHRvcExldmVsQ29uZmlnOiB7fSxcbiAgfTtcblxuICBjb25zdCBncmFwaCA9IG5ldyBEaXJlY3RlZEdyYXBoPHtcbiAgICBjb2RlOiAoXG4gICAgICBnOiBEaXJlY3RlZEdyYXBoPGFueT4sXG4gICAgKSA9PiBQcm9taXNlPEFycmF5PHQuU3RhdGVtZW50IHwgdC5WYXJpYWJsZURlY2xhcmF0aW9uPj47XG4gIH0+KCk7XG5cbiAgLy8gR2V0IGFsbCBpdGVtcyBpbiB0aGUgSlNPTiBhcyBhIG1hcCBvZiBpZCB0byBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyB0aGUgQVNUXG4gIC8vIFdlIHdpbGwgdXNlIHRoaXMgdG8gY29uc3RydWN0IHRoZSBub2RlcyBmb3IgYSBkZXBlbmRlbmN5IGdyYXBoXG4gIC8vIFdlIG5lZWQgdG8gdXNlIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlIHRoZSBzYW1lIG5vZGUgaGFzIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiBpZiBpdCdzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvbmVcbiAgY29uc3Qgbm9kZU1hcDogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBjb2RlOiAoXG4gICAgICAgIGc6IHR5cGVvZiBncmFwaCxcbiAgICAgICkgPT4gUHJvbWlzZTxBcnJheTx0LlN0YXRlbWVudCB8IHQuVmFyaWFibGVEZWNsYXJhdGlvbj4+O1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgfVxuICA+ID0ge1xuICAgIC4uLmZvckVhY2hQcm92aWRlcihzY29wZSwgcGxhbi5wcm92aWRlciwgcHJvdmlkZXIpLFxuICAgIC4uLmZvckVhY2hHbG9iYWwoc2NvcGUsIFwidmFyXCIsIHBsYW4udmFyaWFibGUsIHZhcmlhYmxlKSxcbiAgICAvLyBsb2NhbHMgYXJlIGEgc3BlY2lhbCBjYXNlXG4gICAgLi4uZm9yRWFjaEdsb2JhbChcbiAgICAgIHNjb3BlLFxuICAgICAgXCJsb2NhbFwiLFxuICAgICAgQXJyYXkuaXNBcnJheShwbGFuLmxvY2FscylcbiAgICAgICAgPyBwbGFuLmxvY2Fscy5yZWR1Y2UoKGNhcnJ5LCBsb2NhbHMpID0+ICh7IC4uLmNhcnJ5LCAuLi5sb2NhbHMgfSksIHt9KVxuICAgICAgICA6IHt9LFxuICAgICAgbG9jYWwsXG4gICAgKSxcbiAgICAuLi5mb3JFYWNoR2xvYmFsKHNjb3BlLCBcIm91dFwiLCBwbGFuLm91dHB1dCwgb3V0cHV0KSxcbiAgICAuLi5mb3JFYWNoR2xvYmFsKHNjb3BlLCBcIm1vZHVsZVwiLCBwbGFuLm1vZHVsZSwgbW9kdWxlcyksXG4gICAgLi4uZm9yRWFjaEltcG9ydChzY29wZSwgXCJpbXBvcnRcIiwgcGxhbi5pbXBvcnQsIGltcG9ydHMpLFxuICAgIC4uLmZvckVhY2hOYW1lc3BhY2VkKHNjb3BlLCBwbGFuLnJlc291cmNlLCByZXNvdXJjZSksXG4gICAgLi4uZm9yRWFjaE5hbWVzcGFjZWQoc2NvcGUsIHBsYW4uZGF0YSwgcmVzb3VyY2UsIFwiZGF0YVwiKSxcbiAgfTtcblxuICAvLyBBZGQgYWxsIG5vZGVzIHRvIHRoZSBkZXBlbmRlbmN5IGdyYXBoIHNvIHdlIGNhbiBkZXRlY3QgaWYgYW4gZWRnZSBpcyBhZGRlZCBmb3IgYW4gdW5rbm93biBsaW5rXG4gIE9iamVjdC5lbnRyaWVzKG5vZGVNYXApLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQWRkaW5nIG5vZGUgJyR7a2V5fScgdG8gZ3JhcGhgKTtcbiAgICBncmFwaC5hZGROb2RlKGtleSwgdmFsdWUpO1xuICB9KTtcblxuICAvLyBGaW5kaW5nIHJlZmVyZW5jZXMgYmVjb21lcyBlYXNpZXIgb2YgdGhlIHRvIGJlIHJlZmVyZW5jZWQgaWRzIGFyZSBhbHJlYWR5IGtub3duXG4gIGNvbnN0IG5vZGVJZHMgPSBPYmplY3Qua2V5cyhub2RlTWFwKTtcbiAgc2NvcGUubm9kZUlkcyA9IG5vZGVJZHM7XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZEVkZ2VzKGlkOiBzdHJpbmcsIHZhbHVlOiBUZXJyYWZvcm1SZXNvdXJjZUJsb2NrKSB7XG4gICAgKGF3YWl0IGZpbmRVc2VkUmVmZXJlbmNlcyhub2RlSWRzLCB2YWx1ZSkpLmZvckVhY2goKHJlZikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ3JhcGguaGFzRGlyZWN0ZWRFZGdlKHJlZi5yZWZlcmVuY2VlLmlkLCBpZCkgJiZcbiAgICAgICAgZ3JhcGguaGFzTm9kZShyZWYucmVmZXJlbmNlZS5pZCkgLy8gaW4gY2FzZSB0aGUgcmVmZXJlbmNlZSBpcyBhIGR5bmFtaWMgdmFyaWFibGVcbiAgICAgICkge1xuICAgICAgICBpZiAoIWdyYXBoLmhhc05vZGUoaWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBkZXBlbmRlbmN5IGdyYXBoIGlzIGV4cGVjdGVkIHRvIGxpbmsgZnJvbSAke1xuICAgICAgICAgICAgICByZWYucmVmZXJlbmNlZS5pZFxuICAgICAgICAgICAgfSB0byAke2lkfSBidXQgJHtpZH0gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAgICBUaGVzZSBub2RlcyBleGlzdDogJHtncmFwaC5ub2RlcygpLmpvaW4oXCJcXG5cIil9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGdyYXBoIHNob3VsZCBoYXZlIG5vIHNlbGYtcmVmZXJlbmNlc1xuICAgICAgICBpZiAoaWQgPT09IHJlZi5yZWZlcmVuY2VlLmlkKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBTa2lwcGluZyBzZWxmLXJlZmVyZW5jZSBmb3IgJHtpZH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZGVidWcoYEFkZGluZyBlZGdlIGZyb20gJHtyZWYucmVmZXJlbmNlZS5pZH0gdG8gJHtpZH1gKTtcbiAgICAgICAgZ3JhcGguYWRkRGlyZWN0ZWRFZGdlKHJlZi5yZWZlcmVuY2VlLmlkLCBpZCwgeyByZWYgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXZSByZWN1cnNpdmVseSBpbnNwZWN0IGVhY2ggcmVzb3VyY2UgdmFsdWUgdG8gZmluZCByZWZlcmVuY2VzIHRvIG90aGVyIHZhbHVlc1xuICAvLyBXZSBhZGQgdGhlc2UgdG8gYSBkZXBlbmRlbmN5IGdyYXBoIHNvIHRoYXQgdGhlIHByb2dyYW1taW5nIGNvZGUgaGFzIHRoZSByaWdodCBvcmRlclxuICBhc3luYyBmdW5jdGlvbiBhZGRHbG9iYWxFZGdlcyhcbiAgICBfc2NvcGU6IFByb2dyYW1TY29wZSxcbiAgICBfa2V5OiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB2YWx1ZTogVGVycmFmb3JtUmVzb3VyY2VCbG9jayxcbiAgKSB7XG4gICAgYXdhaXQgYWRkRWRnZXMoaWQsIHZhbHVlKTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBhZGRQcm92aWRlckVkZ2VzKFxuICAgIF9zY29wZTogUHJvZ3JhbVNjb3BlLFxuICAgIF9rZXk6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHZhbHVlOiBUZXJyYWZvcm1SZXNvdXJjZUJsb2NrLFxuICApIHtcbiAgICBhd2FpdCBhZGRFZGdlcyhpZCwgdmFsdWUpO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZE5hbWVzcGFjZWRFZGdlcyhcbiAgICBfc2NvcGU6IFByb2dyYW1TY29wZSxcbiAgICBfdHlwZTogc3RyaW5nLFxuICAgIF9rZXk6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHZhbHVlOiBUZXJyYWZvcm1SZXNvdXJjZUJsb2NrLFxuICApIHtcbiAgICBhd2FpdCBhZGRFZGdlcyhpZCwgdmFsdWUpO1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgT2JqZWN0LnZhbHVlcyh7XG4gICAgICAuLi5mb3JFYWNoUHJvdmlkZXIoc2NvcGUsIHBsYW4ucHJvdmlkZXIsIGFkZFByb3ZpZGVyRWRnZXMpLFxuICAgICAgLi4uZm9yRWFjaEdsb2JhbChzY29wZSwgXCJ2YXJcIiwgcGxhbi52YXJpYWJsZSwgYWRkR2xvYmFsRWRnZXMpLFxuICAgICAgLy8gbG9jYWxzIGFyZSBhIHNwZWNpYWwgY2FzZVxuICAgICAgLi4uZm9yRWFjaEdsb2JhbChcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIFwibG9jYWxcIixcbiAgICAgICAgQXJyYXkuaXNBcnJheShwbGFuLmxvY2FscylcbiAgICAgICAgICA/IHBsYW4ubG9jYWxzLnJlZHVjZSgoY2FycnksIGxvY2FscykgPT4gKHsgLi4uY2FycnksIC4uLmxvY2FscyB9KSwge30pXG4gICAgICAgICAgOiB7fSxcbiAgICAgICAgYWRkR2xvYmFsRWRnZXMsXG4gICAgICApLFxuICAgICAgLi4uZm9yRWFjaEdsb2JhbChzY29wZSwgXCJvdXRcIiwgcGxhbi5vdXRwdXQsIGFkZEdsb2JhbEVkZ2VzKSxcbiAgICAgIC4uLmZvckVhY2hHbG9iYWwoc2NvcGUsIFwibW9kdWxlXCIsIHBsYW4ubW9kdWxlLCBhZGRHbG9iYWxFZGdlcyksXG4gICAgICAuLi5mb3JFYWNoTmFtZXNwYWNlZChzY29wZSwgcGxhbi5yZXNvdXJjZSwgYWRkTmFtZXNwYWNlZEVkZ2VzKSxcbiAgICAgIC4uLmZvckVhY2hOYW1lc3BhY2VkKHNjb3BlLCBwbGFuLmRhdGEsIGFkZE5hbWVzcGFjZWRFZGdlcywgXCJkYXRhXCIpLFxuICAgIH0pLm1hcCgoeyBjb2RlOiBhZGRFZGdlc1RvR3JhcGggfSkgPT4gYWRkRWRnZXNUb0dyYXBoKGdyYXBoKSksXG4gICk7XG5cbiAgbG9nZ2VyLmRlYnVnKGBHcmFwaDogJHtKU09OLnN0cmluZ2lmeShncmFwaCwgbnVsbCwgMil9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgU3RhcnRpbmcgdG8gYXNzZW1ibGUgdGhlIHR5cGVzY3JpcHQgY29kZWApO1xuICAvLyBXZSB0cmF2ZXJzZSB0aGUgZGVwZW5kZW5jeSBncmFwaCB0byBnZXQgdGhlIHVub3JkZXJlZCBKU09OIG5vZGVzIGludG8gYW4gb3JkZXJlZCBhcnJheVxuICAvLyB3aGVyZSBubyBub2RlIGlzIHJlZmVyZW5jZWQgYmVmb3JlIGl0J3MgZGVmaW5lZFxuICAvLyBBcyB3ZSBjaGVjayB0aGF0IHRoZSBub2RlcyBvbiBib3RoIGVuZHMgb2YgYW4gZWRnZSBleGlzdCB3ZSBjYW4gYmUgc3VyZVxuICAvLyB0aGF0IG5vIGluZmluaXRlIGxvb3AgZXhpc3RzLCB0aGVyZSBjYW4gYmUgbm8gc3RyYXkgZGVwZW5kZW5jeSBvbiBhIG5vZGVcbiAgY29uc3QgZXhwcmVzc2lvbnM6IHQuU3RhdGVtZW50W10gPSBbXTtcbiAgbGV0IG5vZGVzVG9WaXNpdCA9IFsuLi5ub2RlSWRzXTtcbiAgLy8gVGhpcyBlbnN1cmVzIHdlIGRldGVjdCBjeWNsZXMgYW5kIGRvbid0IGVuZCB1cCBpbiBhbiBlbmRsZXNzIGxvb3BcbiAgbGV0IG5vZGVzVmlzaXRlZFRoaXNJdGVyYXRpb24gPSAwO1xuICBkbyB7XG4gICAgbm9kZXNWaXNpdGVkVGhpc0l0ZXJhdGlvbiA9IDA7XG5cbiAgICAvLyBGaW5kIG5leHQgbm9kZXMgdG8gdmlzaXRcbiAgICBjb25zdCBub2RlRXhwcmVzc2lvbkdlbmVyYXRvcnMgPSBncmFwaC5tYXBOb2Rlcygobm9kZUlkLCB7IGNvZGUgfSkgPT4ge1xuICAgICAgaWYgKCFub2Rlc1RvVmlzaXQuaW5jbHVkZXMobm9kZUlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1bnJlc29sdmVkRGVwZW5kZW5jaWVzID0gZ3JhcGhcbiAgICAgICAgLmluTmVpZ2hib3JzKG5vZGVJZClcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gbm9kZXNUb1Zpc2l0LmluY2x1ZGVzKGl0ZW0pKTtcblxuICAgICAgaWYgKHVucmVzb2x2ZWREZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5vZGVzVG9WaXNpdCA9IG5vZGVzVG9WaXNpdC5maWx0ZXIoKGlkKSA9PiBub2RlSWQgIT09IGlkKTtcbiAgICAgICAgbm9kZXNWaXNpdGVkVGhpc0l0ZXJhdGlvbiA9IG5vZGVzVmlzaXRlZFRoaXNJdGVyYXRpb24gKyAxO1xuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVmlzaXRpbmcgbm9kZSAke25vZGVJZH1gKTtcbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGNvZGUgZm9yIHRoZSBub2Rlc1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBub2RlRXhwcmVzc2lvbkdlbmVyYXRvcnMpIHtcbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goLi4uKGF3YWl0IGNvZGUoZ3JhcGgpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYCR7bm9kZXNUb1Zpc2l0Lmxlbmd0aH0gdW52aXNpdGVkIG5vZGVzOiAke25vZGVzVG9WaXNpdC5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9IHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoID4gMCAmJiBub2Rlc1Zpc2l0ZWRUaGlzSXRlcmF0aW9uICE9IDApO1xuXG4gIGlmIChub2Rlc1RvVmlzaXQubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgJHtcbiAgICAgICAgbm9kZXNUb1Zpc2l0Lmxlbmd0aFxuICAgICAgfSB0ZXJyYWZvcm0gZWxlbWVudHMgdGhhdCBjb3VsZCBub3QgYmUgdmlzaXRlZC5cbiAgICAgIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBhIGN5Y2xlIGluIHRoZSBkZXBlbmRlbmN5IGdyYXBoLlxuICAgICAgVGhlc2Ugbm9kZXMgYXJlOiAke25vZGVzVG9WaXNpdC5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKFxuICAgIGAke25vZGVzVG9WaXNpdC5sZW5ndGh9IHVudmlzaXRlZCBub2RlczogJHtub2Rlc1RvVmlzaXQuam9pbihcIiwgXCIpfWAsXG4gICk7XG5cbiAgY29uc3QgYmFja2VuZEV4cHJlc3Npb25zID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGxhbi50ZXJyYWZvcm0/Lm1hcCgodGVycmFmb3JtKSA9PlxuICAgICAgICBiYWNrZW5kVG9FeHByZXNzaW9uKHNjb3BlLCB0ZXJyYWZvcm0uYmFja2VuZCksXG4gICAgICApIHx8IFtQcm9taXNlLnJlc29sdmUoW10pXSxcbiAgICApXG4gICkucmVkdWNlKChjYXJyeSwgaXRlbSkgPT4gWy4uLmNhcnJ5LCAuLi5pdGVtXSwgW10pO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcbiAgICBgVXNpbmcgdGhlc2UgYmFja2VuZCBleHByZXNzaW9uczogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIGJhY2tlbmRFeHByZXNzaW9ucyxcbiAgICAgIG51bGwsXG4gICAgICAyLFxuICAgICl9YCxcbiAgKTtcblxuICAvLyBXZSBjb2xsZWN0IGFsbCBtb2R1bGUgc291cmNlc1xuICBjb25zdCBtb2R1bGVSZXF1aXJlbWVudHMgPSBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIE9iamVjdC52YWx1ZXMocGxhbi5tb2R1bGUgfHwge30pLnJlZHVjZShcbiAgICAgICAgKGNhcnJ5LCBtb2R1bGVCbG9jaykgPT4gW1xuICAgICAgICAgIC4uLmNhcnJ5LFxuICAgICAgICAgIC4uLm1vZHVsZUJsb2NrLnJlZHVjZShcbiAgICAgICAgICAgIChhcnIsIHsgc291cmNlLCB2ZXJzaW9uIH0pID0+IFtcbiAgICAgICAgICAgICAgLi4uYXJyLFxuICAgICAgICAgICAgICB2ZXJzaW9uID8gYCR7c291cmNlfUAke3ZlcnNpb259YCA6IHNvdXJjZSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICkgfHwgW10sXG4gICAgKSxcbiAgXTtcblxuICBsb2dnZXIuZGVidWcoXG4gICAgYEZvdW5kIHRoZXNlIG1vZHVsZXM6ICR7SlNPTi5zdHJpbmdpZnkobW9kdWxlUmVxdWlyZW1lbnRzLCBudWxsLCAyKX1gLFxuICApO1xuXG4gIGlmIChPYmplY3Qua2V5cyhwbGFuLnZhcmlhYmxlIHx8IHt9KS5sZW5ndGggPiAwICYmIGV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICBleHByZXNzaW9uc1swXSA9IHQuYWRkQ29tbWVudChcbiAgICAgIGV4cHJlc3Npb25zWzBdLFxuICAgICAgXCJsZWFkaW5nXCIsXG4gICAgICBgVGVycmFmb3JtIFZhcmlhYmxlcyBhcmUgbm90IGFsd2F5cyB0aGUgYmVzdCBmaXQgZm9yIGdldHRpbmcgaW5wdXRzIGluIHRoZSBjb250ZXh0IG9mIFRlcnJhZm9ybSBDREsuXG5Zb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGlzIGF0IGh0dHBzOi8vY2RrLnRmL3ZhcmlhYmxlc2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHByb3ZpZGVyUmVxdWlyZW1lbnRzID0gZ2V0UHJvdmlkZXJSZXF1aXJlbWVudHMocGxhbik7XG4gIGxvZ2dlci5kZWJ1ZyhcbiAgICBgRm91bmQgdGhlc2UgcHJvdmlkZXIgcmVxdWlyZW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgcHJvdmlkZXJSZXF1aXJlbWVudHMsXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApfWAsXG4gICk7XG5cbiAgLy8gV2UgYWRkIGEgY29tbWVudCBpZiB0aGVyZSBhcmUgcHJvdmlkZXJzIHdpdGggbWlzc2luZyBzY2hlbWEgaW5mb3JtYXRpb25cbiAgY29uc3QgcHJvdmlkZXJzTGFja2luZ1NjaGVtYSA9IE9iamVjdC5rZXlzKHByb3ZpZGVyUmVxdWlyZW1lbnRzKS5maWx0ZXIoXG4gICAgKHByb3ZpZGVyTmFtZSkgPT5cbiAgICAgIHByb3ZpZGVyTmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJlxuICAgICAgIU9iamVjdC5rZXlzKHByb3ZpZGVyU2NoZW1hLnByb3ZpZGVyX3NjaGVtYXMgfHwge30pLnNvbWUoKHNjaGVtYU5hbWUpID0+XG4gICAgICAgIHNjaGVtYU5hbWUuZW5kc1dpdGgocHJvdmlkZXJOYW1lKSxcbiAgICAgICksXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcbiAgICBgJHtcbiAgICAgIHByb3ZpZGVyc0xhY2tpbmdTY2hlbWEubGVuZ3RoXG4gICAgfSBwcm92aWRlcnMgbGFjayBzY2hlbWEgaW5mb3JtYXRpb246ICR7cHJvdmlkZXJzTGFja2luZ1NjaGVtYS5qb2luKFwiLCBcIil9YCxcbiAgKTtcblxuICBpZiAocHJvdmlkZXJzTGFja2luZ1NjaGVtYS5sZW5ndGggPiAwKSB7XG4gICAgZXhwcmVzc2lvbnNbMF0gPSB0LmFkZENvbW1lbnQoXG4gICAgICBleHByZXNzaW9uc1swXSxcbiAgICAgIFwibGVhZGluZ1wiLFxuICAgICAgYFRoZSBmb2xsb3dpbmcgcHJvdmlkZXJzIGFyZSBtaXNzaW5nIHNjaGVtYSBpbmZvcm1hdGlvbiBhbmQgbWlnaHQgbmVlZCBtYW51YWwgYWRqdXN0bWVudHMgdG8gc3ludGhlc2l6ZSBjb3JyZWN0bHk6ICR7cHJvdmlkZXJzTGFja2luZ1NjaGVtYS5qb2luKFxuICAgICAgICBcIiwgXCIsXG4gICAgICApfS5cbkZvciBhIG1vcmUgcHJlY2lzZSBjb252ZXJzaW9uIHBsZWFzZSB1c2UgdGhlIC0tcHJvdmlkZXIgZmxhZyBpbiBjb252ZXJ0LmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFsd2F5cyBhZGQgY29uc3RydWN0c1xuICBzY29wZS5pbXBvcnRhYmxlcy5wdXNoKHtcbiAgICBjb25zdHJ1Y3ROYW1lOiBcIkNvbnN0cnVjdFwiLFxuICAgIHByb3ZpZGVyOiBcImNvbnN0cnVjdHNcIixcbiAgfSk7XG5cbiAgaWYgKHNjb3BlLmhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb24pIHtcbiAgICBzY29wZS5pbXBvcnRhYmxlcy5wdXNoKHtcbiAgICAgIGNvbnN0cnVjdE5hbWU6IFwiVG9rZW5cIixcbiAgICAgIHByb3ZpZGVyOiBcImNka3RuXCIsXG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgc3BlY2lmaWMgaW1wb3J0IGZvciBjb2RlQ29udGFpbmVyXG4gIGFkZEltcG9ydEZvckNvZGVDb250YWluZXIoc2NvcGUsIGNvZGVDb250YWluZXIpO1xuICBjb25zdCBjb25zdHJ1Y3RJbXBvcnRzID0gYnVpbGRJbXBvcnRzKHNjb3BlLmltcG9ydGFibGVzKTtcblxuICBjb25zdCBjb2RlID0gWy4uLihiYWNrZW5kRXhwcmVzc2lvbnMgfHwgW10pLCAuLi5leHByZXNzaW9uc107XG4gIGNvbnN0IGNvbmZpZ1R5cGVOYW1lID1cbiAgICBPYmplY3Qua2V5cyhzY29wZS50b3BMZXZlbENvbmZpZykubGVuZ3RoID4gMCA/IFwiTXlDb25maWdcIiA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBjbGFzc0NvbmZpZyA9IGNvbmZpZ1R5cGVOYW1lXG4gICAgPyBbZ2VuZXJhdGVDb25maWdUeXBlKGNvbmZpZ1R5cGVOYW1lLCBzY29wZS50b3BMZXZlbENvbmZpZyldXG4gICAgOiBbXTtcblxuICAvLyBXZSBzcGxpdCB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgc28gdGhhdCB1c2VycyBjYW4gaGF2ZSBtb3JlIGNvbnRyb2wgb3ZlciB3aGF0IHRvIGluc2VydCB3aGVyZVxuICByZXR1cm4ge1xuICAgIC8vIFRPRE86IFJlbW92ZSBpbXBvcnRzIGFuZCBjb2RlIGJlY2F1c2Ugcm9zZXR0YSB3b24ndCBiZSBhYmxlIHRvIHRyYW5zbGF0ZSB0aGVtXG4gICAgYWxsOiBhd2FpdCBnZW4oW1xuICAgICAgLi4uY29uc3RydWN0SW1wb3J0cyxcbiAgICAgIC4uLm1vZHVsZUltcG9ydHMocGxhbi5tb2R1bGUpLFxuICAgICAgLi4uY2xhc3NDb25maWcsXG4gICAgICB3cmFwQ29kZUluQ29uc3RydWN0b3IoXG4gICAgICAgIGNvZGVDb250YWluZXIsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIFwiTXlDb252ZXJ0ZWRDb2RlXCIsXG4gICAgICAgIGNvbmZpZ1R5cGVOYW1lLFxuICAgICAgKSxcbiAgICBdKSxcbiAgICBpbXBvcnRzOiBhd2FpdCBnZW4oWy4uLmNvbnN0cnVjdEltcG9ydHMsIC4uLm1vZHVsZUltcG9ydHMocGxhbi5tb2R1bGUpXSksXG4gICAgY29kZTogYXdhaXQgZ2VuKGNvZGUpLFxuICAgIHByb3ZpZGVyczogT2JqZWN0LmVudHJpZXMocHJvdmlkZXJSZXF1aXJlbWVudHMpLm1hcCgoW3NvdXJjZSwgdmVyc2lvbl0pID0+XG4gICAgICB2ZXJzaW9uID09PSBcIipcIiA/IHNvdXJjZSA6IGAke3NvdXJjZX1AJHt2ZXJzaW9ufWAsXG4gICAgKSxcbiAgICBtb2R1bGVzOiBtb2R1bGVSZXF1aXJlbWVudHMsXG4gICAgLy8gV2UgdHJhY2sgc29tZSB1c2FnZSBkYXRhIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHVuZGVyc3RhbmQgd2hhdCBpcyB1c2VkXG4gICAgc3RhdHM6IHtcbiAgICAgIG51bWJlck9mTW9kdWxlczogbW9kdWxlUmVxdWlyZW1lbnRzLmxlbmd0aCxcbiAgICAgIG51bWJlck9mUHJvdmlkZXJzOiBPYmplY3Qua2V5cyhwcm92aWRlclJlcXVpcmVtZW50cykubGVuZ3RoLFxuICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZVN0YXRzKHBsYW4ucmVzb3VyY2UgfHwge30pLFxuICAgICAgZGF0YTogcmVzb3VyY2VTdGF0cyhwbGFuLmRhdGEgfHwge30pLFxuICAgICAgY29udmVydGVkTGluZXM6IGhjbC5zcGxpdChcIlxcblwiKS5sZW5ndGgsXG4gICAgfSxcbiAgfTtcbn1cblxudHlwZSBGaWxlID0geyBjb250ZW50czogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH07XG5jb25zdCB0cmFuc2xhdG9ycyA9IHtcbiAgcHl0aG9uOiB7XG4gICAgdmlzaXRvcjogKCkgPT4gbmV3IHJvc2V0dGEuUHl0aG9uVmlzaXRvcigpLFxuICAgIHBvc3RUcmFuc2xhdGlvbk11dGF0aW9uOiByZXBsYWNlUHl0aG9uSW1wb3J0cyxcbiAgfSxcbiAgamF2YToge1xuICAgIHZpc2l0b3I6ICgpID0+IG5ldyByb3NldHRhLkphdmFWaXNpdG9yKCksXG4gICAgcG9zdFRyYW5zbGF0aW9uTXV0YXRpb246IHJlcGxhY2VKYXZhSW1wb3J0cyxcbiAgfSxcbiAgY3NoYXJwOiB7XG4gICAgdmlzaXRvcjogKCkgPT4gbmV3IHJvc2V0dGEuQ1NoYXJwVmlzaXRvcigpLFxuICAgIHBvc3RUcmFuc2xhdGlvbk11dGF0aW9uOiByZXBsYWNlQ3NoYXJwSW1wb3J0cyxcbiAgfSxcbiAgZ286IHtcbiAgICB2aXNpdG9yOiAoKSA9PiBuZXcgcm9zZXR0YS5Hb1Zpc2l0b3IoKSxcbiAgICBwb3N0VHJhbnNsYXRpb25NdXRhdGlvbjogcmVwbGFjZUdvSW1wb3J0cyxcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHRyYW5zbGF0b3JGb3JMYW5ndWFnZShsYW5ndWFnZToga2V5b2YgdHlwZW9mIHRyYW5zbGF0b3JzKSB7XG4gIHJldHVybiAoZmlsZTogRmlsZSwgdGhyb3dPblRyYW5zbGF0aW9uRXJyb3I6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCB7IHZpc2l0b3IsIHBvc3RUcmFuc2xhdGlvbk11dGF0aW9uIH0gPSB0cmFuc2xhdG9yc1tsYW5ndWFnZV07XG4gICAgY29uc3QgeyB0cmFuc2xhdGlvbiwgZGlhZ25vc3RpY3MgfSA9IHJvc2V0dGEudHJhbnNsYXRlVHlwZVNjcmlwdChcbiAgICAgIGZpbGUsXG4gICAgICB2aXNpdG9yKCksXG4gICAgICB0aHJvd09uVHJhbnNsYXRpb25FcnJvciA/IHsgaW5jbHVkZUNvbXBpbGVyRGlhZ25vc3RpY3M6IHRydWUgfSA6IHt9LFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICB0aHJvd09uVHJhbnNsYXRpb25FcnJvciAmJlxuICAgICAgZGlhZ25vc3RpY3MuZmlsdGVyKChkaWFnKSA9PiBkaWFnLmlzRXJyb3IpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ291bGQgbm90IHRyYW5zbGF0ZSBUUyB0byAke2xhbmd1YWdlfTpcXG4ke2ZpbGUuY29udGVudHN9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgdHJhbnNsYXRlIFRTIHRvICR7bGFuZ3VhZ2V9OiAke2RpYWdub3N0aWNzXG4gICAgICAgICAgLm1hcCgoZGlhZykgPT4gZGlhZy5mb3JtYXR0ZWRNZXNzYWdlKVxuICAgICAgICAgIC5qb2luKFwiXFxuXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwb3N0VHJhbnNsYXRpb25NdXRhdGlvbih0cmFuc2xhdGlvbik7XG4gIH07XG59XG5cbnR5cGUgQ29udmVydE9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UgdG8gY29udmVydCB0b1xuICAgKi9cbiAgbGFuZ3VhZ2U6IGtleW9mIHR5cGVvZiB0cmFuc2xhdG9ycyB8IFwidHlwZXNjcmlwdFwiO1xuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHNjaGVtYSB0byB1c2UgZm9yIGNvbnZlcnNpb25cbiAgICovXG4gIHByb3ZpZGVyU2NoZW1hOiBQcm92aWRlclNjaGVtYTtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGNsYXNzIHRvIGV4dGVuZCBmcm9tLiBEZWZhdWx0cyB0byBgY29uc3RydWN0cy5Db25zdHJ1Y3RgXG4gICAqL1xuICBjb2RlQ29udGFpbmVyPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdHJhbnNsYXRpb24gZmFpbHNcbiAgICogRGVmYXVsdHMgdG8gZmFsc2VcbiAgICovXG4gIHRocm93T25UcmFuc2xhdGlvbkVycm9yPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb252ZXJ0KFxuICBoY2w6IHN0cmluZyxcbiAge1xuICAgIGxhbmd1YWdlLFxuICAgIHByb3ZpZGVyU2NoZW1hLFxuICAgIHRocm93T25UcmFuc2xhdGlvbkVycm9yID0gZmFsc2UsXG4gICAgY29kZUNvbnRhaW5lciA9IFwiY2RrdG4uVGVycmFmb3JtU3RhY2tcIixcbiAgfTogQ29udmVydE9wdGlvbnMsXG4pIHtcbiAgY29uc3QgZmlsZU5hbWUgPSBcInRlcnJhZm9ybS50ZlwiO1xuICBjb25zdCB0cmFuc2xhdGVyID1cbiAgICBsYW5ndWFnZSA9PT0gXCJ0eXBlc2NyaXB0XCJcbiAgICAgID8gKGZpbGU6IEZpbGUsIF90aHJvd09uVHJhbnNsYXRpb25FcnJvcjogYm9vbGVhbikgPT4gZmlsZS5jb250ZW50c1xuICAgICAgOiB0cmFuc2xhdG9yRm9yTGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuXG4gIGlmICghdHJhbnNsYXRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGxhbmd1YWdlIHVzZWQ6IFwiICsgbGFuZ3VhZ2UpO1xuICB9XG5cbiAgY29uc3QgdHNDb2RlID0gYXdhaXQgY29udmVydFRvVHlwZXNjcmlwdChoY2wsIHByb3ZpZGVyU2NoZW1hLCBjb2RlQ29udGFpbmVyKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnRzQ29kZSxcbiAgICBhbGw6IHRyYW5zbGF0ZXIoXG4gICAgICB7IGZpbGVOYW1lLCBjb250ZW50czogdHNDb2RlLmFsbCB9LFxuICAgICAgdGhyb3dPblRyYW5zbGF0aW9uRXJyb3IsXG4gICAgKSxcbiAgICBpbXBvcnRzOiB0cmFuc2xhdGVyKHsgZmlsZU5hbWUsIGNvbnRlbnRzOiB0c0NvZGUuaW1wb3J0cyB9LCBmYWxzZSksXG4gICAgY29kZTogdHJhbnNsYXRlcih7IGZpbGVOYW1lLCBjb250ZW50czogdHNDb2RlLmNvZGUgfSwgZmFsc2UpLFxuICAgIHN0YXRzOiB7IC4uLnRzQ29kZS5zdGF0cywgbGFuZ3VhZ2UgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlcnJhZm9ybUNvbmZpZ0Zyb21EaXIoaW1wb3J0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoaW1wb3J0UGF0aCk7XG4gIGNvbnN0IGZpbGVDb250ZW50cyA9IGdsb2JcbiAgICAuc3luYyhcIi4vKi50ZlwiLCB7IGN3ZDogYWJzUGF0aCB9KVxuICAgIC5tYXAoKHApID0+IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoYWJzUGF0aCwgcCksIFwidXRmOFwiKSk7XG5cbiAgcmV0dXJuIGZpbGVDb250ZW50cy5qb2luKFwiXFxuXCIpO1xufVxuXG50eXBlIENka3RmSnNvbiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYge1xuICB0ZXJyYWZvcm1Qcm92aWRlcnM6IGFueVtdO1xuICB0ZXJyYWZvcm1Nb2R1bGVzOiBhbnlbXTtcbn07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29udmVydFByb2plY3QoXG4gIGNvbWJpbmVkSGNsOiBzdHJpbmcsXG4gIHsgbGFuZ3VhZ2UsIHByb3ZpZGVyU2NoZW1hIH06IENvbnZlcnRPcHRpb25zLFxuKSB7XG4gIGlmIChsYW5ndWFnZSAhPT0gXCJ0eXBlc2NyaXB0XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBsYW5ndWFnZSB1c2VkOiBcIiArIGxhbmd1YWdlKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBpbXBvcnRzLFxuICAgIGNvZGUsXG4gICAgcHJvdmlkZXJzLFxuICAgIG1vZHVsZXM6IHRmTW9kdWxlcyxcbiAgICBzdGF0cyxcbiAgfSA9IGF3YWl0IGNvbnZlcnQoY29tYmluZWRIY2wsIHtcbiAgICBsYW5ndWFnZSxcbiAgICBwcm92aWRlclNjaGVtYSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAoaW5wdXRNYWluRmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpbXBvcnRNYWluRmlsZSA9IFtpbXBvcnRzLCBpbnB1dE1haW5GaWxlXS5qb2luKFwiXFxuXCIpO1xuICAgICAgY29uc3Qgb3V0cHV0TWFpbkZpbGUgPSBpbXBvcnRNYWluRmlsZS5yZXBsYWNlKENPREVfTUFSS0VSLCBjb2RlKTtcbiAgICAgIHJldHVybiBwcmV0dGllci5mb3JtYXQob3V0cHV0TWFpbkZpbGUsIHsgcGFyc2VyOiBcImJhYmVsXCIgfSk7XG4gICAgfSxcbiAgICBjZGt0Zkpzb246IChpbnB1dENka3RmSnNvbjogQ2RrdGZKc29uKSA9PiB7XG4gICAgICBjb25zdCBjZGt0Zkpzb24gPSB7IC4uLmlucHV0Q2RrdGZKc29uIH07XG4gICAgICBjZGt0Zkpzb24udGVycmFmb3JtUHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICAgICAgY2RrdGZKc29uLnRlcnJhZm9ybU1vZHVsZXMgPSB0Zk1vZHVsZXM7XG4gICAgICByZXR1cm4gY2RrdGZKc29uO1xuICAgIH0sXG4gICAgc3RhdHMsXG4gIH07XG59XG5cbmV4cG9ydCB7IGlzUmVnaXN0cnlNb2R1bGUsIGF0dHJpYnV0ZU5hbWVUb0Nka3RmTmFtZSB9O1xuIl19
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resourceStats = exports.forEachNamespaced = exports.forEachProvider = exports.forEachImport = exports.forEachGlobal = void 0;
4
+ const telemetryAllowList_json_1 = require("./telemetryAllowList.json");
5
+ // locals, variables, and outputs are global key value maps
6
+ function forEachGlobal(scope, prefix, record, iterator) {
7
+ return Object.entries(record || {}).reduce((carry, [key, item]) => {
8
+ const id = `${prefix}.${key}`;
9
+ return {
10
+ ...carry,
11
+ [id]: {
12
+ code: async (graph) => await iterator(scope, key, id, item, graph),
13
+ value: item,
14
+ },
15
+ };
16
+ }, {});
17
+ }
18
+ exports.forEachGlobal = forEachGlobal;
19
+ function forEachImport(scope, prefix, record, iterator) {
20
+ return (record || []).reduce((carry, item) => {
21
+ const target = item.to.startsWith("${") && item.to.endsWith("}")
22
+ ? item.to.substring(2, item.to.length - 1)
23
+ : item.to;
24
+ const id = `${prefix}.${target}`;
25
+ return {
26
+ ...carry,
27
+ [id]: {
28
+ code: async (graph) => await iterator(scope, id, item, graph),
29
+ value: item,
30
+ },
31
+ };
32
+ }, {});
33
+ }
34
+ exports.forEachImport = forEachImport;
35
+ function forEachProvider(scope, record, iterator) {
36
+ return Object.entries(record || {}).reduce((carry, [key, items]) => {
37
+ return {
38
+ ...carry,
39
+ ...items.reduce((innerCarry, item) => {
40
+ const id = item.alias ? `${key}.${item.alias}` : `${key}`;
41
+ return {
42
+ ...innerCarry,
43
+ [id]: {
44
+ code: async (graph) => await iterator(scope, key, id, item, graph),
45
+ value: item,
46
+ },
47
+ };
48
+ }, {}),
49
+ };
50
+ }, {});
51
+ }
52
+ exports.forEachProvider = forEachProvider;
53
+ // data and resource are namespaced key value maps
54
+ function forEachNamespaced(scope, record, iterator, prefix) {
55
+ return Object.entries(record || {}).reduce((outerCarry, [type, items]) => ({
56
+ ...outerCarry,
57
+ ...Object.entries(items).reduce((innerCarry, [key, item]) => {
58
+ const prefixedType = prefix ? `${prefix}.${type}` : type;
59
+ const id = prefix ? `${prefix}.${type}.${key}` : `${type}.${key}`;
60
+ return {
61
+ ...innerCarry,
62
+ [id]: {
63
+ code: async (graph) => await iterator(scope, prefixedType, key, id, item, graph),
64
+ value: item,
65
+ },
66
+ };
67
+ }, {}),
68
+ }), {});
69
+ }
70
+ exports.forEachNamespaced = forEachNamespaced;
71
+ function resourceStats(obj) {
72
+ return Object.entries(obj).reduce((carry, [key, value]) => {
73
+ const [provider, ...resourceParts] = key.split("_");
74
+ const shouldBeTracked = telemetryAllowList_json_1.providers.includes(provider);
75
+ const providerKey = shouldBeTracked ? provider : "other";
76
+ const resourceName = shouldBeTracked ? resourceParts.join("_") : "other";
77
+ return {
78
+ ...carry,
79
+ [providerKey]: {
80
+ ...(carry[providerKey] || {}),
81
+ [resourceName]: Object.keys(value).length,
82
+ },
83
+ };
84
+ }, {});
85
+ }
86
+ exports.resourceStats = resourceStats;
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2l0ZXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx1RUFBbUY7QUFJbkYsMkRBQTJEO0FBQzNELFNBQWdCLGFBQWEsQ0FDM0IsS0FBbUIsRUFDbkIsTUFBYyxFQUNkLE1BQXFDLEVBQ3JDLFFBTWU7SUFFZixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLEdBQUcsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNKLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBb0IsRUFBRSxFQUFFLENBQ25DLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQXZCRCxzQ0F1QkM7QUFFRCxTQUFnQixhQUFhLENBQzNCLEtBQW1CLEVBQ25CLE1BQWMsRUFDZCxNQUE0QixFQUM1QixRQUtlO0lBS2YsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDM0MsTUFBTSxNQUFNLEdBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFD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QUNGLENBQUM7UUFDSixDQUFDLEVBQ0QsRUFHQyxDQUNGO0tBQ0YsQ0FBQyxFQUNGLEVBR0MsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQXhDRCw4Q0F3Q0M7QUFFRCxTQUFnQixhQUFhLENBQUMsR0FBNEM7SUFDeEUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FDL0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUN0QixNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLGVBQWUsR0FBRyxtQ0FBeUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUV6RSxPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1IsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDYixHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU07YUFDMUM7U0FDRixDQUFDO0lBQ0osQ0FBQyxFQUNELEVBQTRDLENBQzdDLENBQUM7QUFDSixDQUFDO0FBbEJELHNDQWtCQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBEaXJlY3RlZEdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcbmltcG9ydCB7IHByb3ZpZGVycyBhcyB0ZWxlbWV0cnlBbGxvd2VkUHJvdmlkZXJzIH0gZnJvbSBcIi4vdGVsZW1ldHJ5QWxsb3dMaXN0Lmpzb25cIjtcbmltcG9ydCB7IFByb2dyYW1TY29wZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnQgfSBmcm9tIFwiLi9zY2hlbWFcIjtcblxuLy8gbG9jYWxzLCB2YXJpYWJsZXMsIGFuZCBvdXRwdXRzIGFyZSBnbG9iYWwga2V5IHZhbHVlIG1hcHNcbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoR2xvYmFsPFQsIFI+KFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUPiB8IHVuZGVmaW5lZCxcbiAgaXRlcmF0b3I6IChcbiAgICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICAgIGtleTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdmFsdWU6IFQsXG4gICAgZ3JhcGg6IERpcmVjdGVkR3JhcGgsXG4gICkgPT4gUHJvbWlzZTxSPixcbik6IFJlY29yZDxzdHJpbmcsIHsgY29kZTogKGdyYXBoOiBEaXJlY3RlZEdyYXBoKSA9PiBQcm9taXNlPFI+OyB2YWx1ZTogVCB9PiB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZWNvcmQgfHwge30pLnJlZHVjZSgoY2FycnksIFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgY29uc3QgaWQgPSBgJHtwcmVmaXh9LiR7a2V5fWA7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNhcnJ5LFxuICAgICAgW2lkXToge1xuICAgICAgICBjb2RlOiBhc3luYyAoZ3JhcGg6IERpcmVjdGVkR3JhcGgpID0+XG4gICAgICAgICAgYXdhaXQgaXRlcmF0b3Ioc2NvcGUsIGtleSwgaWQsIGl0ZW0sIGdyYXBoKSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICB9LFxuICAgIH07XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hJbXBvcnQ8Uj4oXG4gIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gIHByZWZpeDogc3RyaW5nLFxuICByZWNvcmQ6IEltcG9ydFtdIHwgdW5kZWZpbmVkLFxuICBpdGVyYXRvcjogKFxuICAgIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB2YWx1ZTogSW1wb3J0LFxuICAgIGdyYXBoOiBEaXJlY3RlZEdyYXBoLFxuICApID0+IFByb21pc2U8Uj4sXG4pOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgeyBjb2RlOiAoZ3JhcGg6IERpcmVjdGVkR3JhcGgpID0+IFByb21pc2U8Uj47IHZhbHVlOiBJbXBvcnQgfVxuPiB7XG4gIHJldHVybiAocmVjb3JkIHx8IFtdKS5yZWR1Y2UoKGNhcnJ5LCBpdGVtKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIGl0ZW0udG8uc3RhcnRzV2l0aChcIiR7XCIpICYmIGl0ZW0udG8uZW5kc1dpdGgoXCJ9XCIpXG4gICAgICAgID8gaXRlbS50by5zdWJzdHJpbmcoMiwgaXRlbS50by5sZW5ndGggLSAxKVxuICAgICAgICA6IGl0ZW0udG87XG5cbiAgICBjb25zdCBpZCA9IGAke3ByZWZpeH0uJHt0YXJnZXR9YDtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY2FycnksXG4gICAgICBbaWRdOiB7XG4gICAgICAgIGNvZGU6IGFzeW5jIChncmFwaDogRGlyZWN0ZWRHcmFwaCkgPT5cbiAgICAgICAgICBhd2FpdCBpdGVyYXRvcihzY29wZSwgaWQsIGl0ZW0sIGdyYXBoKSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICB9LFxuICAgIH07XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hQcm92aWRlcjxUIGV4dGVuZHMgeyBhbGlhcz86IHN0cmluZyB9LCBSPihcbiAgc2NvcGU6IFByb2dyYW1TY29wZSxcbiAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUW10+IHwgdW5kZWZpbmVkLFxuICBpdGVyYXRvcjogKFxuICAgIHNjb3BlOiBQcm9ncmFtU2NvcGUsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB2YWx1ZTogVCxcbiAgICBncmFwaDogRGlyZWN0ZWRHcmFwaCxcbiAgKSA9PiBQcm9taXNlPFI+LFxuKTogUmVjb3JkPHN0cmluZywgeyBjb2RlOiAoZ3JhcGg6IERpcmVjdGVkR3JhcGgpID0+IFByb21pc2U8Uj47IHZhbHVlOiBUIH0+IHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlY29yZCB8fCB7fSkucmVkdWNlKChjYXJyeSwgW2tleSwgaXRlbXNdKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNhcnJ5LFxuICAgICAgLi4uaXRlbXMucmVkdWNlKChpbm5lckNhcnJ5LCBpdGVtOiBUKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gaXRlbS5hbGlhcyA/IGAke2tleX0uJHtpdGVtLmFsaWFzfWAgOiBgJHtrZXl9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pbm5lckNhcnJ5LFxuICAgICAgICAgIFtpZF06IHtcbiAgICAgICAgICAgIGNvZGU6IGFzeW5jIChncmFwaDogRGlyZWN0ZWRHcmFwaCkgPT5cbiAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3Ioc2NvcGUsIGtleSwgaWQsIGl0ZW0sIGdyYXBoKSxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LCB7fSksXG4gICAgfTtcbiAgfSwge30pO1xufVxuXG4vLyBkYXRhIGFuZCByZXNvdXJjZSBhcmUgbmFtZXNwYWNlZCBrZXkgdmFsdWUgbWFwc1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hOYW1lc3BhY2VkPFQsIFI+KFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFQ+PiB8IHVuZGVmaW5lZCxcbiAgaXRlcmF0b3I6IChcbiAgICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHZhbHVlOiBULFxuICAgIGdyYXBoOiBEaXJlY3RlZEdyYXBoLFxuICApID0+IFByb21pc2U8Uj4sXG4gIHByZWZpeD86IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIHsgY29kZTogKGdyYXBoOiBEaXJlY3RlZEdyYXBoKSA9PiBQcm9taXNlPFI+OyB2YWx1ZTogVCB9PiB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZWNvcmQgfHwge30pLnJlZHVjZShcbiAgICAob3V0ZXJDYXJyeSwgW3R5cGUsIGl0ZW1zXSkgPT4gKHtcbiAgICAgIC4uLm91dGVyQ2FycnksXG4gICAgICAuLi5PYmplY3QuZW50cmllcyhpdGVtcykucmVkdWNlKFxuICAgICAgICAoaW5uZXJDYXJyeSwgW2tleSwgaXRlbV0pID0+IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZFR5cGUgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7dHlwZX1gIDogdHlwZTtcbiAgICAgICAgICBjb25zdCBpZCA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHt0eXBlfS4ke2tleX1gIDogYCR7dHlwZX0uJHtrZXl9YDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaW5uZXJDYXJyeSxcbiAgICAgICAgICAgIFtpZF06IHtcbiAgICAgICAgICAgICAgY29kZTogYXN5bmMgKGdyYXBoOiBEaXJlY3RlZEdyYXBoKSA9PlxuICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yKHNjb3BlLCBwcmVmaXhlZFR5cGUsIGtleSwgaWQsIGl0ZW0sIGdyYXBoKSxcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxcbiAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgeyBjb2RlOiAoZ3JhcGg6IERpcmVjdGVkR3JhcGgpID0+IFByb21pc2U8Uj47IHZhbHVlOiBUIH1cbiAgICAgICAgPixcbiAgICAgICksXG4gICAgfSksXG4gICAge30gYXMgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgeyBjb2RlOiAoZ3JhcGg6IERpcmVjdGVkR3JhcGgpID0+IFByb21pc2U8Uj47IHZhbHVlOiBUIH1cbiAgICA+LFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VTdGF0cyhvYmo6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pikge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgKGNhcnJ5LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IFtwcm92aWRlciwgLi4ucmVzb3VyY2VQYXJ0c10gPSBrZXkuc3BsaXQoXCJfXCIpO1xuICAgICAgY29uc3Qgc2hvdWxkQmVUcmFja2VkID0gdGVsZW1ldHJ5QWxsb3dlZFByb3ZpZGVycy5pbmNsdWRlcyhwcm92aWRlcik7XG4gICAgICBjb25zdCBwcm92aWRlcktleSA9IHNob3VsZEJlVHJhY2tlZCA/IHByb3ZpZGVyIDogXCJvdGhlclwiO1xuICAgICAgY29uc3QgcmVzb3VyY2VOYW1lID0gc2hvdWxkQmVUcmFja2VkID8gcmVzb3VyY2VQYXJ0cy5qb2luKFwiX1wiKSA6IFwib3RoZXJcIjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtwcm92aWRlcktleV06IHtcbiAgICAgICAgICAuLi4oY2FycnlbcHJvdmlkZXJLZXldIHx8IHt9KSxcbiAgICAgICAgICBbcmVzb3VyY2VOYW1lXTogT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PixcbiAgKTtcbn1cbiJdfQ==