-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdecorators.js
423 lines (418 loc) · 87.4 KB
/
decorators.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
var __create = Object.create, __defProp = Object.defineProperty, __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty, __getOwnPropNames = Object.getOwnPropertyNames, __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __markAsModule = (target) => __defProp(target, "__esModule", {value: !0});
var __commonJS = (callback, module2) => () => (module2 || (module2 = {exports: {}}, callback(module2.exports, module2)), module2.exports), __export = (target, all) => {
for (var name in all)
__defProp(target, name, {get: all[name], enumerable: !0});
}, __exportStar = (target, module2, desc) => {
if (module2 && typeof module2 == "object" || typeof module2 == "function")
for (let key of __getOwnPropNames(module2))
!__hasOwnProp.call(target, key) && key !== "default" && __defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
return target;
}, __toModule = (module2) => module2 && module2.__esModule ? module2 : __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", {value: module2, enumerable: !0})), module2);
// node_modules/.pnpm/es-module-lexer@0.4.0/node_modules/es-module-lexer/dist/lexer.cjs
var require_lexer = __commonJS((exports2) => {
"use strict";
exports2.parse = parse;
exports2.init = void 0;
var A = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
function parse(E2, g = "@") {
if (!B)
return init.then(() => parse(E2));
let I = E2.length + 1, D = (B.__heap_base.value || B.__heap_base) + 4 * I - B.memory.buffer.byteLength;
D > 0 && B.memory.grow(Math.ceil(D / 65536));
let w = B.sa(I - 1);
if ((A ? C : Q)(E2, new Uint16Array(B.memory.buffer, w, I)), !B.parse())
throw Object.assign(new Error(`Parse error ${g}:${E2.slice(0, B.e()).split(`
`).length}:${B.e() - E2.lastIndexOf(`
`, B.e() - 1)}`), {idx: B.e()});
let L = [], k = [];
for (; B.ri(); ) {
let A2 = B.is(), Q2 = B.ie(), C2;
B.ip() && (C2 = N(E2.slice(A2 - 1, Q2 + 1))), L.push({n: C2, s: A2, e: Q2, ss: B.ss(), se: B.se(), d: B.id()});
}
for (; B.re(); )
k.push(E2.slice(B.es(), B.ee()));
function N(A2) {
try {
return (0, eval)(A2);
} catch {
}
}
return [L, k, !!B.f()];
}
function Q(A2, Q2) {
let C2 = A2.length, B2 = 0;
for (; B2 < C2; ) {
let C3 = A2.charCodeAt(B2);
Q2[B2++] = (255 & C3) << 8 | C3 >>> 8;
}
}
function C(A2, Q2) {
let C2 = A2.length, B2 = 0;
for (; B2 < C2; )
Q2[B2] = A2.charCodeAt(B2++);
}
var B, init = WebAssembly.compile((E = "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", typeof window != "undefined" && typeof atob == "function" ? Uint8Array.from(atob(E), (A2) => A2.charCodeAt(0)) : Buffer.from(E, "base64"))).then(WebAssembly.instantiate).then(({exports: A2}) => {
B = A2;
});
exports2.init = init;
var E;
});
// index.ts
__markAsModule(exports);
__export(exports, {
c: () => klass,
cV: () => klassVoid,
klass: () => klass,
klassVoid: () => klassVoid,
load: () => load,
p: () => property,
pV: () => propertyVoid,
plugin: () => plugin,
property: () => property,
propertyVoid: () => propertyVoid
});
var fs = __toModule(require("fs"));
// decorators.ts
var esbuild = __toModule(require("esbuild")), import_fast_glob = __toModule(require("fast-glob")), DecoratorType;
(function(DecoratorType2) {
DecoratorType2[DecoratorType2.property = 0] = "property", DecoratorType2[DecoratorType2.klass = 1] = "klass";
})(DecoratorType || (DecoratorType = {}));
async function decorators(decoratorGlob = "./**/*.{decorator.ts,dec.ts,decorators.ts,decky.ts,decorator.tsx,dec.tsx,decorators.tsx,decky.tsx}", additionalConfig = {}) {
let entryPoints = additionalConfig?.entryPoints?.length ? additionalConfig.entryPoints : await import_fast_glob.default(decoratorGlob);
return await esbuild.build({
minify: !1,
minifySyntax: !0,
format: "cjs",
sourcemap: "both",
outdir: ".",
outbase: ".",
...additionalConfig,
platform: "node",
entryPoints,
bundle: !1
}), entryPoints;
}
// index.ts
var path = __toModule(require("path")), import_chalk = __toModule(require("chalk")), esmLexer = require_lexer(), hasLoadedLexers = !1;
async function initLexers() {
hasLoadedLexers || (await Promise.all([esmLexer.init]), hasLoadedLexers = !0);
}
var VALID_DECORATOR_IMPORT_EXTENSIONS = [
".decorator.ts",
".decorator.tsx",
".decorator",
".decky.ts",
".decky.tsx",
".decky",
".dec.ts",
".dec.tsx",
".dec"
];
function filterDecoratorImport(esm, index) {
return VALID_DECORATOR_IMPORT_EXTENSIONS.includes(path.extname(esm.n).toLowerCase());
}
function parseDecoratorImports(code, filename) {
let [imports] = esmLexer.parse(code, filename);
return imports.filter(filterDecoratorImport);
}
var ProcessorError = class extends Error {
constructor(message, file, lineNumber, lineText, column) {
super(message);
this.note = {
text: message,
location: {
file,
line: lineNumber,
lineText,
column
}
};
}
};
function buildDecoratorProcessor(decoratorsModuleMap) {
let fileMapping = {}, allPrefixes = new Set();
for (let moduleName in decoratorsModuleMap) {
let decorators2 = decoratorsModuleMap[moduleName];
if (typeof decorators2 != "object" || Object.keys(decorators2).length === 0) {
console.warn(`[decky] "decorators" not exported in ${moduleName}, ignoring file.`);
continue;
}
let decoratorKeys = Object.keys(decorators2).sort().reverse(), decoratorPrefixes = decoratorKeys.map((a) => a.toString()), decoratorFunctions = new Array(decoratorKeys.length), flattenedFuncs = decoratorKeys.map((a) => decorators2[a].callback);
for (let i = 0; i < decoratorKeys.length; i++) {
let key = decoratorKeys[i], prefix = decoratorPrefixes[i], length = key.length, decoratorFunc = flattenedFuncs[i], processDecorator = async (prefixStart, result) => {
globalThis.process.env.DECKY_TIMINGS && console.time(`[decky] -> ${prefix}: ${path.relative(globalThis.process.cwd(), result.filePath)}`);
let code = result.code, prefixEnd = result.stopIndex, argStart = prefixEnd, lineEnd = prefixEnd;
for (; code[lineEnd] !== `
` && (lineEnd++, !(code.length < lineEnd)); )
;
for (; code[argStart] !== "(" && argStart < lineEnd; )
argStart++;
let argEnd = -1, argList;
if (code[argStart++] === "(")
if (argEnd = code.indexOf(")", argStart), argEnd - 1 > argStart) {
if (argEnd < 0)
throw new ProcessorError(`Missing ) for ${prefix}`, result.filePath, result.code.substring(0, prefixStart).split(`
`).length, result.code.split(`
`)[result.code.substring(0, prefixStart).split(`
`).length], prefixEnd);
try {
argList = JSON.parse("[" + code.substring(argStart, argEnd) + "]");
} catch (exception) {
throw new ProcessorError(`Arguments to ${prefix} must be JSON. Received: [${code.substring(argStart, argEnd)}]`, result.filePath, result.code.substring(0, prefixStart).split(`
`).length - 1, result.code.split(`
`)[result.code.substring(0, prefixStart).split(`
`).length - 1], argStart);
}
} else
argStart = -1, argList = [];
else
argStart = -1, argList = [];
let nextLineStart = lineEnd + 1;
for (; code[nextLineStart] === " " || code[nextLineStart] === ";" || code[nextLineStart] === `
`; )
nextLineStart++;
let _nextNewline = code.indexOf(`
`, nextLineStart), _nextSemicolon = code.indexOf(";", nextLineStart), nextLineEnd = (_nextNewline < _nextSemicolon ? _nextNewline : _nextSemicolon) + 1, nextLine = code.substring(nextLineStart, nextLineEnd), isStatic = !1, qualifier = null;
nextLine.startsWith("export ") && (nextLine = nextLine.substring("export ".length).trim()), nextLine.startsWith("public ") ? (qualifier = "public", nextLine = nextLine.substring("public".length)) : nextLine.startsWith("private ") ? (qualifier = "private", nextLine = nextLine.substring("private".length)) : nextLine.startsWith("protected ") && (qualifier = "protected", nextLine = nextLine.substring("protected".length)), nextLine = nextLine.trim();
let isClass = nextLine.startsWith("class ");
if (isClass || (isStatic = nextLine.startsWith("static "), isStatic && nextLine.substring("static ".length)), isClass) {
nextLine = nextLine.substring("class ".length).trim(), nextLine = nextLine.substring(0, nextLine.indexOf(" ")).trim(), globalThis.process.env.DECKY_TIMINGS && console.time(`[decky] ${path.basename(moduleName).split(".")[0]}.${prefix}(${argList.join(", ")})`);
try {
await decoratorFunc({
className: nextLine,
args: argList,
metadata: result
}), result.stopIndex = nextLineStart;
} catch (exception) {
throw new ProcessorError(exception.toString() + `
In file:
${result.code}`, result.filePath, result.code.substring(0, prefixStart).split(`
`).length, result.code.split(`
`)[result.code.substring(0, prefixStart).split(`
`).length - 1], prefixEnd);
} finally {
globalThis.process.env.DECKY_TIMINGS && console.timeEnd(`[decky] ${path.basename(moduleName).split(".")[0]}.${prefix}(${argList.join(", ")})`);
}
return !1;
} else {
let key2 = nextLine.trim(), typeName = "", typeSeparatorIndex = nextLine.indexOf(":"), equalsIndex = nextLine.indexOf("="), openParentheses = nextLine.indexOf("("), defaultValue;
typeSeparatorIndex > -1 && (key2 = nextLine.substring(0, typeSeparatorIndex).trim(), typeName = nextLine.substring(typeSeparatorIndex + 1).trim());
let semicolonIndex = typeName.indexOf(";");
if (equalsIndex > -1 && openParentheses === -1) {
key2 === "" && (key2 = nextLine.substring(0, equalsIndex).trim());
let _defaultValue = nextLine.substring(equalsIndex + 1).trim().replace(/;/gm, "").trim();
try {
defaultValue = JSON.parse(_defaultValue);
} catch (exception) {
process.env.DECKY_VERBOSE && console.warn(exception);
}
typeof defaultValue != "undefined" && typeName === "" && (typeName = typeof defaultValue);
}
if (semicolonIndex > -1 && (typeName = typeName.substring(0, semicolonIndex)), key2 === "")
throw new ProcessorError("Missing name for property below property descriptor", result.filePath, result.code.substring(0, prefixStart).split(`
`).length, nextLine, prefixEnd);
result.code = code;
let newCode;
globalThis.process.env.DECKY_TIMINGS && console.time(`[decky] ${path.basename(moduleName).split(".")[0]}.${prefix}(${argList.join(", ")})`);
try {
newCode = await decoratorFunc({
key: key2,
type: typeName,
args: argList,
isStatic,
qualifier,
metadata: result,
defaultValue
});
} catch (exception) {
throw new ProcessorError(exception.toString() + `
In file:
${result.code}`, result.filePath, result.code.substring(0, prefixStart).split(`
`).length, result.code.split(`
`)[result.code.substring(0, prefixStart).split(`
`).length], prefixEnd);
} finally {
globalThis.process.env.DECKY_TIMINGS && console.timeEnd(`[decky] ${path.basename(moduleName).split(".")[0]}.${prefix}(${argList.join(", ")})`);
}
return globalThis.process.env.DECKY_TIMINGS && console.timeEnd(`[decky] -> ${prefix}: ${path.relative(globalThis.process.cwd(), result.filePath)}`), !newCode && newCode !== "" ? (result.startIndex = prefixStart, result.stopIndex = nextLineStart, result.code = newCode || "", !1) : (result.startIndex = prefixStart - 1, result.stopIndex = nextLineEnd - 1, result.code = newCode || "", !0);
}
};
decoratorFunctions[i] = processDecorator;
}
fileMapping[path.basename(moduleName, path.extname(moduleName))] = {
decoratorFunctions,
decoratorPrefixes
}, decoratorPrefixes.forEach((prefix) => allPrefixes.add(prefix));
}
let prefixes = [...allPrefixes].sort().reverse();
return {
process: async (code, filePath) => {
let moduleImports;
try {
moduleImports = parseDecoratorImports(code, filePath);
} catch (exception) {
throw new ProcessorError(`Import/export parse error: ${exception.toString()}`, filePath, 0, code, 0);
}
let modules = new Array(moduleImports.length), moduleI = 0;
for (let moduleImport of moduleImports) {
code = code.substring(0, moduleImport.ss) + " ".repeat(moduleImport.se - moduleImport.ss + 1) + code.substring(moduleImport.se + 1);
let name = path.basename(moduleImport.n);
fileMapping[name] && (modules[moduleI++] = name);
}
code = code.replace(/^\s*\/\/.*\n?$/gm, "").trim().split(`
`).join(`
`).trim() + `
`, globalThis.process.env.DECKY_VERBOSE && console.log(import_chalk.default.yellow(code)), moduleI !== modules.length && (modules.length = moduleI);
let result = {
code,
originalSource: code,
filePath,
startIndex: -1,
stopIndex: -1
}, symbolI = code.lastIndexOf("@") - 1;
if (symbolI < -1)
return {contents: code, note: null};
symbolI === -1 && symbolI++;
let _prefixI = -1, prefixI = -1, prefix = "", _code = "", didChange = !1, lastMatchIndex = -1;
do {
if (symbolI = result.code.lastIndexOf("@"), symbolI === -1)
break;
for (result.startIndex = symbolI, result.stopIndex = result.startIndex + 1, prefix = "0AF"; result.stopIndex < result.code.length; )
if (result.stopIndex++, result.code[result.stopIndex] === " " || result.code[result.stopIndex] === "(" || result.code[result.stopIndex] === `
` || result.code[result.stopIndex] === ";" || result.code[result.stopIndex] === ",") {
prefix = result.code.substring(result.startIndex + 1, result.stopIndex);
break;
}
let decoratorModuleName;
for (let moduleName of modules)
if (prefixI = fileMapping[moduleName].decoratorPrefixes.indexOf(prefix), prefixI > -1) {
decoratorModuleName = moduleName;
break;
}
if (prefixI === -1) {
result.code = result.code.substring(0, symbolI) + "\u{1F364}" + result.code.substring(symbolI + 1);
continue;
}
let {decoratorFunctions} = fileMapping[decoratorModuleName];
if (result.startIndex > -1 && decoratorFunctions[prefixI]) {
_code = result.code, didChange = !1;
try {
didChange = await decoratorFunctions[prefixI](result.startIndex, result);
} catch (exception) {
return exception instanceof ProcessorError ? {
contents: "",
note: exception.note
} : {
contents: "",
note: new ProcessorError(exception.toString(), filePath, 0, result.code, 0).note
};
}
didChange ? result.startIndex > -1 && result.stopIndex > -1 && (result.code = _code.substring(0, result.startIndex) + result.code + _code.substring(result.stopIndex)) : result.code = _code.substring(0, result.startIndex - 1) + _code.substring(result.stopIndex), result.startIndex = result.stopIndex = -1;
}
} while (symbolI > -1);
return globalThis.process.env.DECKY_VERBOSE && console.log(import_chalk.default.green(result.code)), {
contents: result.code.replace(/🍤/gm, "@"),
note: null
};
},
prefixes
};
}
function onResolveDecorator(args) {
return {
path: args.path,
namespace: "decorator-stub"
};
}
function onResolveStaticDecorators(args) {
return {
path: args.path,
namespace: "decky"
};
}
var staticDecoratorCode = [property, klass].map((stub) => `/* @__PURE__ */
export function ${stub}(...args){return args;}
`).join(`
`);
function onLoadStaticDecorators(args) {
return {
contents: staticDecoratorCode,
loader: "js"
};
}
function plugin(decorators2) {
let {prefixes, process: process2} = buildDecoratorProcessor(decorators2), prefixesWithAt = prefixes.map((a) => a.startsWith("@") ? a : "@" + a);
function isPotentialMatch(content) {
if (!content.includes("@"))
return !1;
for (let prefix of prefixesWithAt)
if (content.includes(prefix))
return !0;
return !1;
}
function onLoadDecoratorStub(args) {
let stub = require(args.path).decorators;
return {
contents: Object.keys(stub).map((stub2) => `/* @__PURE__ */
export function ${stub2}(...args){return args;}
`).join(`
`),
loader: "ts"
};
}
async function onLoadCode(args) {
let loader = path.extname(args.path).substring(1), contents = await fs.promises.readFile(args.path, "utf8");
if (!isPotentialMatch(contents))
return {
contents,
loader
};
globalThis.process.env.DECKY_TIMINGS && console.time("[decky] ./" + path.relative(globalThis.process.cwd(), args.path)), await initLexers();
let {note, contents: _contents} = await process2(contents, args.path) ?? {};
return globalThis.process.env.DECKY_TIMINGS && console.timeEnd("[decky] ./" + path.relative(globalThis.process.cwd(), args.path)), {
contents: _contents,
errors: note ? [{location: note.location, text: note.text}] : void 0,
loader
};
}
return {
name: "decky",
setup(build2) {
build2.onResolve({filter: /\.(decorator|dec|decky)\.(ts|tsx)$/}, onResolveDecorator), build2.onResolve({filter: /^decky$/}, onResolveStaticDecorators), build2.onLoad({filter: /^decky$/, namespace: "decky"}, onLoadStaticDecorators), build2.onLoad({filter: /\.(decorator|dec)\.(ts)$/, namespace: "decorator-stub"}, onLoadDecoratorStub), build2.onLoad({filter: /\.(decorator|dec)\.(tsx)$/, namespace: "decorator-stub"}, onLoadDecoratorStub), build2.onLoad({filter: /\.(ts|tsx)$/}, onLoadCode);
}
};
}
function property(callback) {
return {
callback,
type: DecoratorType.property
};
}
function propertyVoid(callback) {
return {
callback,
type: DecoratorType.property
};
}
function klass(callback) {
return {
callback,
type: DecoratorType.klass
};
}
function klassVoid(callback) {
return {
callback,
type: DecoratorType.klass
};
}
async function load(decoratorsGlob, additionalConfig) {
let entryPoints = await decorators(decoratorsGlob, additionalConfig), files = {};
for (let file of entryPoints)
Object.assign(files, {
[file]: require(path.join(process.cwd(), path.dirname(file), path.basename(file).replace(".ts", ".js"))).decorators
});
return plugin(files);
}
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2VzLW1vZHVsZS1sZXhlckAwLjQuMC9ub2RlX21vZHVsZXMvZXMtbW9kdWxlLWxleGVyL2Rpc3QvbGV4ZXIuY2pzIiwgImluZGV4LnRzIiwgImRlY29yYXRvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIlwidXNlIHN0cmljdFwiO2V4cG9ydHMucGFyc2U9cGFyc2U7ZXhwb3J0cy5pbml0PXZvaWQgMDtjb25zdCBBPTE9PT1uZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdO2Z1bmN0aW9uIHBhcnNlKEUsZz1cIkBcIil7aWYoIUIpcmV0dXJuIGluaXQudGhlbigoKT0+cGFyc2UoRSkpO2NvbnN0IEk9RS5sZW5ndGgrMSxEPShCLl9faGVhcF9iYXNlLnZhbHVlfHxCLl9faGVhcF9iYXNlKSs0KkktQi5tZW1vcnkuYnVmZmVyLmJ5dGVMZW5ndGg7RD4wJiZCLm1lbW9yeS5ncm93KE1hdGguY2VpbChELzY1NTM2KSk7Y29uc3Qgdz1CLnNhKEktMSk7aWYoKEE/QzpRKShFLG5ldyBVaW50MTZBcnJheShCLm1lbW9yeS5idWZmZXIsdyxJKSksIUIucGFyc2UoKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgUGFyc2UgZXJyb3IgJHtnfToke0Uuc2xpY2UoMCxCLmUoKSkuc3BsaXQoXCJcXG5cIikubGVuZ3RofToke0IuZSgpLUUubGFzdEluZGV4T2YoXCJcXG5cIixCLmUoKS0xKX1gKSx7aWR4OkIuZSgpfSk7Y29uc3QgTD1bXSxrPVtdO2Zvcig7Qi5yaSgpOyl7Y29uc3QgQT1CLmlzKCksUT1CLmllKCk7bGV0IEM7Qi5pcCgpJiYoQz1OKEUuc2xpY2UoQS0xLFErMSkpKSxMLnB1c2goe246QyxzOkEsZTpRLHNzOkIuc3MoKSxzZTpCLnNlKCksZDpCLmlkKCl9KX1mb3IoO0IucmUoKTspay5wdXNoKEUuc2xpY2UoQi5lcygpLEIuZWUoKSkpO2Z1bmN0aW9uIE4oQSl7dHJ5e3JldHVybigwLGV2YWwpKEEpfWNhdGNoe319cmV0dXJuW0wsaywhIUIuZigpXX1mdW5jdGlvbiBRKEEsUSl7Y29uc3QgQz1BLmxlbmd0aDtsZXQgQj0wO2Zvcig7QjxDOyl7Y29uc3QgQz1BLmNoYXJDb2RlQXQoQik7UVtCKytdPSgyNTUmQyk8PDh8Qz4+Pjh9fWZ1bmN0aW9uIEMoQSxRKXtjb25zdCBDPUEubGVuZ3RoO2xldCBCPTA7Zm9yKDtCPEM7KVFbQl09QS5jaGFyQ29kZUF0KEIrKyl9bGV0IEI7Y29uc3QgaW5pdD1XZWJBc3NlbWJseS5jb21waWxlKChFPVwiQUdGemJRRUFBQUFCV0F4Z0FYOEJmMkFFZjM5L2Z3QmdBbjkvQUdBQUFYOWdBQUJnQm45L2YzOS9md0YvWUFSL2YzOS9BWDlnQTM5L2Z3Ri9ZQWQvZjM5L2YzOS9BWDlnQlg5L2YzOS9BWDlnQW45L0FYOWdDSDkvZjM5L2YzOS9BWDhETUM4QUFRSURBd01EQXdNREF3TURBd01BQkFRQUJRUUVBQUFBQUFRRUJBUUVBQVVHQndnSkNnc0RBZ0FBQ2dNSUN3UUZBWEFCQVFFRkF3RUFBUVlQQW44QlFmRHdBQXQvQUVIdzhBQUxCMThRQm0xbGJXOXllUUlBQW5OaEFBQUJaUUFEQW1sekFBUUNhV1VBQlFKemN3QUdBbk5sQUFjQ2FXUUFDQUpwY0FBSkFtVnpBQW9DWldVQUN3SnlhUUFNQW5KbEFBMEJaZ0FPQlhCaGNuTmxBQThMWDE5b1pXRndYMkpoYzJVREFRckxOQzlvQVFGL1FRQWdBRFlDdEFoQkFDZ0NrQWdpQVNBQVFRRjBhaUlBUVFBN0FRQkJBQ0FBUVFKcUlnQTJBcmdJUVFBZ0FEWUN2QWhCQUVFQU5nS1VDRUVBUVFBMkFxUUlRUUJCQURZQ25BaEJBRUVBTmdLWUNFRUFRUUEyQXF3SVFRQkJBRFlDb0FnZ0FRdXJBUUVDZjBFQUtBS2tDQ0lFUVJocVFaUUlJQVFiUVFBb0Fyd0lJZ1UyQWdCQkFDQUZOZ0trQ0VFQUlBUTJBcWdJUVFBZ0JVRWNhallDdkFnZ0JTQUFOZ0lJQWtBQ1FFRUFLQUtJQ0NBRFJ3MEFJQVVnQWpZQ0RBd0JDd0pBUVFBb0FvUUlJQU5IRFFBZ0JTQUNRUUpxTmdJTURBRUxJQVZCQUNnQ2tBZzJBZ3dMSUFVZ0FUWUNBQ0FGSUFNMkFoQWdCU0FDTmdJRUlBVkJBRFlDR0NBRlFRQW9Bb1FJSUFOR09nQVVDMGdCQVg5QkFDZ0NyQWdpQWtFSWFrR1lDQ0FDRzBFQUtBSzhDQ0lDTmdJQVFRQWdBallDckFoQkFDQUNRUXhxTmdLOENDQUNRUUEyQWdnZ0FpQUJOZ0lFSUFJZ0FEWUNBQXNJQUVFQUtBTEFDQXNWQUVFQUtBS2NDQ2dDQUVFQUtBS1FDR3RCQVhVTEZRQkJBQ2dDbkFnb0FnUkJBQ2dDa0FoclFRRjFDeFVBUVFBb0Fwd0lLQUlJUVFBb0FwQUlhMEVCZFFzVkFFRUFLQUtjQ0NnQ0RFRUFLQUtRQ0d0QkFYVUxPd0VCZndKQVFRQW9BcHdJS0FJUUlnQkJBQ2dDaEFoSERRQkJmdzhMQWtBZ0FFRUFLQUtJQ0VjTkFFRitEd3NnQUVFQUtBS1FDR3RCQVhVTEN3QkJBQ2dDbkFndEFCUUxGUUJCQUNnQ29BZ29BZ0JCQUNnQ2tBaHJRUUYxQ3hVQVFRQW9BcUFJS0FJRVFRQW9BcEFJYTBFQmRRc2xBUUYvUVFCQkFDZ0NuQWdpQUVFWWFrR1VDQ0FBR3lnQ0FDSUFOZ0tjQ0NBQVFRQkhDeVVCQVg5QkFFRUFLQUtnQ0NJQVFRaHFRWmdJSUFBYktBSUFJZ0EyQXFBSUlBQkJBRWNMQ0FCQkFDMEF4QWdMaFF3QkJYOGpBRUdBOEFCcklnRWtBRUVBUVFFNkFNUUlRUUJCLy84RE93SEtDRUVBUVFBb0Fvd0lOZ0xNQ0VFQVFRQW9BcEFJUVg1cUlnSTJBdUFJUVFBZ0FrRUFLQUswQ0VFQmRHb2lBellDNUFoQkFFRUFPd0hHQ0VFQVFRQTdBY2dJUVFCQkFEb0EwQWhCQUVFQU5nTEFDRUVBUVFBNkFMQUlRUUFnQVVHQTBBQnFOZ0xVQ0VFQUlBRkJnQkJxTmdMWUNFRUFRUUE2QU53SUFrQUNRQUpBQTBCQkFDQUNRUUpxSWdRMkF1QUlBa0FDUUFKQUFrQWdBaUFEVHcwQUlBUXZBUUFpQTBGM2FrRUZTUTBESUFOQm0zOXFJZ1ZCQkUwTkFTQURRU0JHRFFNQ1FDQURRUzlHRFFBZ0EwRTdSZzBEREFZTEFrQWdBaThCQkNJRVFTcEdEUUFnQkVFdlJ3MEdFQkFNQkFzUUVRd0RDMEVBSVFNZ0JDRUNRUUF0QUxBSURRWU1CUXNDUUFKQUlBVU9CUUVGQlFVQUFRc2dCQkFTUlEwQklBSkJCR3BCN1FCQjhBQkI3d0JCOGdCQjlBQVFFMFVOQVJBVURBRUxRUUF2QWNnSURRQWdCQkFTUlEwQUlBSkJCR3BCK0FCQjhBQkI3d0JCOGdCQjlBQVFFMFVOQUJBVlFRQXRBTVFJRFFCQkFFRUFLQUxnQ0NJQ05nTE1DQXdFQzBFQVFRQW9BdUFJTmdMTUNBdEJBQ2dDNUFnaEEwRUFLQUxnQ0NFQ0RBQUxDMEVBSUFJMkF1QUlRUUJCQURvQXhBZ0xBMEJCQUNBQ1FRSnFJZ00yQXVBSUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUpCQUNnQzVBaFBEUUFnQXk4QkFDSUVRWGRxUVFWSkRRNGdCRUZnYWlJRlFRbE5EUUVnQkVHZ2Yyb2lCVUVKVFEwQ0FrQUNRQUpBSUFSQmhYOXFJZ05CQWswTkFDQUVRUzlIRFJBZ0FpOEJCQ0lDUVNwR0RRRWdBa0V2UncwQ0VCQU1FUXNDUUFKQUlBTU9Bd0FSQVFBTEFrQkJBQ2dDekFnaUJDOEJBRUVwUncwQVFRQW9BcVFJSWdKRkRRQWdBaWdDQkNBRVJ3MEFRUUJCQUNnQ3FBZ2lBallDcEFnQ1FDQUNSUTBBSUFKQkFEWUNHQXdCQzBFQVFRQTJBcFFJQ3lBQlFRQXZBY2dJSWdKcVFRQXRBTndJT2dBQVFRQWdBa0VCYWpzQnlBaEJBQ2dDMkFnZ0FrRUNkR29nQkRZQ0FFRUFRUUE2QU53SURCQUxRUUF2QWNnSUlnSkZEUWxCQUNBQ1FYOXFJZ003QWNnSUFrQWdBa0VBTHdIS0NDSUVSdzBBUVFCQkFDOEJ4Z2hCZjJvaUFqc0J4Z2hCQUVFQUtBTFVDQ0FDUWYvL0EzRkJBWFJxTHdFQU93SEtDQXdJQ3lBRVFmLy9BMFlORHlBRFFmLy9BM0VnQkVrTkNRd1BDeEFSREE4TEFrQUNRQUpBQWtCQkFDZ0N6QWdpQkM4QkFDSUNFQlpGRFFBZ0FrRlZhaUlEUVFOTERRSUNRQUpBQWtBZ0F3NEVBUVVDQUFFTElBUkJmbW92QVFCQlVHcEIvLzhEY1VFS1NRMEREQVFMSUFSQmZtb3ZBUUJCSzBZTkFnd0RDeUFFUVg1cUx3RUFRUzFHRFFFTUFnc0NRQ0FDUWYwQVJnMEFJQUpCS1VjTkFVRUFLQUxZQ0VFQUx3SElDRUVDZEdvb0FnQVFGMFVOQVF3Q0MwRUFLQUxZQ0VFQUx3SElDQ0lEUVFKMGFpZ0NBQkFZRFFFZ0FTQURhaTBBQUEwQkN5QUVFQmtOQUNBQ1JRMEFRUUVoQkNBQ1FTOUdRUUF0QU5BSVFRQkhjVVVOQVFzUUdrRUFJUVFMUVFBZ0JEb0EwQWdNRFF0QkFDOEJ5Z2hCLy84RFJrRUFMd0hJQ0VWeFFRQXRBTEFJUlhFaEF3d1BDeUFGRGdvTUN3RUxDd3NMQWdjRURBc2dCUTRLQWdvS0J3b0pDZ29LQ0FJTEVCc01DUXNRSEF3SUN4QWREQWNMUVFBdkFjZ0lJZ0lOQVFzUUhrRUFJUU1NQ0F0QkFDQUNRWDlxSWdRN0FjZ0lRUUFvQXFRSUlnSkZEUVFnQWlnQ0VFRUFLQUxZQ0NBRVFmLy9BM0ZCQW5ScUtBSUFSdzBFSUFJZ0F6WUNCQXdFQzBFQVFRQXZBY2dJSWdKQkFXbzdBY2dJUVFBb0F0Z0lJQUpCQW5ScVFRQW9Bc3dJTmdJQURBTUxJQU1RRWtVTkFpQUNMd0VLUWZNQVJ3MENJQUl2QVFoQjh3QkhEUUlnQWk4QkJrSGhBRWNOQWlBQ0x3RUVRZXdBUncwQ0FrQUNRQ0FDTHdFTUlnUkJkMm9pQWtFWFN3MEFRUUVnQW5SQm40Q0FCSEVOQVFzZ0JFR2dBVWNOQXd0QkFFRUJPZ0RjQ0F3Q0N5QURFQkpGRFFFZ0FrRUVha0h0QUVId0FFSHZBRUh5QUVIMEFCQVRSUTBCRUJRTUFRdEJBQzhCeUFnTkFDQURFQkpGRFFBZ0FrRUVha0g0QUVId0FFSHZBRUh5QUVIMEFCQVRSUTBBRUJVTFFRQkJBQ2dDNEFnMkFzd0lDMEVBS0FMZ0NDRUNEQUFMQ3lBQlFZRHdBR29rQUNBREMxQUJCSDlCQUNnQzRBaEJBbW9oQUVFQUtBTGtDQ0VCQWtBRFFDQUFJZ0pCZm1vZ0FVOE5BU0FDUVFKcUlRQWdBaThCQUVGMmFpSURRUU5MRFFBZ0F3NEVBUUFBQVFFTEMwRUFJQUkyQXVBSUMzY0JBbjlCQUVFQUtBTGdDQ0lBUVFKcU5nTGdDQ0FBUVFacUlRQkJBQ2dDNUFnaEFRTkFBa0FDUUFKQUlBQkJmR29nQVU4TkFDQUFRWDVxTHdFQVFTcEhEUUlnQUM4QkFFRXZSdzBDUVFBZ0FFRithallDNEFnTUFRc2dBRUYrYWlFQUMwRUFJQUEyQXVBSUR3c2dBRUVDYWlFQURBQUxDeDBBQWtCQkFDZ0NrQWdnQUVjTkFFRUJEd3NnQUVGK2FpOEJBQkFmQ3o4QkFYOUJBQ0VHQWtBZ0FDOEJDQ0FGUncwQUlBQXZBUVlnQkVjTkFDQUFMd0VFSUFOSERRQWdBQzhCQWlBQ1J3MEFJQUF2QVFBZ0FVWWhCZ3NnQmd2M0F3RUVmMEVBUVFBb0F1QUlJZ0JCREdvaUFUWUM0QWdDUUFKQUFrQUNRQUpBRUNjaUFrRlphaUlEUVFkTkRRQWdBa0VpUmcwQ0lBSkIrd0JHRFFJTUFRc0NRQUpBSUFNT0NBTUJBZ01DQWdJQUF3dEJBRUVBS0FMZ0NFRUNhallDNEFnUUowSHRBRWNOQTBFQUtBTGdDQ0lETHdFR1FlRUFSdzBESUFNdkFRUkI5QUJIRFFNZ0F5OEJBa0hsQUVjTkEwRUFLQUxNQ0M4QkFFRXVSZzBESUFBZ0FDQURRUWhxUVFBb0FvZ0lFQUVQQzBFQUtBTFlDRUVBTHdISUNDSURRUUowYWlBQU5nSUFRUUFnQTBFQmFqc0J5QWhCQUNnQ3pBZ3ZBUUJCTGtZTkFpQUFRUUFvQXVBSVFRSnFRUUFnQUJBQlFRQkJBQ2dDNEFoQkFtbzJBdUFJQWtBQ1FCQW5JZ05CSWtZTkFBSkFJQU5CSjBjTkFCQWNEQUlMUVFCQkFDZ0M0QWhCZm1vMkF1QUlEd3NRR3d0QkFFRUFLQUxnQ0VFQ2FqWUM0QWdDUUJBblFTbEhEUUJCQUNnQ3BBZ2lBMEVCT2dBVUlBTkJBQ2dDNEFnMkFnUkJBRUVBTHdISUNFRi9hanNCeUFnUEMwRUFRUUFvQXVBSVFYNXFOZ0xnQ0E4TFFRQW9BdUFJSUFGR0RRRUxRUUF2QWNnSURRRkJBQ2dDNEFnaEEwRUFLQUxrQ0NFQkFrQURRQ0FESUFGUERRRUNRQUpBSUFNdkFRQWlBa0VuUmcwQUlBSkJJa2NOQVFzZ0FDQUNFQ2dQQzBFQUlBTkJBbW9pQXpZQzRBZ01BQXNMRUI0TER3dEJBRUVBS0FMZ0NFRithallDNEFnTGlBWUJCSDlCQUVFQUtBTGdDQ0lBUVF4cUlnRTJBdUFJRUNjaEFnSkFBa0FDUUFKQUFrQUNRRUVBS0FMZ0NDSURJQUZIRFFBZ0FoQXBSUTBCQ3dKQUFrQUNRQUpBSUFKQm4zOXFJZ0ZCQzAwTkFBSkFBa0FnQWtFcVJnMEFJQUpCOWdCR0RRVWdBa0g3QUVjTkEwRUFJQU5CQW1vMkF1QUlFQ2NoQTBFQUtBTGdDQ0VCQTBBZ0EwSC8vd054RUNvYVFRQW9BdUFJSVFJUUp4b0NRQ0FCSUFJUUt5SURRU3hIRFFCQkFFRUFLQUxnQ0VFQ2FqWUM0QWdRSnlFREMwRUFLQUxnQ0NFQ0FrQWdBMEg5QUVZTkFDQUNJQUZHRFF3Z0FpRUJJQUpCQUNnQzVBaE5EUUVNREFzTFFRQWdBa0VDYWpZQzRBZ01BUXRCQUNBRFFRSnFOZ0xnQ0JBbkdrRUFLQUxnQ0NJQ0lBSVFLeG9MRUNjaEFnd0JDeUFCRGd3RUFBRUdBQVVBQUFBQUFBSUVDMEVBS0FMZ0NDRURBa0FnQWtIbUFFY05BQ0FETHdFR1FlMEFSdzBBSUFNdkFRUkI3d0JIRFFBZ0F5OEJBa0h5QUVjTkFFRUFJQU5CQ0dvMkF1QUlJQUFRSnhBb0R3dEJBQ0FEUVg1cU5nTGdDQXdDQ3dKQUlBTXZBUWhCOHdCSERRQWdBeThCQmtIekFFY05BQ0FETHdFRVFlRUFSdzBBSUFNdkFRSkI3QUJIRFFBZ0F5OEJDaEFmUlEwQVFRQWdBMEVLYWpZQzRBZ1FKeUVDUVFBb0F1QUlJUU1nQWhBcUdpQURRUUFvQXVBSUVBSkJBRUVBS0FMZ0NFRithallDNEFnUEMwRUFJQU5CQkdvaUF6WUM0QWdMUVFBZ0EwRUVhaUlDTmdMZ0NFRUFRUUE2QU1RSUEwQkJBQ0FDUVFKcU5nTGdDQkFuSVFKQkFDZ0M0QWdoQXdKQUFrQWdBaEFxSWdKQlBVWU5BQ0FDUWZzQVJnMEFJQUpCMndCSERRRUxRUUJCQUNnQzRBaEJmbW8yQXVBSUR3dEJBQ2dDNEFnaUFpQURSZzBCSUFNZ0FoQUNFQ2NoQTBFQUtBTGdDQ0VDSUFOQkxFWU5BQXRCQUNBQ1FYNXFOZ0xnQ0E4TER3dEJBQ0FEUVFwcU5nTGdDQkFuR2tFQUtBTGdDQ0VEQzBFQUlBTkJFR28yQXVBSUFrQVFKeUlDUVNwSERRQkJBRUVBS0FMZ0NFRUNhallDNEFnUUp5RUNDMEVBS0FMZ0NDRURJQUlRS2hvZ0EwRUFLQUxnQ0JBQ1FRQkJBQ2dDNEFoQmZtbzJBdUFJRHdzZ0F5QURRUTVxRUFJUEN4QWVDM1VCQVg4Q1FBSkFJQUJCWDJvaUFVRUZTdzBBUVFFZ0FYUkJNWEVOQVFzZ0FFRkdha0gvL3dOeFFRWkpEUUFnQUVGWWFrSC8vd054UVFkSklBQkJLVWR4RFFBQ1FDQUFRYVYvYWlJQlFRTkxEUUFnQVE0RUFRQUFBUUVMSUFCQi9RQkhJQUJCaFg5cVFmLy9BM0ZCQkVseER3dEJBUXM5QVFGL1FRRWhBUUpBSUFCQjl3QkI2QUJCNlFCQjdBQkI1UUFRSUEwQUlBQkI1Z0JCN3dCQjhnQVFJUTBBSUFCQjZRQkI1Z0FRSWlFQkN5QUJDNjBCQVFOL1FRRWhBUUpBQWtBQ1FBSkFBa0FDUUFKQUlBQXZBUUFpQWtGRmFpSURRUU5ORFFBZ0FrR2JmMm9pQTBFRFRRMEJJQUpCS1VZTkF5QUNRZmtBUncwQ0lBQkJmbXBCNWdCQjZRQkI3Z0JCNFFCQjdBQkI3QUFRSXc4TElBTU9CQUlCQVFVQ0N5QUREZ1FDQUFBREFndEJBQ0VCQ3lBQkR3c2dBRUYrYWtIbEFFSHNBRUh6QUJBaER3c2dBRUYrYWtIakFFSGhBRUgwQUVIakFCQWtEd3NnQUVGK2FpOEJBRUU5Umd2dEF3RUNmMEVBSVFFQ1FDQUFMd0VBUVp4L2FpSUNRUk5MRFFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFJT0ZBQUJBZ2dJQ0FnSUNBZ0RCQWdJQlFnR0NBZ0hBQXNnQUVGK2FpOEJBRUdYZjJvaUFrRURTdzBIQWtBQ1FDQUNEZ1FBQ1FrQkFBc2dBRUY4YWtIMkFFSHZBQkFpRHdzZ0FFRjhha0g1QUVIcEFFSGxBQkFoRHdzZ0FFRithaThCQUVHTmYyb2lBa0VCU3cwR0FrQUNRQ0FDRGdJQUFRQUxBa0FnQUVGOGFpOEJBQ0lDUWVFQVJnMEFJQUpCN0FCSERRZ2dBRUY2YWtIbEFCQWxEd3NnQUVGNmFrSGpBQkFsRHdzZ0FFRjhha0hrQUVIbEFFSHNBRUhsQUJBa0R3c2dBRUYrYWk4QkFFSHZBRWNOQlNBQVFYeHFMd0VBUWVVQVJ3MEZBa0FnQUVGNmFpOEJBQ0lDUWZBQVJnMEFJQUpCNHdCSERRWWdBRUY0YWtIcEFFSHVBRUh6QUVIMEFFSGhBRUh1QUJBakR3c2dBRUY0YWtIMEFFSDVBQkFpRHd0QkFTRUJJQUJCZm1vaUFFSHBBQkFsRFFRZ0FFSHlBRUhsQUVIMEFFSDFBRUh5QUJBZ0R3c2dBRUYrYWtIa0FCQWxEd3NnQUVGK2FrSGtBRUhsQUVIaUFFSDFBRUhuQUVIbkFFSGxBQkFtRHdzZ0FFRitha0hoQUVIM0FFSGhBRUhwQUJBa0R3c0NRQ0FBUVg1cUx3RUFJZ0pCN3dCR0RRQWdBa0hsQUVjTkFTQUFRWHhxUWU0QUVDVVBDeUFBUVh4cVFmUUFRZWdBUWZJQUVDRWhBUXNnQVF1REFRRURmd05BUVFCQkFDZ0M0QWdpQUVFQ2FpSUJOZ0xnQ0FKQUFrQUNRQ0FBUVFBb0F1UUlUdzBBSUFFdkFRQWlBVUdsZjJvaUFrRUJUUTBDQWtBZ0FVRjJhaUlBUVFOTkRRQWdBVUV2UncwRURBSUxJQUFPQkFBREF3QUFDeEFlQ3c4TEFrQUNRQ0FDRGdJQkFBRUxRUUFnQUVFRWFqWUM0QWdNQVFzUUxCb01BQXNMa1FFQkJIOUJBQ2dDNEFnaEFFRUFLQUxrQ0NFQkFrQURRQ0FBSWdKQkFtb2hBQ0FDSUFGUERRRUNRQ0FBTHdFQUlnTkIzQUJHRFFBQ1FDQURRWFpxSWdKQkEwME5BQ0FEUVNKSERRSkJBQ0FBTmdMZ0NBOExJQUlPQkFJQkFRSUNDeUFDUVFScUlRQWdBaThCQkVFTlJ3MEFJQUpCQm1vZ0FDQUNMd0VHUVFwR0d5RUFEQUFMQzBFQUlBQTJBdUFJRUI0TGtRRUJCSDlCQUNnQzRBZ2hBRUVBS0FMa0NDRUJBa0FEUUNBQUlnSkJBbW9oQUNBQ0lBRlBEUUVDUUNBQUx3RUFJZ05CM0FCR0RRQUNRQ0FEUVhacUlnSkJBMDBOQUNBRFFTZEhEUUpCQUNBQU5nTGdDQThMSUFJT0JBSUJBUUlDQ3lBQ1FRUnFJUUFnQWk4QkJFRU5SdzBBSUFKQkJtb2dBQ0FDTHdFR1FRcEdHeUVBREFBTEMwRUFJQUEyQXVBSUVCNEx5UUVCQlg5QkFDZ0M0QWdoQUVFQUtBTGtDQ0VCQTBBZ0FDSUNRUUpxSVFBQ1FBSkFJQUlnQVU4TkFDQUFMd0VBSWdOQnBIOXFJZ1JCQkUwTkFTQURRU1JIRFFJZ0FpOEJCRUg3QUVjTkFrRUFRUUF2QWNZSUlnQkJBV283QWNZSVFRQW9BdFFJSUFCQkFYUnFRUUF2QWNvSU93RUFRUUFnQWtFRWFqWUM0QWhCQUVFQUx3SElDRUVCYWlJQU93SEtDRUVBSUFBN0FjZ0lEd3RCQUNBQU5nTGdDQkFlRHdzQ1FBSkFJQVFPQlFFQ0FnSUFBUXRCQUNBQU5nTGdDQThMSUFKQkJHb2hBQXdBQ3dzMUFRRi9RUUJCQVRvQXNBaEJBQ2dDNEFnaEFFRUFRUUFvQXVRSVFRSnFOZ0xnQ0VFQUlBQkJBQ2dDa0FoclFRRjFOZ0xBQ0FzMEFRRi9RUUVoQVFKQUlBQkJkMnBCLy84RGNVRUZTUTBBSUFCQmdBRnlRYUFCUmcwQUlBQkJMa2NnQUJBcGNTRUJDeUFCQzBrQkEzOUJBQ0VHQWtBZ0FFRjRhaUlIUVFBb0FwQUlJZ2hKRFFBZ0J5QUJJQUlnQXlBRUlBVVFFMFVOQUFKQUlBY2dDRWNOQUVFQkR3c2dBRUYyYWk4QkFCQWZJUVlMSUFZTFdRRURmMEVBSVFRQ1FDQUFRWHhxSWdWQkFDZ0NrQWdpQmtrTkFDQUFMd0VBSUFOSERRQWdBRUYrYWk4QkFDQUNSdzBBSUFVdkFRQWdBVWNOQUFKQUlBVWdCa2NOQUVFQkR3c2dBRUY2YWk4QkFCQWZJUVFMSUFRTFRBRURmMEVBSVFNQ1FDQUFRWDVxSWdSQkFDZ0NrQWdpQlVrTkFDQUFMd0VBSUFKSERRQWdCQzhCQUNBQlJ3MEFBa0FnQkNBRlJ3MEFRUUVQQ3lBQVFYeHFMd0VBRUI4aEF3c2dBd3RMQVFOL1FRQWhCd0pBSUFCQmRtb2lDRUVBS0FLUUNDSUpTUTBBSUFnZ0FTQUNJQU1nQkNBRklBWVFMVVVOQUFKQUlBZ2dDVWNOQUVFQkR3c2dBRUYwYWk4QkFCQWZJUWNMSUFjTFpnRURmMEVBSVFVQ1FDQUFRWHBxSWdaQkFDZ0NrQWdpQjBrTkFDQUFMd0VBSUFSSERRQWdBRUYrYWk4QkFDQURSdzBBSUFCQmZHb3ZBUUFnQWtjTkFDQUdMd0VBSUFGSERRQUNRQ0FHSUFkSERRQkJBUThMSUFCQmVHb3ZBUUFRSHlFRkN5QUZDejBCQW45QkFDRUNBa0JCQUNnQ2tBZ2lBeUFBU3cwQUlBQXZBUUFnQVVjTkFBSkFJQU1nQUVjTkFFRUJEd3NnQUVGK2FpOEJBQkFmSVFJTElBSUxUUUVEZjBFQUlRZ0NRQ0FBUVhScUlnbEJBQ2dDa0FnaUNra05BQ0FKSUFFZ0FpQURJQVFnQlNBR0lBY1FMa1VOQUFKQUlBa2dDa2NOQUVFQkR3c2dBRUZ5YWk4QkFCQWZJUWdMSUFnTGRnRURmMEVBS0FMZ0NDRUFBa0FEUUFKQUlBQXZBUUFpQVVGM2FrRUZTUTBBSUFGQklFWU5BQ0FCUWFBQlJnMEFJQUZCTDBjTkFnSkFJQUF2QVFJaUFFRXFSZzBBSUFCQkwwY05BeEFRREFFTEVCRUxRUUJCQUNnQzRBZ2lBa0VDYWlJQU5nTGdDQ0FDUVFBb0F1UUlTUTBBQ3dzZ0FRdFlBQUpBQWtBZ0FVRWlSZzBBSUFGQkowY05BVUVBS0FMZ0NDRUJFQndnQUNBQlFRSnFRUUFvQXVBSVFRQW9Bb1FJRUFFUEMwRUFLQUxnQ0NFQkVCc2dBQ0FCUVFKcVFRQW9BdUFJUVFBb0FvUUlFQUVQQ3hBZUMyZ0JBbjlCQVNFQkFrQUNRQ0FBUVY5cUlnSkJCVXNOQUVFQklBSjBRVEZ4RFFFTElBQkIrUDhEY1VFb1JnMEFJQUJCUm1wQi8vOERjVUVHU1EwQUFrQWdBRUdsZjJvaUFrRURTdzBBSUFKQkFVY05BUXNnQUVHRmYycEIvLzhEY1VFRVNTRUJDeUFCQzIwQkFuOENRQUpBQTBBQ1FDQUFRZi8vQTNFaUFVRjNhaUlDUVJkTERRQkJBU0FDZEVHZmdJQUVjUTBDQ3lBQlFhQUJSZzBCSUFBaEFpQUJFQ2tOQWtFQUlRSkJBRUVBS0FMZ0NDSUFRUUpxTmdMZ0NDQUFMd0VDSWdBTkFBd0NDd3NnQUNFQ0N5QUNRZi8vQTNFTFhBRUNmd0pBUVFBb0F1QUlJZ0l2QVFBaUEwSGhBRWNOQUVFQUlBSkJCR28yQXVBSUVDY2hBa0VBS0FMZ0NDRUFJQUlRS2hwQkFDZ0M0QWdoQVJBbklRTkJBQ2dDNEFnaEFnc0NRQ0FDSUFCR0RRQWdBQ0FCRUFJTElBTUxpUUVCQlg5QkFDZ0M0QWdoQUVFQUtBTGtDQ0VCQTM4Z0FFRUNhaUVDQWtBQ1FDQUFJQUZQRFFBZ0FpOEJBQ0lEUWFSL2FpSUVRUUZORFFFZ0FpRUFJQU5CZG1vaUEwRURTdzBDSUFJaEFDQUREZ1FBQWdJQUFBdEJBQ0FDTmdMZ0NCQWVRUUFQQ3dKQUFrQWdCQTRDQVFBQkMwRUFJQUkyQXVBSVFkMEFEd3NnQUVFRWFpRUFEQUFMQzBrQkFYOUJBQ0VIQWtBZ0FDOEJDaUFHUncwQUlBQXZBUWdnQlVjTkFDQUFMd0VHSUFSSERRQWdBQzhCQkNBRFJ3MEFJQUF2QVFJZ0FrY05BQ0FBTHdFQUlBRkdJUWNMSUFjTFV3RUJmMEVBSVFnQ1FDQUFMd0VNSUFkSERRQWdBQzhCQ2lBR1J3MEFJQUF2QVFnZ0JVY05BQ0FBTHdFR0lBUkhEUUFnQUM4QkJDQURSdzBBSUFBdkFRSWdBa2NOQUNBQUx3RUFJQUZHSVFnTElBZ0xDeDhDQUVHQUNBc0NBQUFBUVlRSUN4QUJBQUFBQWdBQUFBQUVBQUJ3T0FBQVwiLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGF0b2I/VWludDhBcnJheS5mcm9tKGF0b2IoRSksQT0+QS5jaGFyQ29kZUF0KDApKTpCdWZmZXIuZnJvbShFLFwiYmFzZTY0XCIpKSkudGhlbihXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSkudGhlbigoe2V4cG9ydHM6QX0pPT57Qj1BfSk7ZXhwb3J0cy5pbml0PWluaXQ7dmFyIEU7IiwgImltcG9ydCB7XG4gIEJ1aWxkT3B0aW9ucyxcbiAgT25Mb2FkQXJncyxcbiAgT25Mb2FkUmVzdWx0LFxuICBPblJlc29sdmVBcmdzLFxuICBQYXJ0aWFsTm90ZSxcbn0gZnJvbSBcImVzYnVpbGRcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZSwgZGVjb3JhdG9ycyB9IGZyb20gXCJkZWNreS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5cbmNvbnN0IGVzbUxleGVyID0gcmVxdWlyZShcImVzLW1vZHVsZS1sZXhlclwiKTtcblxubGV0IGhhc0xvYWRlZExleGVycyA9IGZhbHNlO1xuYXN5bmMgZnVuY3Rpb24gaW5pdExleGVycygpIHtcbiAgaWYgKGhhc0xvYWRlZExleGVycykgcmV0dXJuO1xuICBhd2FpdCBQcm9taXNlLmFsbChbZXNtTGV4ZXIuaW5pdF0pO1xuICBoYXNMb2FkZWRMZXhlcnMgPSB0cnVlO1xufVxuXG5jb25zdCBWQUxJRF9ERUNPUkFUT1JfSU1QT1JUX0VYVEVOU0lPTlMgPSBbXG4gIFwiLmRlY29yYXRvci50c1wiLFxuICBcIi5kZWNvcmF0b3IudHN4XCIsXG4gIFwiLmRlY29yYXRvclwiLFxuICBcIi5kZWNreS50c1wiLFxuICBcIi5kZWNreS50c3hcIixcbiAgXCIuZGVja3lcIixcbiAgXCIuZGVjLnRzXCIsXG4gIFwiLmRlYy50c3hcIixcbiAgXCIuZGVjXCIsXG5dO1xuXG50eXBlIEVTTUltcG9ydCA9IHtcbiAgLy8gc3RhcnRcbiAgczogbnVtYmVyO1xuICAvLyBlbmRcbiAgZTogbnVtYmVyO1xuICAvLyBzdGF0ZW1lbnQgc3RhcnRcbiAgc3M6IG51bWJlcjtcbiAgLy8gc3RhdGVtZW50IGVuZFxuICBzZTogbnVtYmVyO1xuICAvLyBpcyBpdCBhIGR5bmFtaWMgaW1wb3J0XG4gIGQ6IG51bWJlcjtcbiAgLy8gbW9kdWxlIHBhdGhcbiAgbjogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyRGVjb3JhdG9ySW1wb3J0KGVzbTogRVNNSW1wb3J0LCBpbmRleDogbnVtYmVyKSB7XG4gIHJldHVybiBWQUxJRF9ERUNPUkFUT1JfSU1QT1JUX0VYVEVOU0lPTlMuaW5jbHVkZXMoXG4gICAgcGF0aC5leHRuYW1lKGVzbS5uKS50b0xvd2VyQ2FzZSgpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVjb3JhdG9ySW1wb3J0cyhjb2RlOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiBFU01JbXBvcnRbXSB7XG4gIC8vIFRoaXMgdGhpbmcgcGFyc2VzIGJvdGggaW1wb3J0cyBhbmQgZXhwb3J0cywgd2hpY2ggaXMgdW5uZWNlc3NhcnkgZm9yIHRoaXMgdXNlIGNhc2UuXG4gIC8vIEEgZnV0dXJlIFRPRE8gaWYgZW5vdWdoIHBlb3BsZSB1c2UgdGhpcyB0aGluZyB3b3VsZCBiZSB0byBmb3JrIGl0IGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHBhcnNpbmcgZXhwb3J0c1xuICAvLyBUaGF0IHdvdWxkIHByb2JhYmx5IG1ha2UgaXQgbXVjaCBmYXN0ZXIsIGJ1dCBpdHMgYWxyZWFkeSBwcmV0dHkgcXVpY2suXG4gIGNvbnN0IFtpbXBvcnRzXSA9IGVzbUxleGVyLnBhcnNlKGNvZGUsIGZpbGVuYW1lKTtcblxuICByZXR1cm4gKGltcG9ydHMgYXMgRVNNSW1wb3J0W10pLmZpbHRlcihmaWx0ZXJEZWNvcmF0b3JJbXBvcnQpO1xufVxuXG50eXBlIFF1YWxpZmllciA9IFwicHVibGljXCIgfCBcInByaXZhdGVcIiB8IFwicHJvdGVjdGVkXCIgfCBudWxsO1xuXG50eXBlIERlc2lnblRpbWVQcm9wZXJ0eTxUID0gYW55W10+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgYXJncz86IFQ7XG4gIGlzU3RhdGljPzogYm9vbGVhbjtcbiAgcXVhbGlmaWVyPzogUXVhbGlmaWVyO1xuICBtZXRhZGF0YT86IERlY29yYXRvclJlc3VsdDtcbiAgZGVmYXVsdFZhbHVlPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDtcbn07XG5cbnR5cGUgVXNhZ2VNYXAgPSBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj47XG5cbnR5cGUgRGVzaWduVGltZVByb3BlcnR5RGVjb3JhdG9yRnVuY3Rpb248VD4gPSAoXG4gIHByb3BlcnR5OiBEZXNpZ25UaW1lUHJvcGVydHk8VD5cbikgPT4gdm9pZCB8IGFueTtcblxuZXhwb3J0IHR5cGUgRGVzaWduVGltZVByb3BlcnR5RGVjb3JhdG9yPFQ+ID0gKFxuICAuLi5hcmdzOiBzdHJpbmdbXVxuKSA9PiBEZXNpZ25UaW1lUHJvcGVydHlEZWNvcmF0b3JGdW5jdGlvbjxUPjtcblxudHlwZSBEZXNpZ25UaW1lQ2xhc3M8VCA9IGFueVtdPiA9IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIGFyZ3M/OiBUO1xuICBtZXRhZGF0YT86IERlY29yYXRvclJlc3VsdDtcbn07XG5cbnR5cGUgRGVzaWduVGltZUNsYXNzRnVuY3Rpb248VD4gPSAoa2xhc3M6IERlc2lnblRpbWVDbGFzczxUPikgPT4gdm9pZCB8IGFueTtcblxuZXhwb3J0IHR5cGUgRGVzaWduVGltZUNsYXNzRGVjb3JhdG9yPFQ+ID0gKCkgPT4gRGVzaWduVGltZUNsYXNzRnVuY3Rpb248VD47XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvcnNNYXAgPSB7XG4gIFttb2R1bGVQYXRoOiBzdHJpbmddOiB7XG4gICAgW25hbWU6IHN0cmluZ106XG4gICAgICB8IERlc2lnblRpbWVQcm9wZXJ0eURlY29yYXRvcjxhbnk+XG4gICAgICB8IERlc2lnblRpbWVDbGFzc0RlY29yYXRvcjxhbnk+O1xuICB9O1xufTtcblxuaW50ZXJmYWNlIERlY29yYXRvclJlc3VsdCB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JpZ2luYWxTb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnRJbmRleDogbnVtYmVyO1xuICByZWFkb25seSBzdG9wSW5kZXg6IG51bWJlcjtcbn1cblxudHlwZSBEZWNvcmF0b3JQcm9jZXNzb3IgPSAoXG4gIHByZWZpeFN0YXJ0OiBudW1iZXIsXG4gIHJlc3VsdDogRGVjb3JhdG9yUmVzdWx0XG4pID0+IFByb21pc2U8Ym9vbGVhbj47XG5cbmZ1bmN0aW9uIHRyaW0oaW5wdXQ6IHN0cmluZykge1xuICByZXR1cm4gaW5wdXQudHJpbSgpO1xufVxuXG5jbGFzcyBQcm9jZXNzb3JFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGZpbGU6IHN0cmluZyxcbiAgICBsaW5lTnVtYmVyOiBudW1iZXIsXG4gICAgbGluZVRleHQ6IHN0cmluZyxcbiAgICBjb2x1bW4/OiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5ub3RlID0ge1xuICAgICAgdGV4dDogbWVzc2FnZSxcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIGxpbmU6IGxpbmVOdW1iZXIsXG4gICAgICAgIGxpbmVUZXh0LFxuXG4gICAgICAgIGNvbHVtbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBub3RlOiBQYXJ0aWFsTm90ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGREZWNvcmF0b3JQcm9jZXNzb3IoZGVjb3JhdG9yc01vZHVsZU1hcDogRGVjb3JhdG9yc01hcCkge1xuICBjb25zdCBmaWxlTWFwcGluZyA9IHt9O1xuICBjb25zdCBhbGxQcmVmaXhlcyA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIGRlY29yYXRvcnNNb2R1bGVNYXApIHtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gZGVjb3JhdG9yc01vZHVsZU1hcFttb2R1bGVOYW1lXTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGVjb3JhdG9ycyAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgT2JqZWN0LmtleXMoZGVjb3JhdG9ycykubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGVja3ldIFwiZGVjb3JhdG9yc1wiIG5vdCBleHBvcnRlZCBpbiAke21vZHVsZU5hbWV9LCBpZ25vcmluZyBmaWxlLmBcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvcmF0b3JLZXlzID0gT2JqZWN0LmtleXMoZGVjb3JhdG9ycykuc29ydCgpLnJldmVyc2UoKTtcbiAgICBjb25zdCBkZWNvcmF0b3JQcmVmaXhlcyA9IGRlY29yYXRvcktleXMubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGRlY29yYXRvckZ1bmN0aW9uczogQXJyYXk8RGVjb3JhdG9yUHJvY2Vzc29yPiA9IG5ldyBBcnJheShcbiAgICAgIGRlY29yYXRvcktleXMubGVuZ3RoXG4gICAgKTtcbiAgICBjb25zdCBmbGF0dGVuZWRGdW5jcyA9IGRlY29yYXRvcktleXMubWFwKFxuICAgICAgKGEpID0+IChkZWNvcmF0b3JzW2FdIGFzIGFueSkuY2FsbGJhY2tcbiAgICApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvcmF0b3JLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBkZWNvcmF0b3JLZXlzW2ldO1xuICAgICAgY29uc3QgcHJlZml4ID0gZGVjb3JhdG9yUHJlZml4ZXNbaV07XG4gICAgICBjb25zdCBsZW5ndGggPSBrZXkubGVuZ3RoO1xuICAgICAgY29uc3QgZGVjb3JhdG9yRnVuYzpcbiAgICAgICAgfCBEZXNpZ25UaW1lQ2xhc3NGdW5jdGlvbjxhbnk+XG4gICAgICAgIHwgRGVzaWduVGltZVByb3BlcnR5RGVjb3JhdG9yRnVuY3Rpb248YW55PiA9IGZsYXR0ZW5lZEZ1bmNzW2ldO1xuXG4gICAgICBjb25zdCBwcm9jZXNzRGVjb3JhdG9yOiBEZWNvcmF0b3JQcm9jZXNzb3IgPSBhc3luYyAoXG4gICAgICAgIHByZWZpeFN0YXJ0LFxuICAgICAgICByZXN1bHRcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5ERUNLWV9USU1JTkdTKVxuICAgICAgICAgIGNvbnNvbGUudGltZShcbiAgICAgICAgICAgIGBbZGVja3ldIC0+ICR7cHJlZml4fTogJHtwYXRoLnJlbGF0aXZlKFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgIHJlc3VsdC5maWxlUGF0aFxuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgbGV0IGNvZGUgPSByZXN1bHQuY29kZTtcbiAgICAgICAgbGV0IHByZWZpeEVuZCA9IHJlc3VsdC5zdG9wSW5kZXg7XG4gICAgICAgIGxldCBhcmdTdGFydCA9IHByZWZpeEVuZDtcbiAgICAgICAgbGV0IGxpbmVFbmQgPSBwcmVmaXhFbmQ7XG5cbiAgICAgICAgd2hpbGUgKGNvZGVbbGluZUVuZF0gIT09IFwiXFxuXCIpIHtcbiAgICAgICAgICBsaW5lRW5kKys7XG4gICAgICAgICAgaWYgKGNvZGUubGVuZ3RoIDwgbGluZUVuZCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoY29kZVthcmdTdGFydF0gIT09IFwiKFwiICYmIGFyZ1N0YXJ0IDwgbGluZUVuZCkge1xuICAgICAgICAgIGFyZ1N0YXJ0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnRW5kID0gLTE7XG4gICAgICAgIGxldCBhcmdMaXN0O1xuICAgICAgICBpZiAoY29kZVthcmdTdGFydCsrXSA9PT0gXCIoXCIpIHtcbiAgICAgICAgICBhcmdFbmQgPSBjb2RlLmluZGV4T2YoXCIpXCIsIGFyZ1N0YXJ0KTtcbiAgICAgICAgICBpZiAoYXJnRW5kIC0gMSA+IGFyZ1N0YXJ0KSB7XG4gICAgICAgICAgICBpZiAoYXJnRW5kIDwgMClcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NvckVycm9yKFxuICAgICAgICAgICAgICAgIGBNaXNzaW5nICkgZm9yICR7cHJlZml4fWAsXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhTdGFydCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5jb2RlLnNwbGl0KFwiXFxuXCIpW1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvZGUuc3Vic3RyaW5nKDAsIHByZWZpeFN0YXJ0KS5zcGxpdChcIlxcblwiKS5sZW5ndGhcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHByZWZpeEVuZFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhcmdMaXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBcIltcIiArIGNvZGUuc3Vic3RyaW5nKGFyZ1N0YXJ0LCBhcmdFbmQpICsgXCJdXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc29yRXJyb3IoXG4gICAgICAgICAgICAgICAgYEFyZ3VtZW50cyB0byAke3ByZWZpeH0gbXVzdCBiZSBKU09OLiBSZWNlaXZlZDogWyR7Y29kZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICBhcmdTdGFydCxcbiAgICAgICAgICAgICAgICAgIGFyZ0VuZFxuICAgICAgICAgICAgICAgICl9XWAsXG4gICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhTdGFydCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICByZXN1bHQuY29kZS5zcGxpdChcIlxcblwiKVtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhTdGFydCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgYXJnU3RhcnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJnU3RhcnQgPSAtMTtcbiAgICAgICAgICAgIGFyZ0xpc3QgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJnU3RhcnQgPSAtMTtcbiAgICAgICAgICBhcmdMaXN0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRMaW5lU3RhcnQgPSBsaW5lRW5kICsgMTtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIGNvZGVbbmV4dExpbmVTdGFydF0gPT09IFwiIFwiIHx8XG4gICAgICAgICAgY29kZVtuZXh0TGluZVN0YXJ0XSA9PT0gXCI7XCIgfHxcbiAgICAgICAgICBjb2RlW25leHRMaW5lU3RhcnRdID09PSBcIlxcblwiXG4gICAgICAgICkge1xuICAgICAgICAgIG5leHRMaW5lU3RhcnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBfbmV4dE5ld2xpbmUgPSBjb2RlLmluZGV4T2YoXCJcXG5cIiwgbmV4dExpbmVTdGFydCk7XG4gICAgICAgIGxldCBfbmV4dFNlbWljb2xvbiA9IGNvZGUuaW5kZXhPZihcIjtcIiwgbmV4dExpbmVTdGFydCk7XG4gICAgICAgIGxldCBuZXh0TGluZUVuZCA9XG4gICAgICAgICAgKF9uZXh0TmV3bGluZSA8IF9uZXh0U2VtaWNvbG9uID8gX25leHROZXdsaW5lIDogX25leHRTZW1pY29sb24pICsgMTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lID0gY29kZS5zdWJzdHJpbmcobmV4dExpbmVTdGFydCwgbmV4dExpbmVFbmQpO1xuICAgICAgICBsZXQgbmV4dExpbmUgPSBvcmlnaW5hbExpbmU7XG5cbiAgICAgICAgbGV0IGlzU3RhdGljID0gZmFsc2U7XG4gICAgICAgIGxldCBxdWFsaWZpZXI6IFF1YWxpZmllciA9IG51bGw7XG5cbiAgICAgICAgaWYgKG5leHRMaW5lLnN0YXJ0c1dpdGgoXCJleHBvcnQgXCIpKSB7XG4gICAgICAgICAgbmV4dExpbmUgPSBuZXh0TGluZS5zdWJzdHJpbmcoXCJleHBvcnQgXCIubGVuZ3RoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dExpbmUuc3RhcnRzV2l0aChcInB1YmxpYyBcIikpIHtcbiAgICAgICAgICBxdWFsaWZpZXIgPSBcInB1YmxpY1wiO1xuICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUuc3Vic3RyaW5nKFwicHVibGljXCIubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXh0TGluZS5zdGFydHNXaXRoKFwicHJpdmF0ZSBcIikpIHtcbiAgICAgICAgICBxdWFsaWZpZXIgPSBcInByaXZhdGVcIjtcbiAgICAgICAgICBuZXh0TGluZSA9IG5leHRMaW5lLnN1YnN0cmluZyhcInByaXZhdGVcIi5sZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5leHRMaW5lLnN0YXJ0c1dpdGgoXCJwcm90ZWN0ZWQgXCIpKSB7XG4gICAgICAgICAgcXVhbGlmaWVyID0gXCJwcm90ZWN0ZWRcIjtcbiAgICAgICAgICBuZXh0TGluZSA9IG5leHRMaW5lLnN1YnN0cmluZyhcInByb3RlY3RlZFwiLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0TGluZSA9IG5leHRMaW5lLnRyaW0oKTtcbiAgICAgICAgbGV0IGlzQ2xhc3MgPSBuZXh0TGluZS5zdGFydHNXaXRoKFwiY2xhc3MgXCIpO1xuXG4gICAgICAgIGlmICghaXNDbGFzcykge1xuICAgICAgICAgIGlzU3RhdGljID0gbmV4dExpbmUuc3RhcnRzV2l0aChcInN0YXRpYyBcIik7XG4gICAgICAgICAgaWYgKGlzU3RhdGljKSB7XG4gICAgICAgICAgICBuZXh0TGluZS5zdWJzdHJpbmcoXCJzdGF0aWMgXCIubGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDbGFzcykge1xuICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUuc3Vic3RyaW5nKFwiY2xhc3MgXCIubGVuZ3RoKS50cmltKCk7XG4gICAgICAgICAgbmV4dExpbmUgPSBuZXh0TGluZS5zdWJzdHJpbmcoMCwgbmV4dExpbmUuaW5kZXhPZihcIiBcIikpLnRyaW0oKTtcbiAgICAgICAgICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5ERUNLWV9USU1JTkdTKVxuICAgICAgICAgICAgY29uc29sZS50aW1lKFxuICAgICAgICAgICAgICBgW2RlY2t5XSAke1xuICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUobW9kdWxlTmFtZSkuc3BsaXQoXCIuXCIpWzBdXG4gICAgICAgICAgICAgIH0uJHtwcmVmaXh9KCR7YXJnTGlzdC5qb2luKFwiLCBcIil9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRPRE86IG9iamVjdCBwb29saW5nXG4gICAgICAgICAgICBhd2FpdCAoZGVjb3JhdG9yRnVuYyBhcyBEZXNpZ25UaW1lQ2xhc3NGdW5jdGlvbjxhbnk+KSh7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogbmV4dExpbmUsXG4gICAgICAgICAgICAgIGFyZ3M6IGFyZ0xpc3QsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICB9IGFzIERlc2lnblRpbWVDbGFzcyk7XG5cbiAgICAgICAgICAgIChyZXN1bHQuc3RvcEluZGV4IGFzIGFueSkgPSBuZXh0TGluZVN0YXJ0O1xuICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NvckVycm9yKFxuICAgICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSArIGBcXG5JbiBmaWxlOlxcbiR7cmVzdWx0LmNvZGV9YCxcbiAgICAgICAgICAgICAgcmVzdWx0LmZpbGVQYXRoLFxuICAgICAgICAgICAgICByZXN1bHQuY29kZS5zdWJzdHJpbmcoMCwgcHJlZml4U3RhcnQpLnNwbGl0KFwiXFxuXCIpLmxlbmd0aCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvZGUuc3BsaXQoXCJcXG5cIilbXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvZGUuc3Vic3RyaW5nKDAsIHByZWZpeFN0YXJ0KS5zcGxpdChcIlxcblwiKS5sZW5ndGggLSAxXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHByZWZpeEVuZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcy5lbnYuREVDS1lfVElNSU5HUylcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKFxuICAgICAgICAgICAgICAgIGBbZGVja3ldICR7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKG1vZHVsZU5hbWUpLnNwbGl0KFwiLlwiKVswXVxuICAgICAgICAgICAgICAgIH0uJHtwcmVmaXh9KCR7YXJnTGlzdC5qb2luKFwiLCBcIil9KWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBrZXkgPSBuZXh0TGluZS50cmltKCk7XG4gICAgICAgICAgbGV0IHR5cGVOYW1lID0gXCJcIjtcbiAgICAgICAgICBsZXQgdHlwZVNlcGFyYXRvckluZGV4ID0gbmV4dExpbmUuaW5kZXhPZihcIjpcIik7XG4gICAgICAgICAgbGV0IGVxdWFsc0luZGV4ID0gbmV4dExpbmUuaW5kZXhPZihcIj1cIik7XG4gICAgICAgICAgbGV0IG9wZW5QYXJlbnRoZXNlcyA9IG5leHRMaW5lLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAodHlwZVNlcGFyYXRvckluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG5leHRMaW5lLnN1YnN0cmluZygwLCB0eXBlU2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICAgICAgICAgIHR5cGVOYW1lID0gbmV4dExpbmUuc3Vic3RyaW5nKHR5cGVTZXBhcmF0b3JJbmRleCArIDEpLnRyaW0oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgc2VtaWNvbG9uSW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKFwiO1wiKTtcblxuICAgICAgICAgIC8vIElnbm9yZSBlcXVhbHMgd2hlbiBvcGVuIHBhcmVudGhlc2VzIGV4aXN0cywgbm90IGRlYWxpbmcgd2l0aCBwYXJzaW5nIHRoYXQuXG4gICAgICAgICAgaWYgKGVxdWFsc0luZGV4ID4gLTEgJiYgb3BlblBhcmVudGhlc2VzID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICBrZXkgPSBuZXh0TGluZS5zdWJzdHJpbmcoMCwgZXF1YWxzSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBfZGVmYXVsdFZhbHVlID0gbmV4dExpbmVcbiAgICAgICAgICAgICAgLnN1YnN0cmluZyhlcXVhbHNJbmRleCArIDEpXG4gICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgLnJlcGxhY2UoLzsvZ20sIFwiXCIpXG4gICAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBKU09OLnBhcnNlKF9kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5ERUNLWV9WRVJCT1NFKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGV4Y2VwdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZU5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlb2YgZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZW1pY29sb25JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBzZW1pY29sb25JbmRleCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NvckVycm9yKFxuICAgICAgICAgICAgICBcIk1pc3NpbmcgbmFtZSBmb3IgcHJvcGVydHkgYmVsb3cgcHJvcGVydHkgZGVzY3JpcHRvclwiLFxuICAgICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICAgIHJlc3VsdC5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhTdGFydCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoLFxuICAgICAgICAgICAgICBuZXh0TGluZSxcbiAgICAgICAgICAgICAgcHJlZml4RW5kXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIChyZXN1bHQuY29kZSBhcyBhbnkpID0gY29kZTtcbiAgICAgICAgICAvLyBUT0RPOiBvYmplY3QgcG9vbGluZ1xuICAgICAgICAgIGxldCBuZXdDb2RlOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcy5lbnYuREVDS1lfVElNSU5HUylcbiAgICAgICAgICAgIGNvbnNvbGUudGltZShcbiAgICAgICAgICAgICAgYFtkZWNreV0gJHtcbiAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKG1vZHVsZU5hbWUpLnNwbGl0KFwiLlwiKVswXVxuICAgICAgICAgICAgICB9LiR7cHJlZml4fSgke2FyZ0xpc3Quam9pbihcIiwgXCIpfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXdDb2RlID0gYXdhaXQgKGRlY29yYXRvckZ1bmMgYXMgRGVzaWduVGltZVByb3BlcnR5RGVjb3JhdG9yRnVuY3Rpb248YW55PikoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZU5hbWUsXG4gICAgICAgICAgICAgICAgYXJnczogYXJnTGlzdCxcbiAgICAgICAgICAgICAgICBpc1N0YXRpYyxcbiAgICAgICAgICAgICAgICBxdWFsaWZpZXIsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc29yRXJyb3IoXG4gICAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpICsgYFxcbkluIGZpbGU6XFxuJHtyZXN1bHQuY29kZX1gLFxuICAgICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICAgIHJlc3VsdC5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhTdGFydCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoLFxuICAgICAgICAgICAgICByZXN1bHQuY29kZS5zcGxpdChcIlxcblwiKVtcbiAgICAgICAgICAgICAgICByZXN1bHQuY29kZS5zdWJzdHJpbmcoMCwgcHJlZml4U3RhcnQpLnNwbGl0KFwiXFxuXCIpLmxlbmd0aFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBwcmVmaXhFbmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxUaGlzLnByb2Nlc3MuZW52LkRFQ0tZX1RJTUlOR1MpXG4gICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZChcbiAgICAgICAgICAgICAgICBgW2RlY2t5XSAke1xuICAgICAgICAgICAgICAgICAgcGF0aC5iYXNlbmFtZShtb2R1bGVOYW1lKS5zcGxpdChcIi5cIilbMF1cbiAgICAgICAgICAgICAgICB9LiR7cHJlZml4fSgke2FyZ0xpc3Quam9pbihcIiwgXCIpfSlgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnbG9iYWxUaGlzLnByb2Nlc3MuZW52LkRFQ0tZX1RJTUlOR1MpXG4gICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoXG4gICAgICAgICAgICAgIGBbZGVja3ldIC0+ICR7cHJlZml4fTogJHtwYXRoLnJlbGF0aXZlKFxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXN1bHQuZmlsZVBhdGhcbiAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmICghbmV3Q29kZSAmJiBuZXdDb2RlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAocmVzdWx0LnN0YXJ0SW5kZXggYXMgYW55KSA9IHByZWZpeFN0YXJ0O1xuICAgICAgICAgICAgKHJlc3VsdC5zdG9wSW5kZXggYXMgYW55KSA9IG5leHRMaW5lU3RhcnQ7XG4gICAgICAgICAgICAocmVzdWx0LmNvZGUgYXMgYW55KSA9IG5ld0NvZGUgfHwgXCJcIjtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAocmVzdWx0LnN0YXJ0SW5kZXggYXMgYW55KSA9IHByZWZpeFN0YXJ0IC0gMTtcbiAgICAgICAgICAocmVzdWx0LnN0b3BJbmRleCBhcyBhbnkpID0gbmV4dExpbmVFbmQgLSAxO1xuICAgICAgICAgIChyZXN1bHQuY29kZSBhcyBhbnkpID0gbmV3Q29kZSB8fCBcIlwiO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBkZWNvcmF0b3JGdW5jdGlvbnNbaV0gPSBwcm9jZXNzRGVjb3JhdG9yO1xuICAgIH1cbiAgICBmaWxlTWFwcGluZ1twYXRoLmJhc2VuYW1lKG1vZHVsZU5hbWUsIHBhdGguZXh0bmFtZShtb2R1bGVOYW1lKSldID0ge1xuICAgICAgZGVjb3JhdG9yRnVuY3Rpb25zLFxuICAgICAgZGVjb3JhdG9yUHJlZml4ZXMsXG4gICAgfTtcbiAgICBkZWNvcmF0b3JQcmVmaXhlcy5mb3JFYWNoKChwcmVmaXgpID0+IGFsbFByZWZpeGVzLmFkZChwcmVmaXgpKTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeGVzID0gWy4uLmFsbFByZWZpeGVzXS5zb3J0KCkucmV2ZXJzZSgpO1xuXG4gIHJldHVybiB7XG4gICAgcHJvY2VzczogYXN5bmMgKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IG1vZHVsZUltcG9ydHM6IEVTTUltcG9ydFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbW9kdWxlSW1wb3J0cyA9IHBhcnNlRGVjb3JhdG9ySW1wb3J0cyhjb2RlLCBmaWxlUGF0aCk7XG4gICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NvckVycm9yKFxuICAgICAgICAgIGBJbXBvcnQvZXhwb3J0IHBhcnNlIGVycm9yOiAke2V4Y2VwdGlvbi50b1N0cmluZygpfWAsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgMCxcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kdWxlcyA9IG5ldyBBcnJheTxzdHJpbmc+KG1vZHVsZUltcG9ydHMubGVuZ3RoKTtcbiAgICAgIGxldCBtb2R1bGVJID0gMDtcbiAgICAgIC8vIFJlbW92ZSBkZWNvcmF0b3IgaW1wb3J0c1xuICAgICAgZm9yIChsZXQgbW9kdWxlSW1wb3J0IG9mIG1vZHVsZUltcG9ydHMpIHtcbiAgICAgICAgY29kZSA9XG4gICAgICAgICAgY29kZS5zdWJzdHJpbmcoMCwgbW9kdWxlSW1wb3J0LnNzKSArXG4gICAgICAgICAgXCIgXCIucmVwZWF0KG1vZHVsZUltcG9ydC5zZSAtIG1vZHVsZUltcG9ydC5zcyArIDEpICtcbiAgICAgICAgICBjb2RlLnN1YnN0cmluZyhtb2R1bGVJbXBvcnQuc2UgKyAxKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHBhdGguYmFzZW5hbWUobW9kdWxlSW1wb3J0Lm4pO1xuICAgICAgICBpZiAoZmlsZU1hcHBpbmdbbmFtZV0pIHtcbiAgICAgICAgICBtb2R1bGVzW21vZHVsZUkrK10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyAxLiBJZ25vcmUgY29tbWVudCBsaW5lc1xuICAgICAgLy8gMi4gUmVwbGFjZSBkb3VibGUgZW1wdHkgbGluZXMgd2l0aCBzaW5nbGUgZW1wdHkgbGluZXNcbiAgICAgIC8vIDMuIFRyaW0gdHJhaWxpbmcvbGVhZGluZyB3aGl0ZXNwYWNlL25ld2xpbmVzLCBidXQgYWRkIG9uZSBuZXdsaW5lIGF0IHRoZSBlbmQuXG4gICAgICAvLyBJZiB0aGlzIG5lZWRzIHRvIGJlIG9wdGltaXplZCwgdGhpcyBjb2RlIGNvdWxkIGJlIHR1cm5lZCBpbnRvIG9uZSBmdW5jdGlvbiBjYWxsIGRvbmUgaW4gYSBzaW5nbGUgcGFzcyBwcm9iYWJseS5cbiAgICAgIGNvZGUgPVxuICAgICAgICBjb2RlXG4gICAgICAgICAgLnJlcGxhY2UoL15cXHMqXFwvXFwvLipcXG4/JC9nbSwgXCJcIilcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXFxuXCIpXG4gICAgICAgICAgLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAudHJpbSgpICsgXCJcXG5cIjtcbiAgICAgIGlmIChnbG9iYWxUaGlzLnByb2Nlc3MuZW52LkRFQ0tZX1ZFUkJPU0UpIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhjb2RlKSk7XG4gICAgICBpZiAobW9kdWxlSSAhPT0gbW9kdWxlcy5sZW5ndGgpIHtcbiAgICAgICAgbW9kdWxlcy5sZW5ndGggPSBtb2R1bGVJO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICBjb2RlLFxuICAgICAgICBvcmlnaW5hbFNvdXJjZTogY29kZSxcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIHN0YXJ0SW5kZXg6IC0xLFxuICAgICAgICBzdG9wSW5kZXg6IC0xLFxuICAgICAgfTtcblxuICAgICAgbGV0IHN5bWJvbEkgPSBjb2RlLmxhc3RJbmRleE9mKFwiQFwiKSAtIDE7XG4gICAgICBpZiAoc3ltYm9sSSA8IC0xKSByZXR1cm4geyBjb250ZW50czogY29kZSwgbm90ZTogbnVsbCB9O1xuICAgICAgaWYgKHN5bWJvbEkgPT09IC0xKSBzeW1ib2xJKys7XG4gICAgICBsZXQgX3ByZWZpeEkgPSAtMTtcbiAgICAgIGxldCBwcmVmaXhJID0gLTE7XG4gICAgICBsZXQgcHJlZml4ID0gXCJcIjtcbiAgICAgIGxldCBfY29kZSA9IFwiXCI7XG4gICAgICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG5cbiAgICAgIGxldCBsYXN0TWF0Y2hJbmRleCA9IC0xO1xuXG4gICAgICBkbyB7XG4gICAgICAgIHN5bWJvbEkgPSByZXN1bHQuY29kZS5sYXN0SW5kZXhPZihcIkBcIik7XG4gICAgICAgIGlmIChzeW1ib2xJID09PSAtMSkgYnJlYWs7XG4gICAgICAgIHJlc3VsdC5zdGFydEluZGV4ID0gc3ltYm9sSTtcbiAgICAgICAgcmVzdWx0LnN0b3BJbmRleCA9IHJlc3VsdC5zdGFydEluZGV4ICsgMTtcbiAgICAgICAgcHJlZml4ID0gXCIwQUZcIjtcbiAgICAgICAgd2hpbGUgKHJlc3VsdC5zdG9wSW5kZXggPCByZXN1bHQuY29kZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHQuc3RvcEluZGV4Kys7XG5cbiAgICAgICAgICAvLyBUaGluZ3MgdGhhdCBlbmQgc3RhdGVtZW50cyBpbiBKYXZhU2NyaXB0OlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlW3Jlc3VsdC5zdG9wSW5kZXhdID09PSBcIiBcIiB8fFxuICAgICAgICAgICAgcmVzdWx0LmNvZGVbcmVzdWx0LnN0b3BJbmRleF0gPT09IFwiKFwiIHx8XG4gICAgICAgICAgICByZXN1bHQuY29kZVtyZXN1bHQuc3RvcEluZGV4XSA9PT0gXCJcXG5cIiB8fFxuICAgICAgICAgICAgcmVzdWx0LmNvZGVbcmVzdWx0LnN0b3BJbmRleF0gPT09IFwiO1wiIHx8XG4gICAgICAgICAgICByZXN1bHQuY29kZVtyZXN1bHQuc3RvcEluZGV4XSA9PT0gXCIsXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByZWZpeCA9IHJlc3VsdC5jb2RlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0SW5kZXggKyAxLFxuICAgICAgICAgICAgICByZXN1bHQuc3RvcEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdG8gYWRkIGEgaGVscGZ1bCBzeW50YXggZXJyb3IgY2hlY2tlciBoZXJlP1xuICAgICAgICAgIC8vIExpa2UgaWYgeW91IHR5cGUgQCBmb29cbiAgICAgICAgICAvLyBIb3BlZnVsbHkgZXNidWlsZCB3aWxsIGp1c3QgaGFuZGxlIHRoYXQgY2FzZSEgdGh4IEBldmFud1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHVsdHJhIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB1c2luZyBhIHRyaWUhXG4gICAgICAgIC8vIE9ubHkgbmVjZXNzYXJ5IGlmIHdlIGdldCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlcmUgYXJlIGh1bmRyZWRzIG9mIGRlY29yYXRvcnNcbiAgICAgICAgbGV0IGRlY29yYXRvck1vZHVsZU5hbWU7XG4gICAgICAgIGZvciAobGV0IG1vZHVsZU5hbWUgb2YgbW9kdWxlcykge1xuICAgICAgICAgIHByZWZpeEkgPSBmaWxlTWFwcGluZ1ttb2R1bGVOYW1lXS5kZWNvcmF0b3JQcmVmaXhlcy5pbmRleE9mKHByZWZpeCk7XG4gICAgICAgICAgaWYgKHByZWZpeEkgPiAtMSkge1xuICAgICAgICAgICAgZGVjb3JhdG9yTW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlZml4SSA9PT0gLTEpIHtcbiAgICAgICAgICAvLyBFeGNpdGVkIGZvciB0aGUgZ2l0aHViIGlzc3VlIHRoYXQgc2F5cywgXCJXaHkgaXMgdGhlcmUgc2hyaW1wIGluIG15IGNvZGU/P1wiXG4gICAgICAgICAgcmVzdWx0LmNvZGUgPVxuICAgICAgICAgICAgcmVzdWx0LmNvZGUuc3Vic3RyaW5nKDAsIHN5bWJvbEkpICtcbiAgICAgICAgICAgIFwiXHVEODNDXHVERjY0XCIgK1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUuc3Vic3RyaW5nKHN5bWJvbEkgKyAxKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZGVjb3JhdG9yRnVuY3Rpb25zIH0gPSBmaWxlTWFwcGluZ1tkZWNvcmF0b3JNb2R1bGVOYW1lXTtcblxuICAgICAgICBpZiAocmVzdWx0LnN0YXJ0SW5kZXggPiAtMSAmJiBkZWNvcmF0b3JGdW5jdGlvbnNbcHJlZml4SV0pIHtcbiAgICAgICAgICBfY29kZSA9IHJlc3VsdC5jb2RlO1xuICAgICAgICAgIGRpZENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSBhd2FpdCBkZWNvcmF0b3JGdW5jdGlvbnNbcHJlZml4SV0oXG4gICAgICAgICAgICAgIHJlc3VsdC5zdGFydEluZGV4LFxuICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUHJvY2Vzc29yRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogXCJcIixcbiAgICAgICAgICAgICAgICBub3RlOiBleGNlcHRpb24ubm90ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiXCIsXG4gICAgICAgICAgICAgICAgbm90ZTogbmV3IFByb2Nlc3NvckVycm9yKFxuICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICByZXN1bHQuY29kZSxcbiAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICApLm5vdGUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGFydEluZGV4ID4gLTEgJiYgcmVzdWx0LnN0b3BJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5jb2RlID1cbiAgICAgICAgICAgICAgICBfY29kZS5zdWJzdHJpbmcoMCwgcmVzdWx0LnN0YXJ0SW5kZXgpICtcbiAgICAgICAgICAgICAgICByZXN1bHQuY29kZSArXG4gICAgICAgICAgICAgICAgX2NvZGUuc3Vic3RyaW5nKHJlc3VsdC5zdG9wSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9XG4gICAgICAgICAgICAgIF9jb2RlLnN1YnN0cmluZygwLCByZXN1bHQuc3RhcnRJbmRleCAtIDEpICtcbiAgICAgICAgICAgICAgX2NvZGUuc3Vic3RyaW5nKHJlc3VsdC5zdG9wSW5kZXgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc3VsdC5zdGFydEluZGV4ID0gcmVzdWx0LnN0b3BJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChzeW1ib2xJID4gLTEpO1xuXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5ERUNLWV9WRVJCT1NFKVxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihyZXN1bHQuY29kZSkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50czogcmVzdWx0LmNvZGUucmVwbGFjZSgvXHVEODNDXHVERjY0L2dtLCBcIkBcIiksXG4gICAgICAgIG5vdGU6IG51bGwsXG4gICAgICB9O1xuICAgIH0sXG4gICAgcHJlZml4ZXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uUmVzb2x2ZURlY29yYXRvcihhcmdzOiBPblJlc29sdmVBcmdzKSB7XG4gIHJldHVybiB7XG4gICAgcGF0aDogYXJncy5wYXRoLFxuICAgIG5hbWVzcGFjZTogXCJkZWNvcmF0b3Itc3R1YlwiLFxuICB9O1xufVxuXG5mdW5jdGlvbiBvblJlc29sdmVTdGF0aWNEZWNvcmF0b3JzKGFyZ3MpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBhcmdzLnBhdGgsXG4gICAgbmFtZXNwYWNlOiBcImRlY2t5XCIsXG4gIH07XG59XG5cbmNvbnN0IHN0YXRpY0RlY29yYXRvckNvZGUgPSBbcHJvcGVydHksIGtsYXNzXVxuICAubWFwKFxuICAgIChzdHViKSA9PlxuICAgICAgYC8qIEBfX1BVUkVfXyAqL1xcbmV4cG9ydCBmdW5jdGlvbiAke3N0dWJ9KC4uLmFyZ3Mpe3JldHVybiBhcmdzO31cXG5gXG4gIClcbiAgLmpvaW4oXCJcXG5cIik7XG5cbmZ1bmN0aW9uIG9uTG9hZFN0YXRpY0RlY29yYXRvcnMoYXJncykge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnRzOiBzdGF0aWNEZWNvcmF0b3JDb2RlLFxuICAgIGxvYWRlcjogXCJqc1wiLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luKGRlY29yYXRvcnM6IERlY29yYXRvcnNNYXApIHtcbiAgY29uc3QgeyBwcmVmaXhlcywgcHJvY2VzcyB9ID0gYnVpbGREZWNvcmF0b3JQcm9jZXNzb3IoZGVjb3JhdG9ycyk7XG4gIGNvbnN0IHByZWZpeGVzV2l0aEF0ID0gKHByZWZpeGVzIGFzIHN0cmluZ1tdKS5tYXAoKGEpID0+XG4gICAgYS5zdGFydHNXaXRoKFwiQFwiKSA/IGEgOiBcIkBcIiArIGFcbiAgKTtcblxuICBmdW5jdGlvbiBpc1BvdGVudGlhbE1hdGNoKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGlmICghY29udGVudC5pbmNsdWRlcyhcIkBcIikpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IHByZWZpeCBvZiBwcmVmaXhlc1dpdGhBdCkge1xuICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMocHJlZml4IGFzIHN0cmluZykpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTG9hZERlY29yYXRvclN0dWIoYXJncykge1xuICAgIGNvbnN0IHN0dWIgPSByZXF1aXJlKGFyZ3MucGF0aCkuZGVjb3JhdG9ycztcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50czogT2JqZWN0LmtleXMoc3R1YilcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAoc3R1YikgPT5cbiAgICAgICAgICAgIGAvKiBAX19QVVJFX18gKi9cXG5leHBvcnQgZnVuY3Rpb24gJHtzdHVifSguLi5hcmdzKXtyZXR1cm4gYXJnczt9XFxuYFxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9uTG9hZENvZGUoYXJnczogT25Mb2FkQXJncyk6IFByb21pc2U8T25Mb2FkUmVzdWx0PiB7XG4gICAgY29uc3QgbG9hZGVyID0gcGF0aC5leHRuYW1lKGFyZ3MucGF0aCkuc3Vic3RyaW5nKDEpIGFzIFwidHN4XCIgfCBcInRzXCI7XG5cbiAgICBsZXQgY29udGVudHM6IHN0cmluZyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGFyZ3MucGF0aCwgXCJ1dGY4XCIpO1xuICAgIGlmICghaXNQb3RlbnRpYWxNYXRjaChjb250ZW50cykpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50cyxcbiAgICAgICAgbG9hZGVyLFxuICAgICAgfTtcblxuICAgIGlmIChnbG9iYWxUaGlzLnByb2Nlc3MuZW52LkRFQ0tZX1RJTUlOR1MpXG4gICAgICBjb25zb2xlLnRpbWUoXG4gICAgICAgIFwiW2RlY2t5XSAuL1wiICsgcGF0aC5yZWxhdGl2ZShnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCksIGFyZ3MucGF0aClcbiAgICAgICk7XG4gICAgYXdhaXQgaW5pdExleGVycygpO1xuXG4gICAgY29uc3QgeyBub3RlLCBjb250ZW50czogX2NvbnRlbnRzIH0gPVxuICAgICAgKGF3YWl0IHByb2Nlc3MoY29udGVudHMsIGFyZ3MucGF0aCkpID8/IHt9O1xuXG4gICAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcy5lbnYuREVDS1lfVElNSU5HUylcbiAgICAgIGNvbnNvbGUudGltZUVuZChcbiAgICAgICAgXCJbZGVja3ldIC4vXCIgKyBwYXRoLnJlbGF0aXZlKGdsb2JhbFRoaXMucHJvY2Vzcy5jd2QoKSwgYXJncy5wYXRoKVxuICAgICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50czogX2NvbnRlbnRzLFxuICAgICAgZXJyb3JzOiBub3RlID8gW3sgbG9jYXRpb246IG5vdGUubG9jYXRpb24sIHRleHQ6IG5vdGUudGV4dCB9XSA6IHVuZGVmaW5lZCxcbiAgICAgIGxvYWRlcixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImRlY2t5XCIsXG4gICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgIGJ1aWxkLm9uUmVzb2x2ZShcbiAgICAgICAgeyBmaWx0ZXI6IC9cXC4oZGVjb3JhdG9yfGRlY3xkZWNreSlcXC4odHN8dHN4KSQvIH0sXG4gICAgICAgIG9uUmVzb2x2ZURlY29yYXRvclxuICAgICAgKTtcbiAgICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogL15kZWNreSQvIH0sIG9uUmVzb2x2ZVN0YXRpY0RlY29yYXRvcnMpO1xuICAgICAgYnVpbGQub25Mb2FkKFxuICAgICAgICB7IGZpbHRlcjogL15kZWNreSQvLCBuYW1lc3BhY2U6IFwiZGVja3lcIiB9LFxuICAgICAgICBvbkxvYWRTdGF0aWNEZWNvcmF0b3JzXG4gICAgICApO1xuICAgICAgYnVpbGQub25Mb2FkKFxuICAgICAgICB7IGZpbHRlcjogL1xcLihkZWNvcmF0b3J8ZGVjKVxcLih0cykkLywgbmFtZXNwYWNlOiBcImRlY29yYXRvci1zdHViXCIgfSxcbiAgICAgICAgb25Mb2FkRGVjb3JhdG9yU3R1YlxuICAgICAgKTtcbiAgICAgIGJ1aWxkLm9uTG9hZChcbiAgICAgICAgeyBmaWx0ZXI6IC9cXC4oZGVjb3JhdG9yfGRlYylcXC4odHN4KSQvLCBuYW1lc3BhY2U6IFwiZGVjb3JhdG9yLXN0dWJcIiB9LFxuICAgICAgICBvbkxvYWREZWNvcmF0b3JTdHViXG4gICAgICApO1xuICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvXFwuKHRzfHRzeCkkLyB9LCBvbkxvYWRDb2RlKTtcbiAgICB9LFxuICB9O1xufVxuXG50eXBlIE9wdGlvbmFsUHJvcGVydHlEZXNjcmlwdG9yPFQ+ID0gVCBleHRlbmRzIEV4Y2x1ZGU8XG4gIChudW1iZXIgfCBzdHJpbmcpW10sXG4gIHVuZGVmaW5lZFxuPlxuICA/ICguLi5hcmdzOiBUKSA9PiBQcm9wZXJ0eURlY29yYXRvclxuICA6IHZvaWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eTxUPihcbiAgY2FsbGJhY2s6IERlc2lnblRpbWVQcm9wZXJ0eURlY29yYXRvckZ1bmN0aW9uPFQ+XG4pOiBPcHRpb25hbFByb3BlcnR5RGVzY3JpcHRvcjxUPiB7XG4gIHJldHVybiB7XG4gICAgY2FsbGJhY2ssXG4gICAgdHlwZTogRGVjb3JhdG9yVHlwZS5wcm9wZXJ0eSxcbiAgfSBhcyBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eVZvaWQoXG4gIGNhbGxiYWNrOiBEZXNpZ25UaW1lUHJvcGVydHlEZWNvcmF0b3JGdW5jdGlvbjxuZXZlcj5cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIHtcbiAgICBjYWxsYmFjayxcbiAgICB0eXBlOiBEZWNvcmF0b3JUeXBlLnByb3BlcnR5LFxuICB9IGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGtsYXNzPFQgZXh0ZW5kcyBhbnlbXSA9IFtdPihcbiAgY2FsbGJhY2s6IERlc2lnblRpbWVDbGFzc0Z1bmN0aW9uPFQ+XG4pOiAoLi4uYXJnczogVCkgPT4gQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gPGFueSB8IHZvaWQ+e1xuICAgIGNhbGxiYWNrLFxuICAgIHR5cGU6IERlY29yYXRvclR5cGUua2xhc3MsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrbGFzc1ZvaWQoXG4gIGNhbGxiYWNrOiBEZXNpZ25UaW1lQ2xhc3NGdW5jdGlvbjxuZXZlcj5cbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuIDxhbnkgfCB2b2lkPntcbiAgICBjYWxsYmFjayxcbiAgICB0eXBlOiBEZWNvcmF0b3JUeXBlLmtsYXNzLFxuICB9O1xufVxuXG5leHBvcnQgeyBwcm9wZXJ0eSBhcyBwLCBwcm9wZXJ0eVZvaWQgYXMgcFYgfTtcbmV4cG9ydCB7IGtsYXNzIGFzIGMsIGtsYXNzVm9pZCBhcyBjViB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZChcbiAgZGVjb3JhdG9yc0dsb2I/OiBzdHJpbmcsXG4gIGFkZGl0aW9uYWxDb25maWc/OiBQYXJ0aWFsPEJ1aWxkT3B0aW9ucz5cbikge1xuICBjb25zdCBlbnRyeVBvaW50cyA9IGF3YWl0IGRlY29yYXRvcnMoZGVjb3JhdG9yc0dsb2IsIGFkZGl0aW9uYWxDb25maWcpO1xuICBjb25zdCBmaWxlcyA9IHt9O1xuICBmb3IgKGxldCBmaWxlIG9mIGVudHJ5UG9pbnRzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihmaWxlcywge1xuICAgICAgW2ZpbGVdOiByZXF1aXJlKHBhdGguam9pbihcbiAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgcGF0aC5kaXJuYW1lKGZpbGUpLFxuICAgICAgICBwYXRoLmJhc2VuYW1lKGZpbGUpLnJlcGxhY2UoXCIudHNcIiwgXCIuanNcIilcbiAgICAgICkpLmRlY29yYXRvcnMsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGx1Z2luKGZpbGVzKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gXCJlc2J1aWxkXCI7XG5pbXBvcnQgZ2xvYiBmcm9tIFwiZmFzdC1nbG9iXCI7XG5cbmV4cG9ydCBlbnVtIERlY29yYXRvclR5cGUge1xuICBwcm9wZXJ0eSA9IDAsXG4gIGtsYXNzID0gMSxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY29yYXRvcnMoXG4gIGRlY29yYXRvckdsb2IgPSBcIi4vKiovKi57ZGVjb3JhdG9yLnRzLGRlYy50cyxkZWNvcmF0b3JzLnRzLGRlY2t5LnRzLGRlY29yYXRvci50c3gsZGVjLnRzeCxkZWNvcmF0b3JzLnRzeCxkZWNreS50c3h9XCIsXG4gIGFkZGl0aW9uYWxDb25maWc6IFBhcnRpYWw8ZXNidWlsZC5CdWlsZE9wdGlvbnM+ID0ge31cbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZW50cnlQb2ludHMgPSAhYWRkaXRpb25hbENvbmZpZz8uZW50cnlQb2ludHM/Lmxlbmd0aFxuICAgID8gYXdhaXQgKGdsb2IgYXMgYW55KShkZWNvcmF0b3JHbG9iKVxuICAgIDogYWRkaXRpb25hbENvbmZpZy5lbnRyeVBvaW50cztcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICBtaW5pZnk6IGZhbHNlLFxuICAgIG1pbmlmeVN5bnRheDogdHJ1ZSxcbiAgICBmb3JtYXQ6IFwiY2pzXCIsXG4gICAgc291cmNlbWFwOiBcImJvdGhcIixcbiAgICBvdXRkaXI6IFwiLlwiLFxuICAgIG91dGJhc2U6IFwiLlwiLFxuICAgIC4uLmFkZGl0aW9uYWxDb25maWcsXG4gICAgcGxhdGZvcm06IFwibm9kZVwiLFxuICAgIGVudHJ5UG9pbnRzLFxuICAgIGJ1bmRsZTogZmFsc2UsXG4gIH0pO1xuXG4gIHJldHVybiBlbnRyeVBvaW50cztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQWEsV0FBUSxRQUFNO0FBQU0sV0FBUSxPQUFLO0FBQU8sTUFBTSxJQUFFLEFBQUksSUFBSSxXQUFXLElBQUksWUFBWSxDQUFDLElBQUksUUFBUSxPQUFoRDtBQUFtRCxpQkFBZSxJQUFFLElBQUU7QUFBSyxRQUFHLENBQUM7QUFBRSxhQUFPLEtBQUssS0FBSyxNQUFJLE1BQU07QUFBSSxRQUFNLElBQUUsR0FBRSxTQUFPLEdBQUUsSUFBRyxHQUFFLFlBQVksU0FBTyxFQUFFLGVBQWEsSUFBRSxJQUFFLEVBQUUsT0FBTyxPQUFPO0FBQVcsUUFBRSxLQUFHLEVBQUUsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFFO0FBQVEsUUFBTSxJQUFFLEVBQUUsR0FBRyxJQUFFO0FBQUcsUUFBSSxLQUFFLElBQUUsR0FBRyxJQUFFLElBQUksWUFBWSxFQUFFLE9BQU8sUUFBTyxHQUFFLEtBQUksQ0FBQyxFQUFFO0FBQVEsWUFBTSxPQUFPLE9BQU8sSUFBSSxNQUFNLGVBQWUsS0FBSyxHQUFFLE1BQU0sR0FBRSxFQUFFLEtBQUssTUFBTTtBQUFBLEdBQU0sVUFBVSxFQUFFLE1BQUksR0FBRSxZQUFZO0FBQUEsR0FBSyxFQUFFLE1BQUksT0FBTSxDQUFDLEtBQUksRUFBRTtBQUFNLFFBQU0sSUFBRSxJQUFHLElBQUU7QUFBRyxXQUFLLEVBQUU7QUFBTyxVQUFNLEtBQUUsRUFBRSxNQUFLLEtBQUUsRUFBRSxNQUFTO0FBQUUsUUFBRSxRQUFPLE1BQUUsRUFBRSxHQUFFLE1BQU0sS0FBRSxHQUFFLEtBQUUsTUFBSyxFQUFFLEtBQUssQ0FBQyxHQUFFLElBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxJQUFHLEVBQUUsTUFBSyxJQUFHLEVBQUUsTUFBSyxHQUFFLEVBQUU7QUFBQTtBQUFPLFdBQUssRUFBRTtBQUFNLFFBQUUsS0FBSyxHQUFFLE1BQU0sRUFBRSxNQUFLLEVBQUU7QUFBTyxlQUFXO0FBQUc7QUFBSSxlQUFPLElBQUUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFXLFdBQU0sQ0FBQyxHQUFFLEdBQUUsQ0FBQyxDQUFDLEVBQUU7QUFBQTtBQUFLLGFBQVcsSUFBRTtBQUFHLFFBQU0sS0FBRSxHQUFFLFFBQVcsS0FBRTtBQUFFLFdBQUssS0FBRTtBQUFJLFVBQU0sS0FBRSxHQUFFLFdBQVc7QUFBRyxTQUFFLFFBQU0sT0FBSSxPQUFJLElBQUUsT0FBSTtBQUFBO0FBQUE7QUFBRyxhQUFXLElBQUU7QUFBRyxRQUFNLEtBQUUsR0FBRSxRQUFXLEtBQUU7QUFBRSxXQUFLLEtBQUU7QUFBRyxTQUFFLE1BQUcsR0FBRSxXQUFXO0FBQUE7QUFBSyxNQUFJLEdBQVEsT0FBSyxZQUFZLFFBQVMsS0FBRSxnclNBQStxUyxBQUFhLE9BQU8sVUFBcEIsZUFBNEIsQUFBWSxPQUFPLFFBQW5CLGFBQXdCLFdBQVcsS0FBSyxLQUFLLElBQUcsUUFBRyxHQUFFLFdBQVcsTUFBSSxPQUFPLEtBQUssR0FBRSxZQUFZLEtBQUssWUFBWSxhQUFhLEtBQUssQ0FBQyxDQUFDLFNBQVE7QUFBTSxRQUFFO0FBQUE7QUFBSSxXQUFRLE9B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