@liflig/cdk 3.20.24 → 3.21.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.
@@ -1,5 +1,22 @@
1
- export declare function prepareManifestForSnapshot(content: string): string;
2
- export declare function prepareTemplateForSnapshot(content: string): string;
1
+ /**
2
+ * Sanitize a Cloud Assembly manifest.json for snapshot use.
3
+ *
4
+ * On CDK < 2.242.0 the manifest contains inline metadata per stack artifact.
5
+ * On CDK >= 2.242.0 that metadata is extracted into separate files (handled
6
+ * by {@link sanitizeMetadata}), but the manifest still needs version,
7
+ * runtime, trace, and asset detail stripping.
8
+ */
9
+ export declare function sanitizeManifest(content: string): string;
10
+ /**
11
+ * Sanitize an extracted metadata JSON file for snapshot use.
12
+ *
13
+ * CDK >= 2.242.0 extracts per-stack metadata into separate *.metadata.json
14
+ * files (previously this data was inline in manifest.json). This function
15
+ * applies the same sanitization (trace removal, asset detail stripping) so
16
+ * snapshots remain stable across synthesizes.
17
+ */
18
+ export declare function sanitizeMetadata(content: string): string;
19
+ export declare function sanitizeTemplate(content: string): string;
3
20
  /**
4
21
  * Convert a Cloud Assembly to a snapshot.
5
22
  */
package/lib/snapshots.js CHANGED
@@ -45,6 +45,19 @@ function rewriteCurrentVersionIfFound(value) {
45
45
  const match = currentVersionRegex.exec(value);
46
46
  return match ? `${match[1]}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` : null;
47
47
  }
48
+ /**
49
+ * Replace asset hashes in a string value with stable placeholders.
50
+ * Shared by both template and manifest/metadata asset stripping.
51
+ */
52
+ function replaceAssetHashesInString(value) {
53
+ const newCurrentVersion = rewriteCurrentVersionIfFound(value);
54
+ if (newCurrentVersion) {
55
+ return newCurrentVersion;
56
+ }
57
+ return value
58
+ .replace(assetContentHashRegex, "snapshot-value")
59
+ .replace(pipelinesAssetIdSuffixRegex, "$1snapshot-value");
60
+ }
48
61
  function removeAssetDetailsFromTemplate(data) {
49
62
  if (Array.isArray(data)) {
50
63
  return data.map(removeAssetDetailsFromTemplate);
@@ -74,16 +87,15 @@ function removeAssetDetailsFromTemplate(data) {
74
87
  .filter((it) => it != null));
75
88
  }
76
89
  if (typeof data === "string") {
77
- const newCurrentVersion = rewriteCurrentVersionIfFound(data);
78
- if (newCurrentVersion) {
79
- return newCurrentVersion;
80
- }
81
- return data
82
- .replace(assetContentHashRegex, "snapshot-value")
83
- .replace(pipelinesAssetIdSuffixRegex, "$1snapshot-value");
90
+ return replaceAssetHashesInString(data);
84
91
  }
85
92
  return data;
86
93
  }
94
+ /**
95
+ * Recursively strip asset-related details (hashes, parameters) from a JSON
96
+ * structure. Used for both manifest.json (CDK < 2.242.0 with inline metadata)
97
+ * and standalone *.metadata.json files (CDK >= 2.242.0).
98
+ */
87
99
  function removeAssetDetailsFromManifest(data) {
88
100
  if (Array.isArray(data)) {
89
101
  return data.map(removeAssetDetailsFromManifest);
@@ -106,13 +118,7 @@ function removeAssetDetailsFromManifest(data) {
106
118
  .filter((it) => it != null));
107
119
  }
108
120
  if (typeof data === "string") {
109
- const newCurrentVersion = rewriteCurrentVersionIfFound(data);
110
- if (newCurrentVersion) {
111
- return newCurrentVersion;
112
- }
113
- return data
114
- .replace(assetContentHashRegex, "snapshot-value")
115
- .replace(pipelinesAssetIdSuffixRegex, "$1snapshot-value");
121
+ return replaceAssetHashesInString(data);
116
122
  }
117
123
  return data;
118
124
  }
@@ -130,14 +136,21 @@ function removeCdkMetadataResourceFromTemplate(data) {
130
136
  delete cp.Resources.CDKMetadata;
131
137
  return cp;
132
138
  }
133
- export function prepareManifestForSnapshot(content) {
139
+ /**
140
+ * Sanitize a Cloud Assembly manifest.json for snapshot use.
141
+ *
142
+ * On CDK < 2.242.0 the manifest contains inline metadata per stack artifact.
143
+ * On CDK >= 2.242.0 that metadata is extracted into separate files (handled
144
+ * by {@link sanitizeMetadata}), but the manifest still needs version,
145
+ * runtime, trace, and asset detail stripping.
146
+ */
147
+ export function sanitizeManifest(content) {
134
148
  const input = JSON.parse(content);
135
149
  const output = [
136
150
  removeVersion,
137
151
  // Remove the runtime version information so it don't conflict with CI
138
152
  // or other users generating the snapshots.
139
153
  removeRuntimeLibraries,
140
- // Remove the trace from manifest for now.
141
154
  removeTrace,
142
155
  // Avoid details (hashes) from assets.
143
156
  removeAssetDetailsFromManifest,
@@ -145,14 +158,19 @@ export function prepareManifestForSnapshot(content) {
145
158
  return JSON.stringify(output, undefined, " ");
146
159
  }
147
160
  /**
148
- * Transform the Cloud Assembly manifest file so that it can be persisted
149
- * as a snapshot without causing invalidations for every synthesize.
161
+ * Sanitize an extracted metadata JSON file for snapshot use.
162
+ *
163
+ * CDK >= 2.242.0 extracts per-stack metadata into separate *.metadata.json
164
+ * files (previously this data was inline in manifest.json). This function
165
+ * applies the same sanitization (trace removal, asset detail stripping) so
166
+ * snapshots remain stable across synthesizes.
150
167
  */
151
- async function prepareManifestFileForSnapshot(file) {
152
- const result = prepareManifestForSnapshot(await fs.promises.readFile(file, "utf8"));
153
- await fs.promises.writeFile(file, result);
168
+ export function sanitizeMetadata(content) {
169
+ const input = JSON.parse(content);
170
+ const output = [removeTrace, removeAssetDetailsFromManifest].reduce((acc, fn) => fn(acc), input);
171
+ return JSON.stringify(output, undefined, " ");
154
172
  }
155
- export function prepareTemplateForSnapshot(content) {
173
+ export function sanitizeTemplate(content) {
156
174
  const input = JSON.parse(content);
157
175
  const output = [
158
176
  removeCdkMetadataResourceFromTemplate,
@@ -162,11 +180,10 @@ export function prepareTemplateForSnapshot(content) {
162
180
  return JSON.stringify(output, undefined, " ");
163
181
  }
164
182
  /**
165
- * Transform a Cloud Assembly template file so that it can be persisted
166
- * as a snapshot without causing invalidations for minor changes.
183
+ * Read a file, apply a transform, and write the result back.
167
184
  */
168
- async function prepareTemplateFileForSnapshot(file) {
169
- const result = prepareTemplateForSnapshot(await fs.promises.readFile(file, "utf8"));
185
+ async function transformFileInPlace(file, transform) {
186
+ const result = transform(await fs.promises.readFile(file, "utf8"));
170
187
  await fs.promises.writeFile(file, result);
171
188
  }
172
189
  /**
@@ -196,19 +213,13 @@ export async function createCloudAssemblySnapshot(src, dst) {
196
213
  recursive: true,
197
214
  force: true,
198
215
  })));
199
- const manifestFiles = [
200
- // Transform the manifest to be more snapshot friendly.
201
- "**/manifest.json",
202
- ].flatMap((g) => expandGlob(g, destAbs));
203
- for (const file of manifestFiles) {
204
- await prepareManifestFileForSnapshot(file);
205
- }
206
- const templateFiles = [
207
- // Transform all templates.
208
- "**/*.template.json",
209
- ].flatMap((g) => expandGlob(g, destAbs));
210
- for (const file of templateFiles) {
211
- await prepareTemplateFileForSnapshot(file);
212
- }
216
+ const fileTransforms = {
217
+ "**/manifest.json": sanitizeManifest,
218
+ // CDK >= 2.242.0 extracts per-stack metadata into separate files.
219
+ // No matches on older CDK — safe to process unconditionally.
220
+ "**/*.metadata.json": sanitizeMetadata,
221
+ "**/*.template.json": sanitizeTemplate,
222
+ };
223
+ await Promise.all(Object.entries(fileTransforms).flatMap(([pattern, transform]) => expandGlob(pattern, destAbs).map((f) => transformFileInPlace(f, transform))));
213
224
  }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NuYXBzaG90cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUVqQyxTQUFTLGFBQWEsQ0FBQyxJQUFTO0lBQzlCLE1BQU0sRUFBRSxHQUFHO1FBQ1QsR0FBRyxJQUFJO0tBQ1IsQ0FBQTtJQUVELE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQTtJQUNqQixPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFTO0lBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQStCLENBQUM7YUFDNUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQzthQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDcEQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLElBQVM7SUFDdkMsTUFBTSxFQUFFLEdBQUc7UUFDVCxHQUFHLElBQUk7S0FDUixDQUFBO0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIs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O0lBRXhDLEtBQUssTUFBTSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7UUFDakMsTUFBTSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmZ1bmN0aW9uIHJlbW92ZVZlcnNpb24oZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgY3AgPSB7XG4gICAgLi4uZGF0YSxcbiAgfVxuXG4gIGRlbGV0ZSBjcC52ZXJzaW9uXG4gIHJldHVybiBjcFxufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFjZShkYXRhOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhLm1hcChyZW1vdmVUcmFjZSlcbiAgfVxuXG4gIGlmIChkYXRhID09PSBPYmplY3QoZGF0YSkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gXCJ0cmFjZVwiKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIHJlbW92ZVRyYWNlKHZhbHVlKV0pLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJ1bnRpbWVMaWJyYXJpZXMoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgY3AgPSB7XG4gICAgLi4uZGF0YSxcbiAgfVxuXG4gIGlmIChkYXRhLnJ1bnRpbWUpIHtcbiAgICBjcC5ydW50aW1lID0ge1xuICAgICAgLi4uZGF0YS5ydW50aW1lLFxuICAgIH1cblxuICAgIGRlbGV0ZSBjcC5ydW50aW1lLmxpYnJhcmllc1xuICB9XG5cbiAgcmV0dXJuIGNwXG59XG5cbmNvbnN0IGN1cnJlbnRWZXJzaW9uUmVnZXggPSAvXiguK0N1cnJlbnRWZXJzaW9uWzAtOUEtRl17OH0pWzAtOWEtZl17MzJ9JC9cblxuLy8gTWF0Y2hlcyA2NC1jaGFyIGhleCBzdHJpbmdzIHVzZWQgYXMgQ0RLIGFzc2V0IGNvbnRlbnQgaGFzaGVzLlxuY29uc3QgYXNzZXRDb250ZW50SGFzaFJlZ2V4ID0gL1swLTlhLWZdezY0fS9nXG5cbi8vIE1hdGNoZXMgdGhlIHNob3J0IDgtY2hhciBoYXNoIHN1ZmZpeCBpbiBDREsgUGlwZWxpbmVzIGFzc2V0IGlkZW50aWZpZXJzLFxuLy8gZS5nLiBcInNuYXBzaG90LXZhbHVlOjEyMzQ1Njc4OTAxMi1ldS13ZXN0LTEtMGU5NGY5ZGVcIi5cbmNvbnN0IHBpcGVsaW5lc0Fzc2V0SWRTdWZmaXhSZWdleCA9XG4gIC8oc25hcHNob3QtdmFsdWU6XFxkKy1bYS16MC05LV0rLSlbMC05YS1mXXs4fS9nXG5cbi8qKlxuICogTWF0Y2ggYSByZXNvdXJjZSBjcmVhdGVkIGJ5IGBsYW1iZGEuRnVuY3Rpb24uY3VycmVudFZlcnNpb25gLCB3aGljaFxuICogd2lsbCBpbmNsdWRlIHRoZSBhc3NldCBoYXNoIGFzIHBhcnQgb2YgdGhlIHJlb3VzcmNlIG5hbWUgYW5kIHJldHVyblxuICogYSBzbmFwc2hvdC1mcmllbmRseSB2ZXJzaW9uIG9mIGl0IGlmIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZXdyaXRlQ3VycmVudFZlcnNpb25JZkZvdW5kKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSBjdXJyZW50VmVyc2lvblJlZ2V4LmV4ZWModmFsdWUpXG4gIHJldHVybiBtYXRjaCA/IGAke21hdGNoWzFdfXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4YCA6IG51bGxcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlKGRhdGE6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21UZW1wbGF0ZSlcbiAgfVxuXG4gIGlmIChkYXRhID09PSBPYmplY3QoZGF0YSkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Q3VycmVudFZlcnNpb24gPSByZXdyaXRlQ3VycmVudFZlcnNpb25JZkZvdW5kKGtleSlcbiAgICAgICAgICBpZiAobmV3Q3VycmVudFZlcnNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3Q3VycmVudFZlcnNpb24sIHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21UZW1wbGF0ZSh2YWx1ZSldXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoXCJBc3NldFBhcmFtZXRlclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAga2V5ID09PSBcIlJlZlwiICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHZhbHVlLmluY2x1ZGVzKFwiQXNzZXRQYXJhbWV0ZXJzXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW2tleSwgXCJzbmFwc2hvdC12YWx1ZVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBrZXkgPT09IFwiYXdzOmFzc2V0OnBhdGhcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAvYXNzZXRcXC5bMC05YS1mXXs2NH0vLnRlc3QodmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW2tleSwgXCJhc3NldC5zbmFwc2hvdC12YWx1ZVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW2tleSwgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlKHZhbHVlKV1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoaXQpOiBpdCBpcyBbXSA9PiBpdCAhPSBudWxsKSxcbiAgICApXG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBuZXdDdXJyZW50VmVyc2lvbiA9IHJld3JpdGVDdXJyZW50VmVyc2lvbklmRm91bmQoZGF0YSlcbiAgICBpZiAobmV3Q3VycmVudFZlcnNpb24pIHtcbiAgICAgIHJldHVybiBuZXdDdXJyZW50VmVyc2lvblxuICAgIH1cblxuICAgIHJldHVybiBkYXRhXG4gICAgICAucmVwbGFjZShhc3NldENvbnRlbnRIYXNoUmVnZXgsIFwic25hcHNob3QtdmFsdWVcIilcbiAgICAgIC5yZXBsYWNlKHBpcGVsaW5lc0Fzc2V0SWRTdWZmaXhSZWdleCwgXCIkMXNuYXBzaG90LXZhbHVlXCIpXG4gIH1cblxuICByZXR1cm4gZGF0YVxufVxuXG5mdW5jdGlvbiByZW1vdmVBc3NldERldGFpbHNGcm9tTWFuaWZlc3QoZGF0YTogYW55KTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAocmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0KVxuICB9XG5cbiAgaWYgKGRhdGEgPT09IE9iamVjdChkYXRhKSkge1xuICAgIC8vIGF3czpjZGs6YXNzZXQgaW4gbWV0YWRhdGFcbiAgICBpZiAoZGF0YS50eXBlID09PSBcImF3czpjZGs6YXNzZXRcIiAmJiBcImRhdGFcIiBpbiBkYXRhKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBkYXRhOiBcInNuYXBzaG90LXZhbHVlXCIsXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoXCJBc3NldFBhcmFtZXRlcnNcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBba2V5LCByZW1vdmVBc3NldERldGFpbHNGcm9tTWFuaWZlc3QodmFsdWUpXVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChpdCk6IGl0IGlzIFtdID0+IGl0ICE9IG51bGwpLFxuICAgIClcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG5ld0N1cnJlbnRWZXJzaW9uID0gcmV3cml0ZUN1cnJlbnRWZXJzaW9uSWZGb3VuZChkYXRhKVxuICAgIGlmIChuZXdDdXJyZW50VmVyc2lvbikge1xuICAgICAgcmV0dXJuIG5ld0N1cnJlbnRWZXJzaW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgICAgIC5yZXBsYWNlKGFzc2V0Q29udGVudEhhc2hSZWdleCwgXCJzbmFwc2hvdC12YWx1ZVwiKVxuICAgICAgLnJlcGxhY2UocGlwZWxpbmVzQXNzZXRJZFN1ZmZpeFJlZ2V4LCBcIiQxc25hcHNob3QtdmFsdWVcIilcbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBDREtNZXRhZGF0YSByZXNvdXJjZXMgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzeW50aGVzaXplZFxuICogdGVtcGxhdGUgc2luY2UgQ0RLIDEuNjMuMC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2RrTWV0YWRhdGFSZXNvdXJjZUZyb21UZW1wbGF0ZShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCBjcCA9IHtcbiAgICAuLi5kYXRhLFxuICAgIFJlc291cmNlczoge1xuICAgICAgLi4uZGF0YS5SZXNvdXJjZXMsXG4gICAgfSxcbiAgfVxuXG4gIGRlbGV0ZSBjcC5SZXNvdXJjZXMuQ0RLTWV0YWRhdGFcbiAgcmV0dXJuIGNwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTWFuaWZlc3RGb3JTbmFwc2hvdChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UoY29udGVudClcbiAgY29uc3Qgb3V0cHV0ID0gW1xuICAgIHJlbW92ZVZlcnNpb24sXG4gICAgLy8gUmVtb3ZlIHRoZSBydW50aW1lIHZlcnNpb24gaW5mb3JtYXRpb24gc28gaXQgZG9uJ3QgY29uZmxpY3Qgd2l0aCBDSVxuICAgIC8vIG9yIG90aGVyIHVzZXJzIGdlbmVyYXRpbmcgdGhlIHNuYXBzaG90cy5cbiAgICByZW1vdmVSdW50aW1lTGlicmFyaWVzLFxuICAgIC8vIFJlbW92ZSB0aGUgdHJhY2UgZnJvbSBtYW5pZmVzdCBmb3Igbm93LlxuICAgIHJlbW92ZVRyYWNlLFxuICAgIC8vIEF2b2lkIGRldGFpbHMgKGhhc2hlcykgZnJvbSBhc3NldHMuXG4gICAgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0LFxuICBdLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgaW5wdXQpXG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG91dHB1dCwgdW5kZWZpbmVkLCBcIiAgXCIpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdCBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlIHBlcnNpc3RlZFxuICogYXMgYSBzbmFwc2hvdCB3aXRob3V0IGNhdXNpbmcgaW52YWxpZGF0aW9ucyBmb3IgZXZlcnkgc3ludGhlc2l6ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZU1hbmlmZXN0RmlsZUZvclNuYXBzaG90KGZpbGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBwcmVwYXJlTWFuaWZlc3RGb3JTbmFwc2hvdChcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlLCBcInV0ZjhcIiksXG4gIClcblxuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZSwgcmVzdWx0KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRlbXBsYXRlRm9yU25hcHNob3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gIGNvbnN0IG91dHB1dCA9IFtcbiAgICByZW1vdmVDZGtNZXRhZGF0YVJlc291cmNlRnJvbVRlbXBsYXRlLFxuICAgIC8vIEF2b2lkIGRldGFpbHMgKGhhc2hlcykgZnJvbSBhc3NldHMuXG4gICAgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlLFxuICBdLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgaW5wdXQpXG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG91dHB1dCwgdW5kZWZpbmVkLCBcIiAgXCIpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGEgQ2xvdWQgQXNzZW1ibHkgdGVtcGxhdGUgZmlsZSBzbyB0aGF0IGl0IGNhbiBiZSBwZXJzaXN0ZWRcbiAqIGFzIGEgc25hcHNob3Qgd2l0aG91dCBjYXVzaW5nIGludmFsaWRhdGlvbnMgZm9yIG1pbm9yIGNoYW5nZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVUZW1wbGF0ZUZpbGVGb3JTbmFwc2hvdChmaWxlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gcHJlcGFyZVRlbXBsYXRlRm9yU25hcHNob3QoXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZSwgXCJ1dGY4XCIpLFxuICApXG5cbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGUsIHJlc3VsdClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ2xvdWQgQXNzZW1ibHkgdG8gYSBzbmFwc2hvdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNsb3VkQXNzZW1ibHlTbmFwc2hvdChcbiAgc3JjOiBzdHJpbmcsXG4gIGRzdDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlc3RBYnMgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZHN0KVxuICBjb25zdCBzcmNBYnMgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgc3JjKVxuXG4gIC8vIENvcHkgYWxsIGZpbGVzIGZyb20gc3JjIChjZGsub3V0KSB0byBkZXN0IChfX3NuYXBzaG90c19fKVxuICBmcy5jcFN5bmMoc3JjQWJzLCBkZXN0QWJzLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gIGNvbnN0IGV4cGFuZEdsb2IgPSAocGF0dGVybjogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gZnMuZ2xvYlN5bmMocGF0dGVybiwgeyBjd2QgfSkubWFwKChwKSA9PiBwYXRoLmpvaW4oY3dkLCBwKSlcbiAgfVxuXG4gIGNvbnN0IGZpbGVzVG9EZWxldGUgPSBbXG4gICAgLy8gRG9uJ3Qga2VlcCB0cmFjayBvZiBtYW5pZmVzdCB2ZXJzaW9uLlxuICAgIFwiKiovY2RrLm91dFwiLFxuXG4gICAgLy8gVGhlIHRyZWUgZmlsZSBkb2Vzbid0IGdpdmUgdXMgbXVjaCB2YWx1ZSBhcyBwYXJ0IG9mIHRoZSBzbmFwc2hvdC5cbiAgICBcIioqL3RyZWUuanNvblwiLFxuXG4gICAgLy8gUmVtb3ZlIGFzc2V0IGNvbnRlbnRzIGZvciBub3cuXG4gICAgXCIqKi9hc3NldC4qXCIsXG5cbiAgICAvLyBSZW1vdmUgYXNzZXQgY29uZmlncyBzbyB3ZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSBzbmFwc2hvdHMgZm9yIGFzc2V0IGNoYW5nZXMuXG4gICAgXCIqKi8qLmFzc2V0cy5qc29uXCIsXG5cbiAgICAvLyBSZW1vdmUgZ3JhcGh2aXogZmlsZXMgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgQ0RLIFBpcGVsaW5lc1xuICAgIFwiKiovKi5kb3RcIixcbiAgXS5mbGF0TWFwKChnKSA9PiBleHBhbmRHbG9iKGcsIGRlc3RBYnMpKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVzVG9EZWxldGUubWFwKChwKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocCwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSksXG4gICAgKSxcbiAgKVxuXG4gIGNvbnN0IG1hbmlmZXN0RmlsZXMgPSBbXG4gICAgLy8gVHJhbnNmb3JtIHRoZSBtYW5pZmVzdCB0byBiZSBtb3JlIHNuYXBzaG90IGZyaWVuZGx5LlxuICAgIFwiKiovbWFuaWZlc3QuanNvblwiLFxuICBdLmZsYXRNYXAoKGcpID0+IGV4cGFuZEdsb2IoZywgZGVzdEFicykpXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIG1hbmlmZXN0RmlsZXMpIHtcbiAgICBhd2FpdCBwcmVwYXJlTWFuaWZlc3RGaWxlRm9yU25hcHNob3QoZmlsZSlcbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlRmlsZXMgPSBbXG4gICAgLy8gVHJhbnNmb3JtIGFsbCB0ZW1wbGF0ZXMuXG4gICAgXCIqKi8qLnRlbXBsYXRlLmpzb25cIixcbiAgXS5mbGF0TWFwKChnKSA9PiBleHBhbmRHbG9iKGcsIGRlc3RBYnMpKVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiB0ZW1wbGF0ZUZpbGVzKSB7XG4gICAgYXdhaXQgcHJlcGFyZVRlbXBsYXRlRmlsZUZvclNuYXBzaG90KGZpbGUpXG4gIH1cbn1cbiJdfQ==
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NuYXBzaG90cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUVqQyxTQUFTLGFBQWEsQ0FBQyxJQUFTO0lBQzlCLE1BQU0sRUFBRSxHQUFHO1FBQ1QsR0FBRyxJQUFJO0tBQ1IsQ0FBQTtJQUVELE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQTtJQUNqQixPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFTO0lBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQStCLENBQUM7YUFDNUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQzthQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDcEQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLElBQVM7SUFDdkMsTUFBTSxFQUFFLEdBQUc7UUFDVCxHQUFHLElBQUk7S0FDUixDQUFBO0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIs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RUFBRSxDQUNyQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQ25DLENBQ0YsQ0FDRixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmZ1bmN0aW9uIHJlbW92ZVZlcnNpb24oZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgY3AgPSB7XG4gICAgLi4uZGF0YSxcbiAgfVxuXG4gIGRlbGV0ZSBjcC52ZXJzaW9uXG4gIHJldHVybiBjcFxufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFjZShkYXRhOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhLm1hcChyZW1vdmVUcmFjZSlcbiAgfVxuXG4gIGlmIChkYXRhID09PSBPYmplY3QoZGF0YSkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSAhPT0gXCJ0cmFjZVwiKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIHJlbW92ZVRyYWNlKHZhbHVlKV0pLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJ1bnRpbWVMaWJyYXJpZXMoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgY3AgPSB7XG4gICAgLi4uZGF0YSxcbiAgfVxuXG4gIGlmIChkYXRhLnJ1bnRpbWUpIHtcbiAgICBjcC5ydW50aW1lID0ge1xuICAgICAgLi4uZGF0YS5ydW50aW1lLFxuICAgIH1cblxuICAgIGRlbGV0ZSBjcC5ydW50aW1lLmxpYnJhcmllc1xuICB9XG5cbiAgcmV0dXJuIGNwXG59XG5cbmNvbnN0IGN1cnJlbnRWZXJzaW9uUmVnZXggPSAvXiguK0N1cnJlbnRWZXJzaW9uWzAtOUEtRl17OH0pWzAtOWEtZl17MzJ9JC9cblxuLy8gTWF0Y2hlcyA2NC1jaGFyIGhleCBzdHJpbmdzIHVzZWQgYXMgQ0RLIGFzc2V0IGNvbnRlbnQgaGFzaGVzLlxuY29uc3QgYXNzZXRDb250ZW50SGFzaFJlZ2V4ID0gL1swLTlhLWZdezY0fS9nXG5cbi8vIE1hdGNoZXMgdGhlIHNob3J0IDgtY2hhciBoYXNoIHN1ZmZpeCBpbiBDREsgUGlwZWxpbmVzIGFzc2V0IGlkZW50aWZpZXJzLFxuLy8gZS5nLiBcInNuYXBzaG90LXZhbHVlOjEyMzQ1Njc4OTAxMi1ldS13ZXN0LTEtMGU5NGY5ZGVcIi5cbmNvbnN0IHBpcGVsaW5lc0Fzc2V0SWRTdWZmaXhSZWdleCA9XG4gIC8oc25hcHNob3QtdmFsdWU6XFxkKy1bYS16MC05LV0rLSlbMC05YS1mXXs4fS9nXG5cbi8qKlxuICogTWF0Y2ggYSByZXNvdXJjZSBjcmVhdGVkIGJ5IGBsYW1iZGEuRnVuY3Rpb24uY3VycmVudFZlcnNpb25gLCB3aGljaFxuICogd2lsbCBpbmNsdWRlIHRoZSBhc3NldCBoYXNoIGFzIHBhcnQgb2YgdGhlIHJlb3VzcmNlIG5hbWUgYW5kIHJldHVyblxuICogYSBzbmFwc2hvdC1mcmllbmRseSB2ZXJzaW9uIG9mIGl0IGlmIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZXdyaXRlQ3VycmVudFZlcnNpb25JZkZvdW5kKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSBjdXJyZW50VmVyc2lvblJlZ2V4LmV4ZWModmFsdWUpXG4gIHJldHVybiBtYXRjaCA/IGAke21hdGNoWzFdfXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4YCA6IG51bGxcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGFzc2V0IGhhc2hlcyBpbiBhIHN0cmluZyB2YWx1ZSB3aXRoIHN0YWJsZSBwbGFjZWhvbGRlcnMuXG4gKiBTaGFyZWQgYnkgYm90aCB0ZW1wbGF0ZSBhbmQgbWFuaWZlc3QvbWV0YWRhdGEgYXNzZXQgc3RyaXBwaW5nLlxuICovXG5mdW5jdGlvbiByZXBsYWNlQXNzZXRIYXNoZXNJblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbmV3Q3VycmVudFZlcnNpb24gPSByZXdyaXRlQ3VycmVudFZlcnNpb25JZkZvdW5kKHZhbHVlKVxuICBpZiAobmV3Q3VycmVudFZlcnNpb24pIHtcbiAgICByZXR1cm4gbmV3Q3VycmVudFZlcnNpb25cbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKGFzc2V0Q29udGVudEhhc2hSZWdleCwgXCJzbmFwc2hvdC12YWx1ZVwiKVxuICAgIC5yZXBsYWNlKHBpcGVsaW5lc0Fzc2V0SWRTdWZmaXhSZWdleCwgXCIkMXNuYXBzaG90LXZhbHVlXCIpXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21UZW1wbGF0ZShkYXRhOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhLm1hcChyZW1vdmVBc3NldERldGFpbHNGcm9tVGVtcGxhdGUpXG4gIH1cblxuICBpZiAoZGF0YSA9PT0gT2JqZWN0KGRhdGEpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0N1cnJlbnRWZXJzaW9uID0gcmV3cml0ZUN1cnJlbnRWZXJzaW9uSWZGb3VuZChrZXkpXG4gICAgICAgICAgaWYgKG5ld0N1cnJlbnRWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ld0N1cnJlbnRWZXJzaW9uLCByZW1vdmVBc3NldERldGFpbHNGcm9tVGVtcGxhdGUodmFsdWUpXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiQXNzZXRQYXJhbWV0ZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGtleSA9PT0gXCJSZWZcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICB2YWx1ZS5pbmNsdWRlcyhcIkFzc2V0UGFyYW1ldGVyc1wiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtrZXksIFwic25hcHNob3QtdmFsdWVcIl1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAga2V5ID09PSBcImF3czphc3NldDpwYXRoXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgL2Fzc2V0XFwuWzAtOWEtZl17NjR9Ly50ZXN0KHZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtrZXksIFwiYXNzZXQuc25hcHNob3QtdmFsdWVcIl1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtrZXksIHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21UZW1wbGF0ZSh2YWx1ZSldXG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGl0KTogaXQgaXMgW10gPT4gaXQgIT0gbnVsbCksXG4gICAgKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VBc3NldEhhc2hlc0luU3RyaW5nKGRhdGEpXG4gIH1cblxuICByZXR1cm4gZGF0YVxufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHN0cmlwIGFzc2V0LXJlbGF0ZWQgZGV0YWlscyAoaGFzaGVzLCBwYXJhbWV0ZXJzKSBmcm9tIGEgSlNPTlxuICogc3RydWN0dXJlLiBVc2VkIGZvciBib3RoIG1hbmlmZXN0Lmpzb24gKENESyA8IDIuMjQyLjAgd2l0aCBpbmxpbmUgbWV0YWRhdGEpXG4gKiBhbmQgc3RhbmRhbG9uZSAqLm1ldGFkYXRhLmpzb24gZmlsZXMgKENESyA+PSAyLjI0Mi4wKS5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0KGRhdGE6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21NYW5pZmVzdClcbiAgfVxuXG4gIGlmIChkYXRhID09PSBPYmplY3QoZGF0YSkpIHtcbiAgICAvLyBhd3M6Y2RrOmFzc2V0IGluIG1ldGFkYXRhXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gXCJhd3M6Y2RrOmFzc2V0XCIgJiYgXCJkYXRhXCIgaW4gZGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgZGF0YTogXCJzbmFwc2hvdC12YWx1ZVwiLFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiQXNzZXRQYXJhbWV0ZXJzXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW2tleSwgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0KHZhbHVlKV1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoaXQpOiBpdCBpcyBbXSA9PiBpdCAhPSBudWxsKSxcbiAgICApXG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcmVwbGFjZUFzc2V0SGFzaGVzSW5TdHJpbmcoZGF0YSlcbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBDREtNZXRhZGF0YSByZXNvdXJjZXMgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzeW50aGVzaXplZFxuICogdGVtcGxhdGUgc2luY2UgQ0RLIDEuNjMuMC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2RrTWV0YWRhdGFSZXNvdXJjZUZyb21UZW1wbGF0ZShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCBjcCA9IHtcbiAgICAuLi5kYXRhLFxuICAgIFJlc291cmNlczoge1xuICAgICAgLi4uZGF0YS5SZXNvdXJjZXMsXG4gICAgfSxcbiAgfVxuXG4gIGRlbGV0ZSBjcC5SZXNvdXJjZXMuQ0RLTWV0YWRhdGFcbiAgcmV0dXJuIGNwXG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdC5qc29uIGZvciBzbmFwc2hvdCB1c2UuXG4gKlxuICogT24gQ0RLIDwgMi4yNDIuMCB0aGUgbWFuaWZlc3QgY29udGFpbnMgaW5saW5lIG1ldGFkYXRhIHBlciBzdGFjayBhcnRpZmFjdC5cbiAqIE9uIENESyA+PSAyLjI0Mi4wIHRoYXQgbWV0YWRhdGEgaXMgZXh0cmFjdGVkIGludG8gc2VwYXJhdGUgZmlsZXMgKGhhbmRsZWRcbiAqIGJ5IHtAbGluayBzYW5pdGl6ZU1ldGFkYXRhfSksIGJ1dCB0aGUgbWFuaWZlc3Qgc3RpbGwgbmVlZHMgdmVyc2lvbixcbiAqIHJ1bnRpbWUsIHRyYWNlLCBhbmQgYXNzZXQgZGV0YWlsIHN0cmlwcGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplTWFuaWZlc3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gIGNvbnN0IG91dHB1dCA9IFtcbiAgICByZW1vdmVWZXJzaW9uLFxuICAgIC8vIFJlbW92ZSB0aGUgcnVudGltZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHNvIGl0IGRvbid0IGNvbmZsaWN0IHdpdGggQ0lcbiAgICAvLyBvciBvdGhlciB1c2VycyBnZW5lcmF0aW5nIHRoZSBzbmFwc2hvdHMuXG4gICAgcmVtb3ZlUnVudGltZUxpYnJhcmllcyxcbiAgICByZW1vdmVUcmFjZSxcbiAgICAvLyBBdm9pZCBkZXRhaWxzIChoYXNoZXMpIGZyb20gYXNzZXRzLlxuICAgIHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21NYW5pZmVzdCxcbiAgXS5yZWR1Y2UoKGFjYywgZm4pID0+IGZuKGFjYyksIGlucHV0KVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvdXRwdXQsIHVuZGVmaW5lZCwgXCIgIFwiKVxufVxuXG4vKipcbiAqIFNhbml0aXplIGFuIGV4dHJhY3RlZCBtZXRhZGF0YSBKU09OIGZpbGUgZm9yIHNuYXBzaG90IHVzZS5cbiAqXG4gKiBDREsgPj0gMi4yNDIuMCBleHRyYWN0cyBwZXItc3RhY2sgbWV0YWRhdGEgaW50byBzZXBhcmF0ZSAqLm1ldGFkYXRhLmpzb25cbiAqIGZpbGVzIChwcmV2aW91c2x5IHRoaXMgZGF0YSB3YXMgaW5saW5lIGluIG1hbmlmZXN0Lmpzb24pLiBUaGlzIGZ1bmN0aW9uXG4gKiBhcHBsaWVzIHRoZSBzYW1lIHNhbml0aXphdGlvbiAodHJhY2UgcmVtb3ZhbCwgYXNzZXQgZGV0YWlsIHN0cmlwcGluZykgc29cbiAqIHNuYXBzaG90cyByZW1haW4gc3RhYmxlIGFjcm9zcyBzeW50aGVzaXplcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplTWV0YWRhdGEoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gIGNvbnN0IG91dHB1dCA9IFtyZW1vdmVUcmFjZSwgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0XS5yZWR1Y2UoXG4gICAgKGFjYywgZm4pID0+IGZuKGFjYyksXG4gICAgaW5wdXQsXG4gIClcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3V0cHV0LCB1bmRlZmluZWQsIFwiICBcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplVGVtcGxhdGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gIGNvbnN0IG91dHB1dCA9IFtcbiAgICByZW1vdmVDZGtNZXRhZGF0YVJlc291cmNlRnJvbVRlbXBsYXRlLFxuICAgIC8vIEF2b2lkIGRldGFpbHMgKGhhc2hlcykgZnJvbSBhc3NldHMuXG4gICAgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlLFxuICBdLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgaW5wdXQpXG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG91dHB1dCwgdW5kZWZpbmVkLCBcIiAgXCIpXG59XG5cbi8qKlxuICogUmVhZCBhIGZpbGUsIGFwcGx5IGEgdHJhbnNmb3JtLCBhbmQgd3JpdGUgdGhlIHJlc3VsdCBiYWNrLlxuICovXG5hc3luYyBmdW5jdGlvbiB0cmFuc2Zvcm1GaWxlSW5QbGFjZShcbiAgZmlsZTogc3RyaW5nLFxuICB0cmFuc2Zvcm06IChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSB0cmFuc2Zvcm0oYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZSwgXCJ1dGY4XCIpKVxuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZSwgcmVzdWx0KVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbG91ZCBBc3NlbWJseSB0byBhIHNuYXBzaG90LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2xvdWRBc3NlbWJseVNuYXBzaG90KFxuICBzcmM6IHN0cmluZyxcbiAgZHN0OiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVzdEFicyA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBkc3QpXG4gIGNvbnN0IHNyY0FicyA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBzcmMpXG5cbiAgLy8gQ29weSBhbGwgZmlsZXMgZnJvbSBzcmMgKGNkay5vdXQpIHRvIGRlc3QgKF9fc25hcHNob3RzX18pXG4gIGZzLmNwU3luYyhzcmNBYnMsIGRlc3RBYnMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgY29uc3QgZXhwYW5kR2xvYiA9IChwYXR0ZXJuOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIHJldHVybiBmcy5nbG9iU3luYyhwYXR0ZXJuLCB7IGN3ZCB9KS5tYXAoKHApID0+IHBhdGguam9pbihjd2QsIHApKVxuICB9XG5cbiAgY29uc3QgZmlsZXNUb0RlbGV0ZSA9IFtcbiAgICAvLyBEb24ndCBrZWVwIHRyYWNrIG9mIG1hbmlmZXN0IHZlcnNpb24uXG4gICAgXCIqKi9jZGsub3V0XCIsXG5cbiAgICAvLyBUaGUgdHJlZSBmaWxlIGRvZXNuJ3QgZ2l2ZSB1cyBtdWNoIHZhbHVlIGFzIHBhcnQgb2YgdGhlIHNuYXBzaG90LlxuICAgIFwiKiovdHJlZS5qc29uXCIsXG5cbiAgICAvLyBSZW1vdmUgYXNzZXQgY29udGVudHMgZm9yIG5vdy5cbiAgICBcIioqL2Fzc2V0LipcIixcblxuICAgIC8vIFJlbW92ZSBhc3NldCBjb25maWdzIHNvIHdlIGRvbid0IGhhdmUgdG8gdXBkYXRlIHNuYXBzaG90cyBmb3IgYXNzZXQgY2hhbmdlcy5cbiAgICBcIioqLyouYXNzZXRzLmpzb25cIixcblxuICAgIC8vIFJlbW92ZSBncmFwaHZpeiBmaWxlcyBnZW5lcmF0ZWQgd2hlbiB1c2luZyBDREsgUGlwZWxpbmVzXG4gICAgXCIqKi8qLmRvdFwiLFxuICBdLmZsYXRNYXAoKGcpID0+IGV4cGFuZEdsb2IoZywgZGVzdEFicykpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXNUb0RlbGV0ZS5tYXAoKHApID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9KSxcbiAgICApLFxuICApXG5cbiAgY29uc3QgZmlsZVRyYW5zZm9ybXM6IFJlY29yZDxzdHJpbmcsIChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gICAgXCIqKi9tYW5pZmVzdC5qc29uXCI6IHNhbml0aXplTWFuaWZlc3QsXG4gICAgLy8gQ0RLID49IDIuMjQyLjAgZXh0cmFjdHMgcGVyLXN0YWNrIG1ldGFkYXRhIGludG8gc2VwYXJhdGUgZmlsZXMuXG4gICAgLy8gTm8gbWF0Y2hlcyBvbiBvbGRlciBDREsg4oCUIHNhZmUgdG8gcHJvY2VzcyB1bmNvbmRpdGlvbmFsbHkuXG4gICAgXCIqKi8qLm1ldGFkYXRhLmpzb25cIjogc2FuaXRpemVNZXRhZGF0YSxcbiAgICBcIioqLyoudGVtcGxhdGUuanNvblwiOiBzYW5pdGl6ZVRlbXBsYXRlLFxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgT2JqZWN0LmVudHJpZXMoZmlsZVRyYW5zZm9ybXMpLmZsYXRNYXAoKFtwYXR0ZXJuLCB0cmFuc2Zvcm1dKSA9PlxuICAgICAgZXhwYW5kR2xvYihwYXR0ZXJuLCBkZXN0QWJzKS5tYXAoKGYpID0+XG4gICAgICAgIHRyYW5zZm9ybUZpbGVJblBsYWNlKGYsIHRyYW5zZm9ybSksXG4gICAgICApLFxuICAgICksXG4gIClcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "3.20.24",
3
+ "version": "3.21.0",
4
4
  "description": "CDK library for Liflig",
5
5
  "type": "module",
6
6
  "repository": {