@sot1986/appsync-precognition 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -3
- package/dist/index.js +46 -9
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ declare const names: {
|
|
|
28
28
|
readonly email: "email";
|
|
29
29
|
readonly url: "url";
|
|
30
30
|
readonly uuid: "uuid";
|
|
31
|
+
readonly ulid: "ulid";
|
|
31
32
|
readonly regex: "regex";
|
|
32
33
|
readonly in: "in";
|
|
33
34
|
readonly notIn: "notIn";
|
|
@@ -39,7 +40,8 @@ declare function requiredRule<T>(value: T, ..._params: string[]): Rule<T>;
|
|
|
39
40
|
//#endregion
|
|
40
41
|
//#region src/index.d.ts
|
|
41
42
|
declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
|
|
42
|
-
declare function
|
|
43
|
+
declare function precognitiveValidation<T extends object>(ctx: Context<T>, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
|
|
44
|
+
declare function formatAttributeName(path: string): string;
|
|
43
45
|
//#endregion
|
|
44
|
-
export {
|
|
45
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
46
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
47
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcnVsZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7VUFFaUI7OztTQUdSOztLQUdHLDhCQUE4QixPQUFPO0tBRTVDLGlDQUNELG9DQUNFLFVBQVU7S0FPWCwrQkFDRCxzQkFDRSxVQUFVLFdBQ0o7VUFFRixjQUFBOzs7S0FJRSxpQkFBaUIsVUFBVSw2QkFDbkMsVUFBVSx5QkFFUixVQUFVLDBEQUdMLFdBQVcsTUFBTSxFQUFFLHlCQUNiLFdBQVcsS0FBSyxHQUFHLFNBQVMsWUFBWSxFQUFFLFVBQzdDLHNCQUNFLDRDQUVFLHdDQUNlLFlBQVk7Ozs7Y0NwQ2hDOzs7Ozs7Ozs7Ozs7Ozs7OztpQkFrQkcsZ0JBQWdCLFNBQVMsdUJBQXVCLFNBQVMsS0FBSztpQkEwTTlELHVCQUF1QiwwQkFBMEIsS0FBSzs7O2lCQzFOdEQsZ0NBQ1QsV0FDRyxRQUFRLE9BQU8sWUFBWSxLQUFLLHVCQUF1Qiw0QkFBa0IsWUFDaEY7aUJBNENhLDhDQUNULFFBQVEsWUFDTCxRQUFRLE9BQU8sWUFBWSxLQUFLLHVCQUF1Qiw0QkFBa0IsWUFDaEY7aUJBd0JhLG1CQUFBIn0=
|
package/dist/index.js
CHANGED
|
@@ -43,13 +43,15 @@ function parse(value, rule) {
|
|
|
43
43
|
case "nullable": return nullableRule(value);
|
|
44
44
|
case "sometimes": return sometimesRule(value);
|
|
45
45
|
case "min": return minRule(value, ...params.split(","));
|
|
46
|
-
case "max": return maxRule(value, ...params.split(",
|
|
47
|
-
case "between": return betweenRule(value, ...params.split(",
|
|
46
|
+
case "max": return maxRule(value, ...params.split(","));
|
|
47
|
+
case "between": return betweenRule(value, ...params.split(","));
|
|
48
48
|
case "email": return emailRule(value);
|
|
49
49
|
case "url": return urlRule(value);
|
|
50
50
|
case "uuid": return uuidRule(value);
|
|
51
|
+
case "ulid": return ulidRule(value);
|
|
51
52
|
case "regex": return regexRule(value, params);
|
|
52
|
-
case "in": return inRule(value, ...params.split(",
|
|
53
|
+
case "in": return inRule(value, ...params.split(","));
|
|
54
|
+
case "notIn": return notInRule(value, ...params.split(","));
|
|
53
55
|
default: return {
|
|
54
56
|
check: false,
|
|
55
57
|
message: `Unknown rule ${ruleName}`,
|
|
@@ -115,7 +117,7 @@ function emailRule(value) {
|
|
|
115
117
|
message: ":attribute must be a valid email address",
|
|
116
118
|
value
|
|
117
119
|
};
|
|
118
|
-
if (typeof value === "string") result.check = util.matches("^[
|
|
120
|
+
if (typeof value === "string") result.check = util.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", result.value);
|
|
119
121
|
return result;
|
|
120
122
|
}
|
|
121
123
|
function urlRule(value) {
|
|
@@ -124,7 +126,7 @@ function urlRule(value) {
|
|
|
124
126
|
message: ":attribute must be a valid URL",
|
|
125
127
|
value
|
|
126
128
|
};
|
|
127
|
-
if (typeof value === "string") result.check = util.matches("^(
|
|
129
|
+
if (typeof value === "string") result.check = util.matches("^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$|^https?:\\/\\/(localhost|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(:\\d+)?(\\/.*)?$", result.value);
|
|
128
130
|
return result;
|
|
129
131
|
}
|
|
130
132
|
function uuidRule(value) {
|
|
@@ -136,6 +138,15 @@ function uuidRule(value) {
|
|
|
136
138
|
if (typeof result.value === "string") result.check = util.matches("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", value);
|
|
137
139
|
return result;
|
|
138
140
|
}
|
|
141
|
+
function ulidRule(value) {
|
|
142
|
+
const result = {
|
|
143
|
+
check: false,
|
|
144
|
+
message: ":attribute must be a valid ULID",
|
|
145
|
+
value
|
|
146
|
+
};
|
|
147
|
+
if (typeof result.value === "string") result.check = util.matches("^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$", value);
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
139
150
|
function regexRule(value, ...params) {
|
|
140
151
|
const regex = params[0] ?? "";
|
|
141
152
|
const result = {
|
|
@@ -159,6 +170,16 @@ function inRule(value, ...params) {
|
|
|
159
170
|
if (typeof value === "number") result.check = params.map(Number).includes(value);
|
|
160
171
|
return result;
|
|
161
172
|
}
|
|
173
|
+
function notInRule(value, ...params) {
|
|
174
|
+
const result = {
|
|
175
|
+
check: false,
|
|
176
|
+
message: ":attribute must not be one of the specified values",
|
|
177
|
+
value
|
|
178
|
+
};
|
|
179
|
+
if (typeof result.value === "string") result.check = !params.includes(result.value);
|
|
180
|
+
if (typeof value === "number") result.check = !params.map(Number).includes(value);
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
162
183
|
function requiredRule(value, ..._params) {
|
|
163
184
|
const result = {
|
|
164
185
|
check: true,
|
|
@@ -168,7 +189,12 @@ function requiredRule(value, ..._params) {
|
|
|
168
189
|
if (typeof result.value === "string") result.check = result.value.length > 0;
|
|
169
190
|
if (isArray(result.value)) result.check = result.value.length > 0;
|
|
170
191
|
if (typeof result.value === "number") result.check = true;
|
|
171
|
-
if (
|
|
192
|
+
if (typeof value === "boolean") result.check = true;
|
|
193
|
+
if (typeof result.value === "object" && !result.value) {
|
|
194
|
+
result.message = ":attribute is not nullable";
|
|
195
|
+
result.check = false;
|
|
196
|
+
}
|
|
197
|
+
if (typeof result.value === "undefined") result.check = false;
|
|
172
198
|
return result;
|
|
173
199
|
}
|
|
174
200
|
function nullableRule(value, ..._params) {
|
|
@@ -185,6 +211,10 @@ function sometimesRule(value, ..._params) {
|
|
|
185
211
|
value
|
|
186
212
|
};
|
|
187
213
|
if (typeof result.value === "undefined") return result;
|
|
214
|
+
if (typeof result.value === "object" && !result.value) {
|
|
215
|
+
result.message = ":attribute is not nullable";
|
|
216
|
+
result.check = false;
|
|
217
|
+
}
|
|
188
218
|
return requiredRule(value, ..._params);
|
|
189
219
|
}
|
|
190
220
|
|
|
@@ -207,6 +237,7 @@ function validate(obj, checks) {
|
|
|
207
237
|
const result = typeof rule === "string" ? parse(value, rule) : { ...rule };
|
|
208
238
|
if (result.check) return;
|
|
209
239
|
hasErrors = true;
|
|
240
|
+
result.message = result.message.replace(":attribute", formatAttributeName(path));
|
|
210
241
|
errorMessages.push(result.message);
|
|
211
242
|
util.appendError(result.message, "ValidationError", null, {
|
|
212
243
|
path,
|
|
@@ -218,7 +249,7 @@ function validate(obj, checks) {
|
|
|
218
249
|
if (hasErrors) util.error(errorMessages[0], "ValidationError");
|
|
219
250
|
return obj;
|
|
220
251
|
}
|
|
221
|
-
function
|
|
252
|
+
function precognitiveValidation(ctx, checks) {
|
|
222
253
|
if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks);
|
|
223
254
|
const validationKeys = precognitiveKeys(ctx);
|
|
224
255
|
util.http.addResponseHeader("Precognition", "true");
|
|
@@ -236,7 +267,13 @@ function precognition(ctx, checks) {
|
|
|
236
267
|
util.http.addResponseHeader("Precognition-Success", "true");
|
|
237
268
|
runtime.earlyReturn(null);
|
|
238
269
|
}
|
|
270
|
+
function formatAttributeName(path) {
|
|
271
|
+
return path.split(".").reduce((acc, part) => {
|
|
272
|
+
if (util.matches("^d+$", part)) return acc;
|
|
273
|
+
return acc ? `${acc} ${part.toLowerCase()}` : part.toLowerCase();
|
|
274
|
+
}, "");
|
|
275
|
+
}
|
|
239
276
|
|
|
240
277
|
//#endregion
|
|
241
|
-
export {
|
|
242
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogQ29udGV4dCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3R4LnJlcXVlc3QuaGVhZGVycylcbiAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0pID0+IHR5cGVvZiBwcmV2ID09PSAnc3RyaW5nJ1xuICAgICAgPyBwcmV2XG4gICAgICA6IChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBudWxsKSwgbnVsbCBhcyBzdHJpbmcgfCBudWxsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb2duaXRpdmVSZXF1ZXN0KGN0eDogQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0SGVhZGVyKCdwcmVjb2duaXRpb24nLCBjdHgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGl2ZUtleXMoY3R4OiBDb250ZXh0KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuICByZXR1cm4gcGFyc2VkXG59XG4iLCJpbXBvcnQgdHlwZSB7IFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBuYW1lcyA9IHtcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIG51bGxhYmxlOiAnbnVsbGFibGUnLFxuICBzb21ldGltZXM6ICdzb21ldGltZXMnLFxuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHJlZ2V4OiAncmVnZXgnLFxuICBpbjogJ2luJyxcbiAgbm90SW46ICdub3RJbicsXG4gIGJlZm9yZTogJ2JlZm9yZScsXG4gIGFmdGVyOiAnYWZ0ZXInLFxufSBhcyBjb25zdFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VD4odmFsdWU6IFQsIHJ1bGU6IFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgbmFtZXM+KTogUnVsZTxUPiB7XG4gIGNvbnN0IFtydWxlTmFtZSwgcGFyYW1zXSA9IHJ1bGUuaW5jbHVkZXMoJzonKSA/IHJ1bGUuc3BsaXQoJzonLCAyKSA6IFtydWxlLCAnJ11cblxuICBzd2l0Y2ggKHJ1bGVOYW1lIGFzIGtleW9mIHR5cGVvZiBuYW1lcykge1xuICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG4gICAgY2FzZSAnbnVsbGFibGUnOlxuICAgICAgcmV0dXJuIG51bGxhYmxlUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdzb21ldGltZXMnOlxuICAgICAgcmV0dXJuIHNvbWV0aW1lc1J1bGUodmFsdWUpXG4gICAgY2FzZSAnbWluJzpcbiAgICAgIHJldHVybiBtaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBjYXNlICdtYXgnOlxuICAgICAgcmV0dXJuIG1heFJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCAnKSlcbiAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgIHJldHVybiBiZXR3ZWVuUnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsICcpKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtcylcbiAgICBjYXNlICdpbic6XG4gICAgICByZXR1cm4gaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywgJykpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNoZWNrOiBmYWxzZSwgbWVzc2FnZTogYFVua25vd24gcnVsZSAke3J1bGVOYW1lfWAsIHZhbHVlIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW5WYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSAocmVzdWx0LnZhbHVlKS5sZW5ndGggPj0gbWluVmFsdWVcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5WYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBtYXhSdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXhWYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGF0IG1vc3QgJHttYXhWYWx1ZX0gY2hhcmFjdGVyc2BcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJldHdlZW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1sxXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgKHJlc3VsdC52YWx1ZSkubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBlbWFpbFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcygnXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskJywgcmVzdWx0LnZhbHVlIGFzIHN0cmluZylcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeKGh0dHB8aHR0cHMpOlxcXFwvXFxcXC9bXFxcXHdcXFxcLV9dKyhcXFxcLltcXFxcd1xcXFwtX10rKSsoW1xcXFx3XFxcXC1cXFxcLixAP149JSY6L35cXFxcKyNdKltcXFxcd1xcXFwtXFxcXEA/Xj0lJi9+XFxcXCsjXSk/JCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHV1aWRSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIFVVSUQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWdleFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVnZXggPSBwYXJhbXNbMF0gPz8gJydcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLmluY2x1ZGVzKHJlc3VsdC52YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5tYXAoTnVtYmVyKS5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFJ1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBpcyByZXF1aXJlZCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAoaXNBcnJheShyZXN1bHQudmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHJlc3VsdC5jaGVjayA9PT0gZmFsc2UpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIHJlcXVpcmVkJ1xuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzb21ldGltZXNSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUsIC4uLl9wYXJhbXMpXG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mLCBSdWxlLCBTaG9ydFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgcnVsZXNbJ25hbWVzJ10+IHwgUnVsZSlbXT4+LFxuKTogVCB7XG4gIGxldCBoYXNFcnJvcnMgPSBmYWxzZVxuICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpIDogeyAuLi5ydWxlIH1cbiAgICAgIGlmIChyZXN1bHQuY2hlY2spXG4gICAgICAgIHJldHVyblxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKHJlc3VsdC5tZXNzYWdlKVxuICAgICAgdXRpbC5hcHBlbmRFcnJvcihyZXN1bHQubWVzc2FnZSwgJ1ZhbGlkYXRpb25FcnJvcicsIG51bGwsIHsgcGF0aCwgdmFsdWUgfSlcbiAgICAgIGlmIChydWxlID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgdXRpbC5lcnJvcihlcnJvck1lc3NhZ2VzWzBdLCAnVmFsaWRhdGlvbkVycm9yJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgY3R4OiBDb250ZXh0PFQ+LFxuICBjaGVja3M6IFBhcnRpYWw8UmVjb3JkPE5lc3RlZEtleU9mPFQ+LCAoU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBydWxlc1snbmFtZXMnXT4gfCBSdWxlKVtdPj4sXG4pOiBUIHtcbiAgaWYgKCFpc1ByZWNvZ25pdGl2ZVJlcXVlc3QoY3R4KSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICB9XG4gIGNvbnN0IHZhbGlkYXRpb25LZXlzID0gcHJlY29nbml0aXZlS2V5cyhjdHgpXG4gIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uJywgJ3RydWUnKVxuXG4gIGlmICghdmFsaWRhdGlvbktleXMpIHtcbiAgICB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICAgIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uLVN1Y2Nlc3MnLCAndHJ1ZScpXG4gICAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxuICB9XG5cbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tVmFsaWRhdGUtT25seScsIHZhbGlkYXRpb25LZXlzLmpvaW4oJywnKSlcbiAgY29uc3QgcHJlY29nbml0aW9uQ2hlY2tzID0ge30gYXMgUGFydGlhbDx0eXBlb2YgY2hlY2tzPlxuICB2YWxpZGF0aW9uS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBwcmVjb2duaXRpb25DaGVja3Nba2V5IGFzIE5lc3RlZEtleU9mPFQ+XSA9IGNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dXG4gIH0pXG5cbiAgdmFsaWRhdGUoY3R4LmFyZ3MsIHByZWNvZ25pdGlvbkNoZWNrcylcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFRQSxTQUFnQixRQUFRLE9BQW9DO0FBQzFELEtBQUksT0FBTyxVQUFVLFlBQVksQ0FBQyxDQUFDLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxDQUN4RSxRQUFPLE9BQVEsTUFBb0IsV0FBVztBQUVoRCxRQUFPOztBQUdULFNBQWdCLGVBQWlDLEtBQVEsTUFBMkI7QUFDbEYsUUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQWlCLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUyxJQUFJLEdBQzlFLFFBQXNCLE9BQU8sSUFBSSxJQUNqQyxRQUFvQyxNQUFNLElBQUk7O0FBR3JELFNBQWdCLGVBQWlDLEtBQVEsTUFBc0IsT0FBc0I7Q0FDbkcsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQzVCLEtBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsTUFBSSxLQUFLLE1BQTBCO0FBQ25DOztDQUVGLE1BQU0sVUFBVSxLQUFLLEtBQUs7Q0FDMUIsTUFBTSxlQUFlLGVBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFtQjtBQUMxRSxLQUFJLE9BQU8saUJBQWlCLFlBQVksQ0FBQyxDQUFDLGFBQ3hDLGNBQWEsV0FBVzs7QUFJNUIsU0FBZ0IsVUFBVSxNQUFjLEtBQTZCO0FBQ25FLFFBQU8sT0FBTyxRQUFRLElBQUksUUFBUSxRQUFRLENBQ3ZDLFFBQVEsTUFBTSxDQUFDLEtBQUssV0FBVyxPQUFPLFNBQVMsV0FDNUMsT0FDQyxJQUFJLGFBQWEsS0FBSyxLQUFLLGFBQWEsSUFBSSxPQUFPLFVBQVUsV0FDMUQsUUFDQSxNQUFPLEtBQXNCOztBQUd6QyxTQUFnQixzQkFBc0IsS0FBdUI7QUFDM0QsUUFBTyxVQUFVLGdCQUFnQixJQUFJLEtBQUs7O0FBRzVDLFNBQWdCLGlCQUFpQixLQUErQjtDQUM5RCxNQUFNLE9BQU8sVUFBVSw4QkFBOEIsSUFBSTtBQUN6RCxRQUFPLE9BQU8sS0FBSyxNQUFNLElBQUksQ0FBQyxLQUFJLFFBQU8sSUFBSSxNQUFNLENBQUMsR0FBRzs7QUFHekQsU0FBZ0IsWUFBWSxPQUE4QjtDQUN4RCxJQUFJQSxTQUF3QixNQUFNLE1BQU07QUFDeEMsS0FBSSxXQUFXLEdBQ2IsVUFBUztBQUNYLFFBQU87Ozs7O0FDbkNULFNBQWdCLE1BQVMsT0FBVSxNQUE4QztDQUMvRSxNQUFNLENBQUMsVUFBVSxVQUFVLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxNQUFNLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHO0FBRS9FLFNBQVEsVUFBUjtFQUNFLEtBQUssV0FDSCxRQUFPLGFBQWEsTUFBTTtFQUM1QixLQUFLLFdBQ0gsUUFBTyxhQUFhLE1BQU07RUFDNUIsS0FBSyxZQUNILFFBQU8sY0FBYyxNQUFNO0VBQzdCLEtBQUssTUFDSCxRQUFPLFFBQVEsT0FBTyxHQUFHLE9BQU8sTUFBTSxJQUFJLENBQUM7RUFDN0MsS0FBSyxNQUNILFFBQU8sUUFBUSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssQ0FBQztFQUM5QyxLQUFLLFVBQ0gsUUFBTyxZQUFZLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxDQUFDO0VBQ2xELEtBQUssUUFDSCxRQUFPLFVBQVUsTUFBTTtFQUN6QixLQUFLLE1BQ0gsUUFBTyxRQUFRLE1BQU07RUFDdkIsS0FBSyxPQUNILFFBQU8sU0FBUyxNQUFNO0VBQ3hCLEtBQUssUUFDSCxRQUFPLFVBQVUsT0FBTyxPQUFPO0VBQ2pDLEtBQUssS0FDSCxRQUFPLE9BQU8sT0FBTyxHQUFHLE9BQU8sTUFBTSxLQUFLLENBQUM7RUFDN0MsUUFDRSxRQUFPO0dBQUUsT0FBTztHQUFPLFNBQVMsZ0JBQWdCO0dBQVk7R0FBTzs7O0FBSXpFLFNBQVMsUUFBVyxPQUFVLEdBQUcsUUFBMkI7Q0FDMUQsTUFBTSxXQUFXLE9BQU8sT0FBTyxNQUFNLElBQUk7Q0FDekMsTUFBTUMsU0FBa0I7RUFDdEIsT0FBTztFQUNQLFNBQVMsK0NBQStDO0VBQ3hEO0VBQ0Q7QUFDRCxLQUFJLE9BQU8sVUFBVSxTQUNuQixRQUFPLFFBQVEsU0FBUztBQUUxQixLQUFJLE9BQU8sT0FBTyxVQUFVLFNBQzFCLFFBQU8sUUFBUyxPQUFPLE1BQU8sVUFBVTtBQUUxQyxLQUFJLFFBQVEsTUFBTSxFQUFFO0FBQ2xCLFNBQU8sUUFBUSxNQUFNLFVBQVU7QUFDL0IsU0FBTyxVQUFVLCtCQUErQixTQUFTOztBQUUzRCxRQUFPOztBQUdULFNBQVMsUUFBVyxPQUFVLEdBQUcsUUFBMkI7Q0FDMUQsTUFBTSxXQUFXLE9BQU8sT0FBTyxNQUFNLElBQUk7Q0FDekMsTUFBTUEsU0FBa0I7RUFDdEIsT0FBTztFQUNQLFNBQVMsNENBQTRDO0VBQ3JEO0VBQ0Q7QUFFRCxLQUFJLE9BQU8sVUFBVSxTQUNuQixRQUFPLFFBQVEsU0FBUztBQUUxQixLQUFJLE9BQU8sT0FBTyxVQUFVLFVBQVU7QUFDcEMsU0FBTyxRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQ3RDLFNBQU8sVUFBVSwrQkFBK0IsU0FBUzs7QUFFM0QsS0FBSSxRQUFRLE1BQU0sRUFBRTtBQUNsQixTQUFPLFFBQVEsTUFBTSxVQUFVO0FBQy9CLFNBQU8sVUFBVSw4QkFBOEIsU0FBUzs7QUFFMUQsUUFBTzs7QUFHVCxTQUFTLFlBQWUsT0FBVSxHQUFHLFFBQTJCO0NBQzlELE1BQU0sV0FBVyxPQUFPLE9BQU8sTUFBTSxJQUFJO0NBQ3pDLE1BQU0sV0FBVyxPQUFPLE9BQU8sTUFBTSxJQUFJO0NBQ3pDLE1BQU1BLFNBQWtCO0VBQ3RCLE9BQU87RUFDUCxTQUFTLDhCQUE4QixTQUFTLE9BQU87RUFDdkQ7RUFDRDtBQUNELEtBQUksT0FBTyxVQUFVLFNBQ25CLFFBQU8sUUFBUSxTQUFTLFlBQVksU0FBUztBQUUvQyxLQUFJLE9BQU8sT0FBTyxVQUFVLFVBQVU7QUFDcEMsU0FBTyxRQUFRLE9BQU8sTUFBTSxVQUFVLFlBQWEsT0FBTyxNQUFPLFVBQVU7QUFDM0UsU0FBTyxVQUFVLCtCQUErQixTQUFTLE9BQU8sU0FBUzs7QUFFM0UsS0FBSSxRQUFRLE1BQU0sRUFBRTtBQUNsQixTQUFPLFFBQVEsTUFBTSxVQUFVLFlBQVksTUFBTSxVQUFVO0FBQzNELFNBQU8sVUFBVSw4QkFBOEIsU0FBUyxPQUFPLFNBQVM7O0FBRTFFLFFBQU87O0FBR1QsU0FBUyxVQUFhLE9BQW1CO0NBQ3ZDLE1BQU1BLFNBQWtCO0VBQ3RCLE9BQU87RUFDUCxTQUFTO0VBQ1Q7RUFDRDtBQUVELEtBQUksT0FBTyxVQUFVLFNBQ25CLFFBQU8sUUFBUSxLQUFLLFFBQVEsMEJBQThCLE9BQU8sTUFBZ0I7QUFFbkYsUUFBTzs7QUFHVCxTQUFTLFFBQVcsT0FBbUI7Q0FDckMsTUFBTSxTQUFTO0VBQ2IsT0FBTztFQUNQLFNBQVM7RUFDVDtFQUNEO0FBQ0QsS0FBSSxPQUFPLFVBQVUsU0FDbkIsUUFBTyxRQUFRLEtBQUssUUFDbEIsc0dBQ0EsT0FBTyxNQUNSO0FBRUgsUUFBTzs7QUFHVCxTQUFTLFNBQVksT0FBbUI7Q0FDdEMsTUFBTUEsU0FBa0I7RUFDdEIsT0FBTztFQUNQLFNBQVM7RUFDVDtFQUNEO0FBQ0QsS0FBSSxPQUFPLE9BQU8sVUFBVSxTQUMxQixRQUFPLFFBQVEsS0FBSyxRQUNsQiw2RUFDQSxNQUNEO0FBRUgsUUFBTzs7QUFHVCxTQUFTLFVBQWEsT0FBVSxHQUFHLFFBQTJCO0NBQzVELE1BQU0sUUFBUSxPQUFPLE1BQU07Q0FDM0IsTUFBTUEsU0FBa0I7RUFDdEIsT0FBTztFQUNQLFNBQVM7RUFDVDtFQUNEO0FBQ0QsS0FBSSxPQUFPLE9BQU8sVUFBVSxVQUFVO0FBQ3BDLFNBQU8sUUFBUSxPQUFPLE1BQU0sTUFBTTtBQUNsQyxTQUFPLFFBQVEsS0FBSyxRQUFRLE9BQU8sT0FBTyxNQUFnQjs7QUFFNUQsUUFBTzs7QUFHVCxTQUFTLE9BQVUsT0FBVSxHQUFHLFFBQTJCO0NBQ3pELE1BQU1BLFNBQWtCO0VBQ3RCLE9BQU87RUFDUCxTQUFTO0VBQ1Q7RUFDRDtBQUNELEtBQUksT0FBTyxPQUFPLFVBQVUsU0FDMUIsUUFBTyxRQUFRLE9BQU8sU0FBUyxPQUFPLE1BQU07QUFFOUMsS0FBSSxPQUFPLFVBQVUsU0FDbkIsUUFBTyxRQUFRLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxNQUFNO0FBRW5ELFFBQU87O0FBR1QsU0FBZ0IsYUFBZ0IsT0FBVSxHQUFHLFNBQTRCO0NBQ3ZFLE1BQU1BLFNBQWtCO0VBQ3RCLE9BQU87RUFDUCxTQUFTO0VBQ1Q7RUFDRDtBQUNELEtBQUksT0FBTyxPQUFPLFVBQVUsU0FDMUIsUUFBTyxRQUFRLE9BQU8sTUFBTSxTQUFTO0FBRXZDLEtBQUksUUFBUSxPQUFPLE1BQU0sQ0FDdkIsUUFBTyxRQUFRLE9BQU8sTUFBTSxTQUFTO0FBRXZDLEtBQUksT0FBTyxPQUFPLFVBQVUsU0FDMUIsUUFBTyxRQUFRO0FBRWpCLEtBQUksT0FBTyxVQUFVLE1BQ25CLFFBQU8sVUFBVTtBQUVuQixRQUFPOztBQUdULFNBQVMsYUFBZ0IsT0FBVSxHQUFHLFNBQTRCO0FBTWhFLFFBTHdCO0VBQ3RCLE9BQU87RUFDUCxTQUFTO0VBQ1Q7RUFDRDs7QUFJSCxTQUFTLGNBQWlCLE9BQVUsR0FBRyxTQUE0QjtDQUNqRSxNQUFNQSxTQUFrQjtFQUN0QixPQUFPO0VBQ1AsU0FBUztFQUNUO0VBQ0Q7QUFDRCxLQUFJLE9BQU8sT0FBTyxVQUFVLFlBQzFCLFFBQU87QUFFVCxRQUFPLGFBQWEsT0FBTyxHQUFHLFFBQVE7Ozs7O0FDN054QyxTQUFnQixTQUNkLEtBQ0EsUUFDRztDQUNILElBQUksWUFBWTtDQUNoQixNQUFNQyxnQkFBMEIsRUFBRTtBQUVsQyxRQUFPLEtBQUssT0FBTyxDQUFDLFNBQVMsU0FBUztFQUNwQyxJQUFJLFFBQVEsZUFBZSxLQUFLLEtBQXVCO0FBQ3ZELE1BQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsV0FBUSxZQUFZLE1BQU07QUFDMUIsa0JBQWUsS0FBSyxNQUF3QixNQUFNOztFQUdwRCxJQUFJLE9BQU87QUFDWCxTQUFPLE9BQXlCLFNBQVMsU0FBUztBQUNoRCxPQUFJLEtBQ0Y7QUFHRixPQUFJLFNBQVMsY0FBYyxVQUFVLEtBQ25DLFFBQU87QUFFVCxPQUFJLFNBQVMsZUFBZSxPQUFPLFVBQVUsWUFDM0MsUUFBTztHQUdULE1BQU0sU0FBVSxPQUFPLFNBQVMsV0FBWUMsTUFBWSxPQUFPLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTTtBQUNsRixPQUFJLE9BQU8sTUFDVDtBQUNGLGVBQVk7QUFDWixpQkFBYyxLQUFLLE9BQU8sUUFBUTtBQUNsQyxRQUFLLFlBQVksT0FBTyxTQUFTLG1CQUFtQixNQUFNO0lBQUU7SUFBTTtJQUFPLENBQUM7QUFDMUUsT0FBSSxTQUFTLFdBQ1gsUUFBTztJQUVUO0dBQ0Y7QUFFRixLQUFJLFVBQ0YsTUFBSyxNQUFNLGNBQWMsSUFBSSxrQkFBa0I7QUFHakQsUUFBTzs7QUFHVCxTQUFnQixhQUNkLEtBQ0EsUUFDRztBQUNILEtBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUM3QixRQUFPLFNBQVMsSUFBSSxNQUFNLE9BQU87Q0FFbkMsTUFBTSxpQkFBaUIsaUJBQWlCLElBQUk7QUFDNUMsTUFBSyxLQUFLLGtCQUFrQixnQkFBZ0IsT0FBTztBQUVuRCxLQUFJLENBQUMsZ0JBQWdCO0FBQ25CLFdBQVMsSUFBSSxNQUFNLE9BQU87QUFDMUIsT0FBSyxLQUFLLGtCQUFrQix3QkFBd0IsT0FBTztBQUMzRCxVQUFRLFlBQVksS0FBSzs7QUFHM0IsTUFBSyxLQUFLLGtCQUFrQiw4QkFBOEIsZUFBZSxLQUFLLElBQUksQ0FBQztDQUNuRixNQUFNLHFCQUFxQixFQUFFO0FBQzdCLGdCQUFlLFNBQVMsUUFBUTtBQUM5QixxQkFBbUIsT0FBeUIsT0FBTztHQUNuRDtBQUVGLFVBQVMsSUFBSSxNQUFNLG1CQUFtQjtBQUN0QyxNQUFLLEtBQUssa0JBQWtCLHdCQUF3QixPQUFPO0FBQzNELFNBQVEsWUFBWSxLQUFLIn0=
|
|
278
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
279
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogQ29udGV4dCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3R4LnJlcXVlc3QuaGVhZGVycylcbiAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0pID0+IHR5cGVvZiBwcmV2ID09PSAnc3RyaW5nJ1xuICAgICAgPyBwcmV2XG4gICAgICA6IChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBudWxsKSwgbnVsbCBhcyBzdHJpbmcgfCBudWxsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb2duaXRpdmVSZXF1ZXN0KGN0eDogQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0SGVhZGVyKCdwcmVjb2duaXRpb24nLCBjdHgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGl2ZUtleXMoY3R4OiBDb250ZXh0KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuICByZXR1cm4gcGFyc2VkXG59XG4iLCJpbXBvcnQgdHlwZSB7IFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBuYW1lcyA9IHtcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIG51bGxhYmxlOiAnbnVsbGFibGUnLFxuICBzb21ldGltZXM6ICdzb21ldGltZXMnLFxuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHVsaWQ6ICd1bGlkJyxcbiAgcmVnZXg6ICdyZWdleCcsXG4gIGluOiAnaW4nLFxuICBub3RJbjogJ25vdEluJyxcbiAgYmVmb3JlOiAnYmVmb3JlJyxcbiAgYWZ0ZXI6ICdhZnRlcicsXG59IGFzIGNvbnN0XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUPih2YWx1ZTogVCwgcnVsZTogU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBuYW1lcz4pOiBSdWxlPFQ+IHtcbiAgY29uc3QgW3J1bGVOYW1lLCBwYXJhbXNdID0gcnVsZS5pbmNsdWRlcygnOicpID8gcnVsZS5zcGxpdCgnOicsIDIpIDogW3J1bGUsICcnXVxuXG4gIHN3aXRjaCAocnVsZU5hbWUgYXMga2V5b2YgdHlwZW9mIG5hbWVzKSB7XG4gICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgcmV0dXJuIHJlcXVpcmVkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdudWxsYWJsZSc6XG4gICAgICByZXR1cm4gbnVsbGFibGVSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3NvbWV0aW1lcyc6XG4gICAgICByZXR1cm4gc29tZXRpbWVzUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdtaW4nOlxuICAgICAgcmV0dXJuIG1pblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCcpKVxuICAgIGNhc2UgJ21heCc6XG4gICAgICByZXR1cm4gbWF4UnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsJykpXG4gICAgY2FzZSAnYmV0d2Vlbic6XG4gICAgICByZXR1cm4gYmV0d2VlblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCcpKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3VsaWQnOlxuICAgICAgcmV0dXJuIHVsaWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtcylcbiAgICBjYXNlICdpbic6XG4gICAgICByZXR1cm4gaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBjYXNlICdub3RJbic6XG4gICAgICByZXR1cm4gbm90SW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgY2hlY2s6IGZhbHNlLCBtZXNzYWdlOiBgVW5rbm93biBydWxlICR7cnVsZU5hbWV9YCwgdmFsdWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1pblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke21pblZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IChyZXN1bHQudmFsdWUpLmxlbmd0aCA+PSBtaW5WYWx1ZVxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAke21pblZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG1heFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmV0d2VlblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIocGFyYW1zWzFdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID49IG1pblZhbHVlICYmIHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiAocmVzdWx0LnZhbHVlKS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9IGNoYXJhY3RlcnNgXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlICYmIHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGVtYWlsUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJyxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKCdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnLCByZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gdXJsUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVUkwnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15odHRwcz86XFxcXC9cXFxcLyh3d3dcXFxcLik/Wy1hLXpBLVowLTlAOiUuX1xcXFwrfiM9XXsxLDI1Nn1cXFxcLlthLXpBLVowLTkoKV17MSw2fVxcXFxiKFstYS16QS1aMC05KClAOiVfXFxcXCsufiM/Ji8vPV0qKSR8Xmh0dHBzPzpcXFxcL1xcXFwvKGxvY2FsaG9zdHxcXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9KSg6XFxcXGQrKT8oXFxcXC8uKik/JCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHV1aWRSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIFVVSUQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1bGlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVTElEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBVTElEIGZvcm1hdDogMjYgY2hhcmFjdGVycywgYmFzZTMyIGVuY29kZWQgKDAtOSwgQS1aIGV4Y2x1ZGluZyBJLCBMLCBPLCBVKVxuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXXsyNn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWdleFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVnZXggPSBwYXJhbXNbMF0gPz8gJydcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLmluY2x1ZGVzKHJlc3VsdC52YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5tYXAoTnVtYmVyKS5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG5vdEluUnVsZTxUPih2YWx1ZTogVCwgLi4ucGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3Qgbm90IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gIXBhcmFtcy5pbmNsdWRlcyhyZXN1bHQudmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSAhcGFyYW1zLm1hcChOdW1iZXIpLmluY2x1ZGVzKHZhbHVlKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkUnVsZTxUPih2YWx1ZTogVCwgLi4uX3BhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIGlzIHJlcXVpcmVkJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSByZXN1bHQudmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmIChpc0FycmF5KHJlc3VsdC52YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSByZXN1bHQudmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJlc3VsdC5jaGVjayA9IGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBudWxsYWJsZVJ1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHNvbWV0aW1lc1J1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUsIC4uLl9wYXJhbXMpXG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mLCBSdWxlLCBTaG9ydFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgcnVsZXNbJ25hbWVzJ10+IHwgUnVsZSlbXT4+LFxuKTogVCB7XG4gIGxldCBoYXNFcnJvcnMgPSBmYWxzZVxuICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpIDogeyAuLi5ydWxlIH1cbiAgICAgIGlmIChyZXN1bHQuY2hlY2spXG4gICAgICAgIHJldHVyblxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSByZXN1bHQubWVzc2FnZS5yZXBsYWNlKCc6YXR0cmlidXRlJywgZm9ybWF0QXR0cmlidXRlTmFtZShwYXRoKSlcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChyZXN1bHQubWVzc2FnZSlcbiAgICAgIHV0aWwuYXBwZW5kRXJyb3IocmVzdWx0Lm1lc3NhZ2UsICdWYWxpZGF0aW9uRXJyb3InLCBudWxsLCB7IHBhdGgsIHZhbHVlIH0pXG4gICAgICBpZiAocnVsZSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICBza2lwID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKGhhc0Vycm9ycykge1xuICAgIHV0aWwuZXJyb3IoZXJyb3JNZXNzYWdlc1swXSwgJ1ZhbGlkYXRpb25FcnJvcicpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVWYWxpZGF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBjdHg6IENvbnRleHQ8VD4sXG4gIGNoZWNrczogUGFydGlhbDxSZWNvcmQ8TmVzdGVkS2V5T2Y8VD4sIChTaG9ydFJ1bGU8a2V5b2YgdHlwZW9mIHJ1bGVzWyduYW1lcyddPiB8IFJ1bGUpW10+Pixcbik6IFQge1xuICBpZiAoIWlzUHJlY29nbml0aXZlUmVxdWVzdChjdHgpKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MpXG4gIH1cbiAgY29uc3QgdmFsaWRhdGlvbktleXMgPSBwcmVjb2duaXRpdmVLZXlzKGN0eClcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24nLCAndHJ1ZScpXG5cbiAgaWYgKCF2YWxpZGF0aW9uS2V5cykge1xuICAgIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MpXG4gICAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG4gIH1cblxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgdmFsaWRhdGlvbktleXMuam9pbignLCcpKVxuICBjb25zdCBwcmVjb2duaXRpb25DaGVja3MgPSB7fSBhcyBQYXJ0aWFsPHR5cGVvZiBjaGVja3M+XG4gIHZhbGlkYXRpb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHByZWNvZ25pdGlvbkNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dID0gY2hlY2tzW2tleSBhcyBOZXN0ZWRLZXlPZjxUPl1cbiAgfSlcblxuICB2YWxpZGF0ZShjdHguYXJncywgcHJlY29nbml0aW9uQ2hlY2tzKVxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1TdWNjZXNzJywgJ3RydWUnKVxuICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBdHRyaWJ1dGVOYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IHtcbiAgICBpZiAodXRpbC5tYXRjaGVzKCdeXFxkKyQnLCBwYXJ0KSkge1xuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cbiAgICByZXR1cm4gYWNjID8gYCR7YWNjfSAke3BhcnQudG9Mb3dlckNhc2UoKX1gIDogcGFydC50b0xvd2VyQ2FzZSgpXG4gIH0sICcnKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFRQSxTQUFnQixRQUFRLE9BQW9DO0FBQzFELEtBQUksT0FBTyxVQUFVLFlBQVksQ0FBQyxDQUFDLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxDQUN4RSxRQUFPLE9BQVEsTUFBb0IsV0FBVztBQUVoRCxRQUFPOztBQUdULFNBQWdCLGVBQWlDLEtBQVEsTUFBMkI7QUFDbEYsUUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQWlCLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUyxJQUFJLEdBQzlFLFFBQXNCLE9BQU8sSUFBSSxJQUNqQyxRQUFvQyxNQUFNLElBQUk7O0FBR3JELFNBQWdCLGVBQWlDLEtBQVEsTUFBc0IsT0FBc0I7Q0FDbkcsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQzVCLEtBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsTUFBSSxLQUFLLE1BQTBCO0FBQ25DOztDQUVGLE1BQU0sVUFBVSxLQUFLLEtBQUs7Q0FDMUIsTUFBTSxlQUFlLGVBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFtQjtBQUMxRSxLQUFJLE9BQU8saUJBQWlCLFlBQVksQ0FBQyxDQUFDLGFBQ3hDLGNBQWEsV0FBVzs7QUFJNUIsU0FBZ0IsVUFBVSxNQUFjLEtBQTZCO0FBQ25FLFFB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
|