@workflow/world-testing 4.1.0-beta.52 → 4.1.0-beta.53
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.
|
@@ -48162,18 +48162,44 @@ var require_ms = __commonJS({
|
|
|
48162
48162
|
}
|
|
48163
48163
|
});
|
|
48164
48164
|
|
|
48165
|
-
// workflows/
|
|
48166
|
-
var
|
|
48167
|
-
async function
|
|
48168
|
-
const
|
|
48169
|
-
|
|
48170
|
-
|
|
48171
|
-
|
|
48172
|
-
|
|
48165
|
+
// workflows/noop.ts
|
|
48166
|
+
var noop = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/noop.ts//noop");
|
|
48167
|
+
async function brokenWf() {
|
|
48168
|
+
const numbers = [];
|
|
48169
|
+
{
|
|
48170
|
+
const promises = [];
|
|
48171
|
+
for (let i = 0; i < 5; i++) {
|
|
48172
|
+
promises.push(noop(i));
|
|
48173
|
+
}
|
|
48174
|
+
console.log("await 5");
|
|
48175
|
+
numbers.push(...await Promise.all(promises));
|
|
48176
|
+
}
|
|
48177
|
+
{
|
|
48178
|
+
const promises = [];
|
|
48179
|
+
for (let i = 0; i < 15; i++) {
|
|
48180
|
+
promises.push(noop(100 + i));
|
|
48181
|
+
}
|
|
48182
|
+
console.log("await 15");
|
|
48183
|
+
numbers.push(...await Promise.all(promises));
|
|
48184
|
+
}
|
|
48185
|
+
console.log("done.");
|
|
48186
|
+
return {
|
|
48187
|
+
numbers
|
|
48188
|
+
};
|
|
48173
48189
|
}
|
|
48174
|
-
__name(
|
|
48175
|
-
|
|
48176
|
-
globalThis.__private_workflows.set("workflow//workflows/
|
|
48190
|
+
__name(brokenWf, "brokenWf");
|
|
48191
|
+
brokenWf.workflowId = "workflow//workflows/noop.ts//brokenWf";
|
|
48192
|
+
globalThis.__private_workflows.set("workflow//workflows/noop.ts//brokenWf", brokenWf);
|
|
48193
|
+
|
|
48194
|
+
// workflows/null-byte.ts
|
|
48195
|
+
var nullByteStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/null-byte.ts//nullByteStep");
|
|
48196
|
+
async function nullByteWorkflow() {
|
|
48197
|
+
const a = await nullByteStep();
|
|
48198
|
+
return a;
|
|
48199
|
+
}
|
|
48200
|
+
__name(nullByteWorkflow, "nullByteWorkflow");
|
|
48201
|
+
nullByteWorkflow.workflowId = "workflow//workflows/null-byte.ts//nullByteWorkflow";
|
|
48202
|
+
globalThis.__private_workflows.set("workflow//workflows/null-byte.ts//nullByteWorkflow", nullByteWorkflow);
|
|
48177
48203
|
|
|
48178
48204
|
// ../utils/dist/time.js
|
|
48179
48205
|
var import_ms = __toESM(require_ms(), 1);
|
|
@@ -48249,6 +48275,28 @@ __name(getWritable, "getWritable");
|
|
|
48249
48275
|
// ../workflow/dist/stdlib.js
|
|
48250
48276
|
var fetch = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflow/dist/stdlib.js//fetch");
|
|
48251
48277
|
|
|
48278
|
+
// workflows/retriable-and-fatal.ts
|
|
48279
|
+
async function retryableAndFatalErrorWorkflow() {
|
|
48280
|
+
const retryableResult = await stepThatThrowsRetryableError();
|
|
48281
|
+
let gotFatalError = false;
|
|
48282
|
+
try {
|
|
48283
|
+
await stepThatFails();
|
|
48284
|
+
} catch (error) {
|
|
48285
|
+
if (FatalError.is(error)) {
|
|
48286
|
+
gotFatalError = true;
|
|
48287
|
+
}
|
|
48288
|
+
}
|
|
48289
|
+
return {
|
|
48290
|
+
retryableResult,
|
|
48291
|
+
gotFatalError
|
|
48292
|
+
};
|
|
48293
|
+
}
|
|
48294
|
+
__name(retryableAndFatalErrorWorkflow, "retryableAndFatalErrorWorkflow");
|
|
48295
|
+
retryableAndFatalErrorWorkflow.workflowId = "workflow//workflows/retriable-and-fatal.ts//retryableAndFatalErrorWorkflow";
|
|
48296
|
+
globalThis.__private_workflows.set("workflow//workflows/retriable-and-fatal.ts//retryableAndFatalErrorWorkflow", retryableAndFatalErrorWorkflow);
|
|
48297
|
+
var stepThatThrowsRetryableError = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/retriable-and-fatal.ts//stepThatThrowsRetryableError");
|
|
48298
|
+
var stepThatFails = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/retriable-and-fatal.ts//stepThatFails");
|
|
48299
|
+
|
|
48252
48300
|
// ../../node_modules/.pnpm/zod@4.1.11/node_modules/zod/v4/core/core.js
|
|
48253
48301
|
var NEVER = Object.freeze({
|
|
48254
48302
|
status: "aborted"
|
|
@@ -51932,67 +51980,19 @@ collectWithHook.workflowId = "workflow//workflows/hooks.ts//collectWithHook";
|
|
|
51932
51980
|
globalThis.__private_workflows.set("workflow//workflows/hooks.ts//collectWithHook", collectWithHook);
|
|
51933
51981
|
var writeEvent = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/hooks.ts//writeEvent");
|
|
51934
51982
|
|
|
51935
|
-
// workflows/
|
|
51936
|
-
var
|
|
51937
|
-
async function
|
|
51938
|
-
const
|
|
51939
|
-
{
|
|
51940
|
-
|
|
51941
|
-
|
|
51942
|
-
|
|
51943
|
-
}
|
|
51944
|
-
console.log("await 5");
|
|
51945
|
-
numbers.push(...await Promise.all(promises));
|
|
51946
|
-
}
|
|
51947
|
-
{
|
|
51948
|
-
const promises = [];
|
|
51949
|
-
for (let i = 0; i < 15; i++) {
|
|
51950
|
-
promises.push(noop(100 + i));
|
|
51951
|
-
}
|
|
51952
|
-
console.log("await 15");
|
|
51953
|
-
numbers.push(...await Promise.all(promises));
|
|
51954
|
-
}
|
|
51955
|
-
console.log("done.");
|
|
51956
|
-
return {
|
|
51957
|
-
numbers
|
|
51958
|
-
};
|
|
51959
|
-
}
|
|
51960
|
-
__name(brokenWf, "brokenWf");
|
|
51961
|
-
brokenWf.workflowId = "workflow//workflows/noop.ts//brokenWf";
|
|
51962
|
-
globalThis.__private_workflows.set("workflow//workflows/noop.ts//brokenWf", brokenWf);
|
|
51963
|
-
|
|
51964
|
-
// workflows/null-byte.ts
|
|
51965
|
-
var nullByteStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/null-byte.ts//nullByteStep");
|
|
51966
|
-
async function nullByteWorkflow() {
|
|
51967
|
-
const a = await nullByteStep();
|
|
51968
|
-
return a;
|
|
51969
|
-
}
|
|
51970
|
-
__name(nullByteWorkflow, "nullByteWorkflow");
|
|
51971
|
-
nullByteWorkflow.workflowId = "workflow//workflows/null-byte.ts//nullByteWorkflow";
|
|
51972
|
-
globalThis.__private_workflows.set("workflow//workflows/null-byte.ts//nullByteWorkflow", nullByteWorkflow);
|
|
51973
|
-
|
|
51974
|
-
// workflows/retriable-and-fatal.ts
|
|
51975
|
-
async function retryableAndFatalErrorWorkflow() {
|
|
51976
|
-
const retryableResult = await stepThatThrowsRetryableError();
|
|
51977
|
-
let gotFatalError = false;
|
|
51978
|
-
try {
|
|
51979
|
-
await stepThatFails();
|
|
51980
|
-
} catch (error) {
|
|
51981
|
-
if (FatalError.is(error)) {
|
|
51982
|
-
gotFatalError = true;
|
|
51983
|
-
}
|
|
51984
|
-
}
|
|
51985
|
-
return {
|
|
51986
|
-
retryableResult,
|
|
51987
|
-
gotFatalError
|
|
51988
|
-
};
|
|
51983
|
+
// workflows/addition.ts
|
|
51984
|
+
var add = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/addition.ts//add");
|
|
51985
|
+
async function addition(num, num2) {
|
|
51986
|
+
const result = await add(num, num2);
|
|
51987
|
+
console.log({
|
|
51988
|
+
result
|
|
51989
|
+
});
|
|
51990
|
+
return result;
|
|
51989
51991
|
}
|
|
51990
|
-
__name(
|
|
51991
|
-
|
|
51992
|
-
globalThis.__private_workflows.set("workflow//workflows/
|
|
51993
|
-
var stepThatThrowsRetryableError = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/retriable-and-fatal.ts//stepThatThrowsRetryableError");
|
|
51994
|
-
var stepThatFails = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflows/retriable-and-fatal.ts//stepThatFails");
|
|
51995
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJ3b3JrZmxvd3MvYWRkaXRpb24udHMiLCAiLi4vdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vZXJyb3JzL3NyYy9pbmRleC50cyIsICIuLi9jb3JlL3NyYy9zeW1ib2xzLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2NyZWF0ZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L2RlZmluZS1ob29rLnRzIiwgIi4uL2NvcmUvc3JjL3dvcmtmbG93L3dyaXRhYmxlLXN0cmVhbS50cyIsICIuLi93b3JrZmxvdy9zcmMvc3RkbGliLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS91dGlsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9lcnJvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3BhcnNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9yZWdleGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9jaGVja3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2RvYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvdmVyc2lvbnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3NjaGVtYXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3JlZ2lzdHJpZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL2FwaS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvaXNvLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9lcnJvcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jbGFzc2ljL3BhcnNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9zY2hlbWFzLmpzIiwgIndvcmtmbG93cy9ob29rcy50cyIsICJ3b3JrZmxvd3Mvbm9vcC50cyIsICJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzIiwgIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEhlbHBlcnMuXG4gKi8gdmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICsgSlNPTi5zdHJpbmdpZnkodmFsKSk7XG59O1xuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICAgIH1cbiAgICByZXR1cm4gbXMgKyAnbXMnO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBtcyArICcgbXMnO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqLyBmdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9hZGRpdGlvbi50c1wiOntcImFkZGl0aW9uXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkaXRpb25cIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL2FkZGl0aW9uLnRzXCI6e1wiYWRkXCI6e1wic3RlcElkXCI6XCJzdGVwLy93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZFwifX19fSovO1xudmFyIGFkZCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZGl0aW9uKG51bSwgbnVtMikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkZChudW0sIG51bTIpO1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgcmVzdWx0XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmFkZGl0aW9uLndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZGl0aW9uXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkaXRpb25cIiwgYWRkaXRpb24pO1xuIiwgImltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5pbXBvcnQgbXMgZnJvbSAnbXMnO1xuXG4vKipcbiAqIFBhcnNlcyBhIGR1cmF0aW9uIHBhcmFtZXRlciAoc3RyaW5nLCBudW1iZXIsIG9yIERhdGUpIGFuZCByZXR1cm5zIGEgRGF0ZSBvYmplY3RcbiAqIHJlcHJlc2VudGluZyB3aGVuIHRoZSBkdXJhdGlvbiBzaG91bGQgZWxhcHNlLlxuICpcbiAqIC0gRm9yIHN0cmluZ3M6IFBhcnNlcyBkdXJhdGlvbiBzdHJpbmdzIGxpa2UgXCIxc1wiLCBcIjVtXCIsIFwiMWhcIiwgZXRjLiB1c2luZyB0aGUgYG1zYCBsaWJyYXJ5XG4gKiAtIEZvciBudW1iZXJzOiBUcmVhdHMgYXMgbWlsbGlzZWNvbmRzIGZyb20gbm93XG4gKiAtIEZvciBEYXRlIG9iamVjdHM6IFJldHVybnMgdGhlIGRhdGUgZGlyZWN0bHkgKGhhbmRsZXMgYm90aCBEYXRlIGluc3RhbmNlcyBhbmQgZGF0ZS1saWtlIG9iamVjdHMgZnJvbSBkZXNlcmlhbGl6YXRpb24pXG4gKlxuICogQHBhcmFtIHBhcmFtIC0gVGhlIGR1cmF0aW9uIHBhcmFtZXRlciAoU3RyaW5nVmFsdWUsIERhdGUsIG9yIG51bWJlciBvZiBtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyBBIERhdGUgb2JqZWN0IHJlcHJlc2VudGluZyB3aGVuIHRoZSBkdXJhdGlvbiBzaG91bGQgZWxhcHNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkIG9yIGNhbm5vdCBiZSBwYXJzZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlcik6IERhdGUge1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBtcyhwYXJhbSk7XG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbk1zICE9PSAnbnVtYmVyJyB8fCBkdXJhdGlvbk1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBkdXJhdGlvbjogXCIke3BhcmFtfVwiLiBFeHBlY3RlZCBhIHZhbGlkIGR1cmF0aW9uIHN0cmluZyBsaWtlIFwiMXNcIiwgXCIxbVwiLCBcIjFoXCIsIGV0Yy5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIGR1cmF0aW9uTXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAocGFyYW0gPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGR1cmF0aW9uOiAke3BhcmFtfS4gRXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgZmluaXRlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgKyBwYXJhbSk7XG4gIH0gZWxzZSBpZiAoXG4gICAgcGFyYW0gaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgKHBhcmFtICYmXG4gICAgICB0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgKHBhcmFtIGFzIGFueSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJylcbiAgKSB7XG4gICAgLy8gSGFuZGxlIGJvdGggRGF0ZSBpbnN0YW5jZXMgYW5kIGRhdGUtbGlrZSBvYmplY3RzIChmcm9tIGRlc2VyaWFsaXphdGlvbilcbiAgICByZXR1cm4gcGFyYW0gaW5zdGFuY2VvZiBEYXRlID8gcGFyYW0gOiBuZXcgRGF0ZSgocGFyYW0gYXMgYW55KS5nZXRUaW1lKCkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGR1cmF0aW9uIHBhcmFtZXRlci4gRXhwZWN0ZWQgYSBkdXJhdGlvbiBzdHJpbmcsIG51bWJlciAobWlsbGlzZWNvbmRzKSwgb3IgRGF0ZSBvYmplY3QuYFxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwYXJzZUR1cmF0aW9uVG9EYXRlIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vdXNld29ya2Zsb3cuZGV2L2Vycic7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGFuIEVycm9yIHdpdGhvdXQgcmVseWluZyBvbiBOb2RlLmpzIHV0aWxpdGllcy5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciBlcnJvciBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gVk0gY29udGV4dHMgd2hlcmVcbiAqIE5vZGUuanMgaW1wb3J0cyBhcmUgbm90IGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNFcnJvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHsgbmFtZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgJ25hbWUnIGluIHZhbHVlICYmXG4gICAgJ21lc3NhZ2UnIGluIHZhbHVlXG4gICk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBBbGwgdGhlIHNsdWdzIG9mIHRoZSBlcnJvcnMgdXNlZCBmb3IgZG9jdW1lbnRhdGlvbiBsaW5rcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVSUk9SX1NMVUdTID0ge1xuICBOT0RFX0pTX01PRFVMRV9JTl9XT1JLRkxPVzogJ25vZGUtanMtbW9kdWxlLWluLXdvcmtmbG93JyxcbiAgU1RBUlRfSU5WQUxJRF9XT1JLRkxPV19GVU5DVElPTjogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nLFxuICBTRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyxcbiAgV0VCSE9PS19JTlZBTElEX1JFU1BPTkRfV0lUSF9WQUxVRTogJ3dlYmhvb2staW52YWxpZC1yZXNwb25kLXdpdGgtdmFsdWUnLFxuICBXRUJIT09LX1JFU1BPTlNFX05PVF9TRU5UOiAnd2ViaG9vay1yZXNwb25zZS1ub3Qtc2VudCcsXG4gIEZFVENIX0lOX1dPUktGTE9XX0ZVTkNUSU9OOiAnZmV0Y2gtaW4td29ya2Zsb3cnLFxuICBUSU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVzogJ3RpbWVvdXQtaW4td29ya2Zsb3cnLFxuICBIT09LX0NPTkZMSUNUOiAnaG9vay1jb25mbGljdCcsXG59IGFzIGNvbnN0O1xuXG50eXBlIEVycm9yU2x1ZyA9ICh0eXBlb2YgRVJST1JfU0xVR1MpW2tleW9mIHR5cGVvZiBFUlJPUl9TTFVHU107XG5cbmludGVyZmFjZSBXb3JrZmxvd0Vycm9yT3B0aW9ucyBleHRlbmRzIEVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2x1ZyBvZiB0aGUgZXJyb3IuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbGluayB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbi5cbiAgICovXG4gIHNsdWc/OiBFcnJvclNsdWc7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBXb3JrZmxvdy1yZWxhdGVkIGVycm9ycy5cbiAqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biBieSB0aGUgV29ya2Zsb3cgRGV2S2l0IHdoZW4gaW50ZXJuYWwgb3BlcmF0aW9ucyBmYWlsLlxuICogWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB3aXRoIGBpbnN0YW5jZW9mYCB0byBjYXRjaCBhbnkgV29ya2Zsb3cgRGV2S2l0IGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgYXdhaXQgZ2V0UnVuKHJ1bklkKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdXb3JrZmxvdyBEZXZLaXQgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFdvcmtmbG93RXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgbXNnRG9jcyA9IG9wdGlvbnM/LnNsdWdcbiAgICAgID8gYCR7bWVzc2FnZX1cXG5cXG5MZWFybiBtb3JlOiAke0JBU0VfVVJMfS8ke29wdGlvbnMuc2x1Z31gXG4gICAgICA6IG1lc3NhZ2U7XG4gICAgc3VwZXIobXNnRG9jcywgeyBjYXVzZTogb3B0aW9ucz8uY2F1c2UgfSk7XG4gICAgdGhpcy5jYXVzZSA9IG9wdGlvbnM/LmNhdXNlO1xuXG4gICAgaWYgKG9wdGlvbnM/LmNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBgJHt0aGlzLnN0YWNrfVxcbkNhdXNlZCBieTogJHtvcHRpb25zLmNhdXNlLnN0YWNrfWA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd0Vycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgV29ya2Zsb3cgQVBJIHJlcXVlc3QgZmFpbHMuXG4gKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBIVFRQIHJlcXVlc3RzIHRvIHRoZSBXb3JrZmxvdyBiYWNrZW5kIGZhaWwsXG4gKiB0eXBpY2FsbHkgZHVlIHRvIG5ldHdvcmsgaXNzdWVzLCBpbnZhbGlkIHJlcXVlc3RzLCBvciBzZXJ2ZXIgZXJyb3JzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgYXdhaXQgc3RhcnRXb3JrZmxvdygnbXlXb3JrZmxvdycsIGlucHV0KTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93QVBJRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKGBBUEkgZXJyb3IgKCR7ZXJyb3Iuc3RhdHVzfSk6YCwgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dBUElFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBzdGF0dXM/OiBudW1iZXI7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgc3RhdHVzPzogbnVtYmVyOyB1cmw/OiBzdHJpbmc7IGNvZGU/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9XG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHtcbiAgICAgIGNhdXNlOiBvcHRpb25zPy5jYXVzZSxcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dBUElFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRpb25zPy5zdGF0dXM7XG4gICAgdGhpcy5jb2RlID0gb3B0aW9ucz8uY29kZTtcbiAgICB0aGlzLnVybCA9IG9wdGlvbnM/LnVybDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93QVBJRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dBUElFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHdvcmtmbG93IHJ1biBmYWlscyBkdXJpbmcgZXhlY3V0aW9uLlxuICpcbiAqIFRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoYXQgdGhlIHdvcmtmbG93IGVuY291bnRlcmVkIGEgZmF0YWwgZXJyb3JcbiAqIGFuZCBjYW5ub3QgY29udGludWUuIFRoZSBgY2F1c2VgIHByb3BlcnR5IGNvbnRhaW5zIHRoZSB1bmRlcmx5aW5nXG4gKiBlcnJvciB3aXRoIGl0cyBtZXNzYWdlLCBzdGFjayB0cmFjZSwgYW5kIG9wdGlvbmFsIGVycm9yIGNvZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogY29uc3QgcnVuID0gYXdhaXQgZ2V0UnVuKHJ1bklkKTtcbiAqIGlmIChydW4uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICogICAvLyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIHdpbGwgYmUgdGhyb3duXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93UnVuRmFpbGVkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgZGVjbGFyZSBjYXVzZTogRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBlcnJvcjogU3RydWN0dXJlZEVycm9yKSB7XG4gICAgLy8gQ3JlYXRlIGEgcHJvcGVyIEVycm9yIGluc3RhbmNlIGZyb20gdGhlIFN0cnVjdHVyZWRFcnJvciB0byBzZXQgYXMgY2F1c2VcbiAgICAvLyBOT1RFOiBjdXN0b20gZXJyb3IgdHlwZXMgZG8gbm90IGdldCBzZXJpYWxpemVkL2Rlc2VyaWFsaXplZC4gRXZlcnl0aGluZyBpcyBhbiBFcnJvclxuICAgIGNvbnN0IGNhdXNlRXJyb3IgPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgICBjYXVzZUVycm9yLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgfVxuICAgIGlmIChlcnJvci5jb2RlKSB7XG4gICAgICAoY2F1c2VFcnJvciBhcyBhbnkpLmNvZGUgPSBlcnJvci5jb2RlO1xuICAgIH1cblxuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWAsIHtcbiAgICAgIGNhdXNlOiBjYXVzZUVycm9yLFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bkZhaWxlZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93UnVuRmFpbGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBnZXQgcmVzdWx0cyBmcm9tIGFuIGluY29tcGxldGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIFRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IHRyeSB0byBhY2Nlc3MgdGhlIHJlc3VsdCBvZiBhIHdvcmtmbG93XG4gKiB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgb3IgaGFzbid0IGNvbXBsZXRlZCB5ZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIHN0YXR1czogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vdCBjb21wbGV0ZWRgLCB7fSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgV29ya2Zsb3cgcnVudGltZSBlbmNvdW50ZXJzIGFuIGludGVybmFsIGVycm9yLlxuICpcbiAqIFRoaXMgZXJyb3IgaW5kaWNhdGVzIGFuIGlzc3VlIHdpdGggd29ya2Zsb3cgZXhlY3V0aW9uLCBzdWNoIGFzXG4gKiBzZXJpYWxpemF0aW9uIGZhaWx1cmVzLCBzdGFydGluZyBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLCBvclxuICogb3RoZXIgcnVudGltZSBwcm9ibGVtcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93UnVudGltZUVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFdvcmtmbG93RXJyb3JPcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW50aW1lRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW50aW1lRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW50aW1lRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgcnVuSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgbm90IGZvdW5kYCwge30pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGNhbmNlbGxlZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bkNhbmNlbGxlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gb3BlcmF0ZSBvbiBhIHdvcmtmbG93IHJ1biB0aGF0IHJlcXVpcmVzIGEgbmV3ZXIgV29ybGQgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIGEgcnVuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXdlciBzcGVjIHZlcnNpb24gdGhhbiB0aGVcbiAqIGN1cnJlbnQgV29ybGQgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuIFVzZXJzIHNob3VsZCB1cGdyYWRlIHRoZWlyIEB3b3JrZmxvdyBwYWNrYWdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bk5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJlYWRvbmx5IHJ1blNwZWNWZXJzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHdvcmxkU3BlY1ZlcnNpb246IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihydW5TcGVjVmVyc2lvbjogbnVtYmVyLCB3b3JsZFNwZWNWZXJzaW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcihcbiAgICAgIGBSdW4gcmVxdWlyZXMgc3BlYyB2ZXJzaW9uICR7cnVuU3BlY1ZlcnNpb259LCBidXQgd29ybGQgc3VwcG9ydHMgdmVyc2lvbiAke3dvcmxkU3BlY1ZlcnNpb259LiBgICtcbiAgICAgICAgYFBsZWFzZSB1cGdyYWRlICd3b3JrZmxvdycgcGFja2FnZS5gXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnUnVuTm90U3VwcG9ydGVkRXJyb3InO1xuICAgIHRoaXMucnVuU3BlY1ZlcnNpb24gPSBydW5TcGVjVmVyc2lvbjtcbiAgICB0aGlzLndvcmxkU3BlY1ZlcnNpb24gPSB3b3JsZFNwZWNWZXJzaW9uO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuTm90U3VwcG9ydGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnUnVuTm90U3VwcG9ydGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQSBmYXRhbCBlcnJvciBpcyBhbiBlcnJvciB0aGF0IGNhbm5vdCBiZSByZXRyaWVkLlxuICogSXQgd2lsbCBjYXVzZSB0aGUgc3RlcCB0byBmYWlsIGFuZCB0aGUgZXJyb3Igd2lsbFxuICogYmUgYnViYmxlZCB1cCB0byB0aGUgd29ya2Zsb3cgbG9naWMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGYXRhbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBmYXRhbCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0ZhdGFsRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRmF0YWxFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdGYXRhbEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5YWJsZUVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXRyeWluZyB0aGUgc3RlcC5cbiAgICogQ2FuIGFsc28gYmUgYSBkdXJhdGlvbiBzdHJpbmcgKGUuZy4sIFwiNXNcIiwgXCIybVwiKSBvciBhIERhdGUgb2JqZWN0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBzdGVwIHdpbGwgYmUgcmV0cmllZCBhZnRlciAxIHNlY29uZCAoMTAwMCBtaWxsaXNlY29uZHMpLlxuICAgKi9cbiAgcmV0cnlBZnRlcj86IG51bWJlciB8IFN0cmluZ1ZhbHVlIHwgRGF0ZTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0aGF0IGNhbiBoYXBwZW4gZHVyaW5nIGEgc3RlcCBleGVjdXRpb24sIGFsbG93aW5nXG4gKiBmb3IgY29uZmlndXJhdGlvbiBvZiB0aGUgcmV0cnkgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXRyeWFibGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBEYXRlIHdoZW4gdGhlIHN0ZXAgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAqL1xuICByZXRyeUFmdGVyOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9uczogUmV0cnlhYmxlRXJyb3JPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUmV0cnlhYmxlRXJyb3InO1xuXG4gICAgaWYgKG9wdGlvbnMucmV0cnlBZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJldHJ5QWZ0ZXIgPSBwYXJzZUR1cmF0aW9uVG9EYXRlKG9wdGlvbnMucmV0cnlBZnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gMSBzZWNvbmQgKDEwMDAgbWlsbGlzZWNvbmRzKVxuICAgICAgdGhpcy5yZXRyeUFmdGVyID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJldHJ5YWJsZUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1JldHJ5YWJsZUVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVkVSQ0VMXzQwM19FUlJPUl9NRVNTQUdFID1cbiAgJ1lvdXIgY3VycmVudCB2ZXJjZWwgYWNjb3VudCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIHJlc291cmNlLiBVc2UgYHZlcmNlbCBsb2dpbmAgb3IgYHZlcmNlbCBzd2l0Y2hgIHRvIGVuc3VyZSB5b3UgYXJlIGxpbmtlZCB0byB0aGUgcmlnaHQgYWNjb3VudC4gWW91IG1pZ2h0IG5lZWQgdG8gcnVuIGB2ZXJjZWwgZW52IHB1bGxgIHRvIHVzZSB0aGUgbGF0ZXN0IGVudmlyb25tZW50IHZhcmlhYmxlcy4nO1xuIiwgImV4cG9ydCBjb25zdCBXT1JLRkxPV19VU0VfU1RFUCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1VTRV9TVEVQJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ1JFQVRFX0hPT0sgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19DUkVBVEVfSE9PSycpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX1NMRUVQID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU0xFRVAnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19DT05URVhUID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQ09OVEVYVCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0dFVF9TVFJFQU1fSUQgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19HRVRfU1RSRUFNX0lEJyk7XG5leHBvcnQgY29uc3QgU1RBQkxFX1VMSUQgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVEFCTEVfVUxJRCcpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9OQU1FX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9OQU1FJyk7XG5leHBvcnQgY29uc3QgU1RSRUFNX1RZUEVfU1lNQk9MID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX1RZUEUnKTtcbmV4cG9ydCBjb25zdCBCT0RZX0lOSVRfU1lNQk9MID0gU3ltYm9sLmZvcignQk9EWV9JTklUJyk7XG5leHBvcnQgY29uc3QgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSA9IFN5bWJvbC5mb3IoXG4gICdXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFJ1xuKTtcblxuLyoqXG4gKiBTeW1ib2wgdXNlZCB0byBzdG9yZSB0aGUgY2xhc3MgcmVnaXN0cnkgb24gZ2xvYmFsVGhpcyBpbiB3b3JrZmxvdyBtb2RlLlxuICogVGhpcyBhbGxvd3MgdGhlIGRlc2VyaWFsaXplciB0byBmaW5kIGNsYXNzZXMgYnkgY2xhc3NJZCBpbiB0aGUgVk0gY29udGV4dC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NMQVNTX1JFR0lTVFJZID0gU3ltYm9sLmZvcignd29ya2Zsb3ctY2xhc3MtcmVnaXN0cnknKTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEhvb2ssXG4gIEhvb2tPcHRpb25zLFxuICBSZXF1ZXN0V2l0aFJlc3BvbnNlLFxuICBXZWJob29rLFxuICBXZWJob29rT3B0aW9ucyxcbn0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfQ1JFQVRFX0hPT0sgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb29rPFQgPSBhbnk+KG9wdGlvbnM/OiBIb29rT3B0aW9ucyk6IEhvb2s8VD4ge1xuICAvLyBJbnNpZGUgdGhlIHdvcmtmbG93IFZNLCB0aGUgaG9vayBmdW5jdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGdsb2JhbFRoaXMgb2JqZWN0IGJlaGluZCBhIHN5bWJvbFxuICBjb25zdCBjcmVhdGVIb29rRm4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgIFdPUktGTE9XX0NSRUFURV9IT09LXG4gIF0gYXMgdHlwZW9mIGNyZWF0ZUhvb2s8VD47XG4gIGlmICghY3JlYXRlSG9va0ZuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2BjcmVhdGVIb29rKClgIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbidcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVIb29rRm4ob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKFxuICBvcHRpb25zOiBXZWJob29rT3B0aW9ucyAmIHsgcmVzcG9uZFdpdGg6ICdtYW51YWwnIH1cbik6IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhvcHRpb25zPzogV2ViaG9va09wdGlvbnMpOiBXZWJob29rPFJlcXVlc3Q+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2soXG4gIG9wdGlvbnM/OiBXZWJob29rT3B0aW9uc1xuKTogV2ViaG9vazxSZXF1ZXN0PiB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT4ge1xuICBjb25zdCB7IHJlc3BvbmRXaXRoLCAuLi5yZXN0IH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgbWV0YWRhdGE6IFBpY2s8V2ViaG9va09wdGlvbnMsICdyZXNwb25kV2l0aCc+IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHJlc3BvbmRXaXRoICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1ldGFkYXRhID0geyByZXNwb25kV2l0aCB9O1xuICB9XG5cbiAgY29uc3QgaG9vayA9IGNyZWF0ZUhvb2soeyAuLi5yZXN0LCBtZXRhZGF0YSB9KSBhc1xuICAgIHwgV2ViaG9vazxSZXF1ZXN0PlxuICAgIHwgV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPjtcblxuICBjb25zdCB7IHVybCB9ID0gZ2V0V29ya2Zsb3dNZXRhZGF0YSgpO1xuICBob29rLnVybCA9IGAke3VybH0vLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay8ke2VuY29kZVVSSUNvbXBvbmVudChob29rLnRva2VuKX1gO1xuXG4gIHJldHVybiBob29rO1xufVxuIiwgImltcG9ydCB0eXBlIHsgSG9vayBhcyBIb29rRW50aXR5IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVIb29rIH0gZnJvbSAnLi9jcmVhdGUtaG9vay5qcyc7XG5cbi8qKlxuICogTk9URTogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGRlZmluZUhvb2soKWAgdGhhdCBpcyB1c2VkIGluIHdvcmtmbG93IGNvbnRleHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lSG9vazxUSW5wdXQsIFRPdXRwdXQgPSBUSW5wdXQ+KCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZShvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFRPdXRwdXQ+IHtcbiAgICAgIHJldHVybiBjcmVhdGVIb29rPFRPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICByZXN1bWUoX3Rva2VuOiBzdHJpbmcsIF9wYXlsb2FkOiBUSW5wdXQpOiBQcm9taXNlPEhvb2tFbnRpdHkgfCBudWxsPiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgZGVmaW5lSG9vaygpLnJlc3VtZSgpYCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBleHRlcm5hbCBjb250ZXh0cyAoZS5nLiBBUEkgcm91dGVzKS4nXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyB9IGZyb20gJy4uL3N0ZXAvd3JpdGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IFNUUkVBTV9OQU1FX1NZTUJPTCwgV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V3JpdGFibGU8VyA9IGFueT4oXG4gIG9wdGlvbnM6IFdvcmtmbG93V3JpdGFibGVTdHJlYW1PcHRpb25zID0ge31cbik6IFdyaXRhYmxlU3RyZWFtPFc+IHtcbiAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IG5hbWUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1dPUktGTE9XX0dFVF9TVFJFQU1fSURdKG5hbWVzcGFjZSk7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgW1NUUkVBTV9OQU1FX1NZTUJPTF06IHtcbiAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0sXG4gIH0pO1xufVxuIiwgIi8qKlxuICogVGhpcyBpcyB0aGUgXCJzdGFuZGFyZCBsaWJyYXJ5XCIgb2Ygc3RlcHMgdGhhdCB3ZSBtYWtlIGF2YWlsYWJsZSB0byBhbGwgd29ya2Zsb3cgdXNlcnMuXG4gKiBUaGUgY2FuIGJlIGltcG9ydGVkIGxpa2Ugc286IGBpbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3dvcmtmbG93J2AuIGFuZCB1c2VkIGluIHdvcmtmbG93LlxuICogVGhlIG5lZWQgdG8gYmUgZXhwb3J0ZWQgZGlyZWN0bHkgaW4gdGhpcyBwYWNrYWdlIGFuZCBjYW5ub3QgbGl2ZSBpbiBgY29yZWAgdG8gcHJldmVudFxuICogY2lyY3VsYXIgZGVwZW5kZW5jaWVzIHBvc3QtY29tcGlsYXRpb24uXG4gKi9cblxuLyoqXG4gKiBBIGhvaXN0ZWQgYGZldGNoKClgIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgYXMgYSBcInN0ZXBcIiBmdW5jdGlvbixcbiAqIGZvciB1c2Ugd2l0aGluIHdvcmtmbG93IGZ1bmN0aW9ucy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUElcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g+KSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiBnbG9iYWxUaGlzLmZldGNoKC4uLmFyZ3MpO1xufVxuIiwgIi8qKiBBIHNwZWNpYWwgY29uc3RhbnQgd2l0aCB0eXBlIGBuZXZlcmAgKi8gZXhwb3J0IGNvbnN0IE5FVkVSID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc3RhdHVzOiBcImFib3J0ZWRcIlxufSk7XG5leHBvcnQgLypAX19OT19TSURFX0VGRkVDVFNfXyovIGZ1bmN0aW9uICRjb25zdHJ1Y3RvcihuYW1lLCBpbml0aWFsaXplciwgcGFyYW1zKSB7XG4gICAgZnVuY3Rpb24gaW5pdChpbnN0LCBkZWYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJfem9kXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0Ll96b2QgPz8ge30sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS50cmFpdHMgPz8gKF9hLnRyYWl0cyA9IG5ldyBTZXQoKSk7XG4gICAgICAgIGluc3QuX3pvZC50cmFpdHMuYWRkKG5hbWUpO1xuICAgICAgICBpbml0aWFsaXplcihpbnN0LCBkZWYpO1xuICAgICAgICAvLyBzdXBwb3J0IHByb3RvdHlwZSBtb2RpZmljYXRpb25zXG4gICAgICAgIGZvcihjb25zdCBrIGluIF8ucHJvdG90eXBlKXtcbiAgICAgICAgICAgIGlmICghKGsgaW4gaW5zdCkpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBrLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IF8ucHJvdG90eXBlW2tdLmJpbmQoaW5zdClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGluc3QuX3pvZC5jb25zdHIgPSBfO1xuICAgICAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIH1cbiAgICAvLyBkb2Vzbid0IHdvcmsgaWYgUGFyZW50IGhhcyBhIGNvbnN0cnVjdG9yIHdpdGggYXJndW1lbnRzXG4gICAgY29uc3QgUGFyZW50ID0gcGFyYW1zPy5QYXJlbnQgPz8gT2JqZWN0O1xuICAgIGNsYXNzIERlZmluaXRpb24gZXh0ZW5kcyBQYXJlbnQge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVmaW5pdGlvbiwgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBfKGRlZikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGluc3QgPSBwYXJhbXM/LlBhcmVudCA/IG5ldyBEZWZpbml0aW9uKCkgOiB0aGlzO1xuICAgICAgICBpbml0KGluc3QsIGRlZik7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZCkuZGVmZXJyZWQgPz8gKF9hLmRlZmVycmVkID0gW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGluc3QuX3pvZC5kZWZlcnJlZCl7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJpbml0XCIsIHtcbiAgICAgICAgdmFsdWU6IGluaXRcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgICAgIHZhbHVlOiAoaW5zdCk9PntcbiAgICAgICAgICAgIGlmIChwYXJhbXM/LlBhcmVudCAmJiBpbnN0IGluc3RhbmNlb2YgcGFyYW1zLlBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaW5zdD8uX3pvZD8udHJhaXRzPy5oYXMobmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbn1cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFVUSUxJVElFUyAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGNvbnN0ICRicmFuZCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmV4cG9ydCBjbGFzcyAkWm9kQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcihgRW5jb3VudGVyZWQgUHJvbWlzZSBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2UuIFVzZSAucGFyc2VBc3luYygpIGluc3RlYWQuYCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzICRab2RFbmNvZGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKXtcbiAgICAgICAgc3VwZXIoYEVuY291bnRlcmVkIHVuaWRpcmVjdGlvbmFsIHRyYW5zZm9ybSBkdXJpbmcgZW5jb2RlOiAke25hbWV9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRW5jb2RlRXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZ2xvYmFsQ29uZmlnID0ge307XG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKG5ld0NvbmZpZykge1xuICAgIGlmIChuZXdDb25maWcpIE9iamVjdC5hc3NpZ24oZ2xvYmFsQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iLCAiLy8gZnVuY3Rpb25zXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsKSB7XG4gICAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RFcXVhbCh2YWwpIHtcbiAgICByZXR1cm4gdmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHt9XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoXykge31cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKGVudHJpZXMpIHtcbiAgICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnRyaWVzKS5maWx0ZXIoKHYpPT50eXBlb2YgdiA9PT0gXCJudW1iZXJcIik7XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmVudHJpZXMoZW50cmllcykuZmlsdGVyKChbaywgX10pPT5udW1lcmljVmFsdWVzLmluZGV4T2YoK2spID09PSAtMSkubWFwKChbXywgdl0pPT52KTtcbiAgICByZXR1cm4gdmFsdWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5WYWx1ZXMoYXJyYXksIHNlcGFyYXRvciA9IFwifFwiKSB7XG4gICAgcmV0dXJuIGFycmF5Lm1hcCgodmFsKT0+c3RyaW5naWZ5UHJpbWl0aXZlKHZhbCkpLmpvaW4oc2VwYXJhdG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBqc29uU3RyaW5naWZ5UmVwbGFjZXIoXywgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkKGdldHRlcikge1xuICAgIGNvbnN0IHNldCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCB2YWx1ZSAoKSB7XG4gICAgICAgICAgICBpZiAoIXNldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyKCk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwidmFsdWVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhY2hlZCB2YWx1ZSBhbHJlYWR5IHNldFwiKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbGlzaChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuUmVnZXgoc291cmNlKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzb3VyY2Uuc3RhcnRzV2l0aChcIl5cIikgPyAxIDogMDtcbiAgICBjb25zdCBlbmQgPSBzb3VyY2UuZW5kc1dpdGgoXCIkXCIpID8gc291cmNlLmxlbmd0aCAtIDEgOiBzb3VyY2UubGVuZ3RoO1xuICAgIHJldHVybiBzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkge1xuICAgIGNvbnN0IHZhbERlY0NvdW50ID0gKHZhbC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3Qgc3RlcFN0cmluZyA9IHN0ZXAudG9TdHJpbmcoKTtcbiAgICBsZXQgc3RlcERlY0NvdW50ID0gKHN0ZXBTdHJpbmcuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBpZiAoc3RlcERlY0NvdW50ID09PSAwICYmIC9cXGQ/ZS1cXGQ/Ly50ZXN0KHN0ZXBTdHJpbmcpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3RlcFN0cmluZy5tYXRjaCgvXFxkP2UtKFxcZD8pLyk7XG4gICAgICAgIGlmIChtYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzdGVwRGVjQ291bnQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRlY0NvdW50ID0gdmFsRGVjQ291bnQgPiBzdGVwRGVjQ291bnQgPyB2YWxEZWNDb3VudCA6IHN0ZXBEZWNDb3VudDtcbiAgICBjb25zdCB2YWxJbnQgPSBOdW1iZXIucGFyc2VJbnQodmFsLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICBjb25zdCBzdGVwSW50ID0gTnVtYmVyLnBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiB2YWxJbnQgJSBzdGVwSW50IC8gMTAgKiogZGVjQ291bnQ7XG59XG5jb25zdCBFVkFMVUFUSU5HID0gU3ltYm9sKFwiZXZhbHVhdGluZ1wiKTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVMYXp5KG9iamVjdCwga2V5LCBnZXR0ZXIpIHtcbiAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IEVWQUxVQVRJTkcpIHtcbiAgICAgICAgICAgICAgICAvLyBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQsIHJldHVybiB1bmRlZmluZWQgdG8gYnJlYWsgdGhlIGN5Y2xlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBFVkFMVUFUSU5HO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0dGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCAodikge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyBvYmplY3Rba2V5XSA9IHY7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdENsb25lKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25Qcm9wKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wLCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWZzKC4uLmRlZnMpIHtcbiAgICBjb25zdCBtZXJnZWREZXNjcmlwdG9ycyA9IHt9O1xuICAgIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpe1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGRlZik7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkRGVzY3JpcHRvcnMsIGRlc2NyaXB0b3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCBtZXJnZWREZXNjcmlwdG9ycyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xvbmVEZWYoc2NoZW1hKSB7XG4gICAgcmV0dXJuIG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRBdFBhdGgob2JqLCBwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gb2JqO1xuICAgIHJldHVybiBwYXRoLnJlZHVjZSgoYWNjLCBrZXkpPT5hY2M/LltrZXldLCBvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VBbGxPYmplY3QocHJvbWlzZXNPYmopIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvbWlzZXNPYmopO1xuICAgIGNvbnN0IHByb21pc2VzID0ga2V5cy5tYXAoKGtleSk9PnByb21pc2VzT2JqW2tleV0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigocmVzdWx0cyk9PntcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPYmogPSB7fTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgcmVzb2x2ZWRPYmpba2V5c1tpXV0gPSByZXN1bHRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZE9iajtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoID0gMTApIHtcbiAgICBjb25zdCBjaGFycyA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspe1xuICAgICAgICBzdHIgKz0gY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKV07XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5leHBvcnQgZnVuY3Rpb24gZXNjKHN0cikge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdHIpO1xufVxuZXhwb3J0IGNvbnN0IGNhcHR1cmVTdGFja1RyYWNlID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgOiAoLi4uX2FyZ3MpPT57fTtcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG5leHBvcnQgY29uc3QgYWxsb3dzRXZhbCA9IGNhY2hlZCgoKT0+e1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3I/LnVzZXJBZ2VudD8uaW5jbHVkZXMoXCJDbG91ZGZsYXJlXCIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgRiA9IEZ1bmN0aW9uO1xuICAgICAgICBuZXcgRihcIlwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSk7XG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvKSB7XG4gICAgaWYgKGlzT2JqZWN0KG8pID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIG1vZGlmaWVkIGNvbnN0cnVjdG9yXG4gICAgY29uc3QgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gICAgaWYgKGN0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgLy8gbW9kaWZpZWQgcHJvdG90eXBlXG4gICAgY29uc3QgcHJvdCA9IGN0b3IucHJvdG90eXBlO1xuICAgIGlmIChpc09iamVjdChwcm90KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAvLyBjdG9yIGRvZXNuJ3QgaGF2ZSBzdGF0aWMgYGlzUHJvdG90eXBlT2ZgXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90LCBcImlzUHJvdG90eXBlT2ZcIikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0Nsb25lKG8pIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvKSkgcmV0dXJuIHtcbiAgICAgICAgLi4ub1xuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBbXG4gICAgICAgIC4uLm9cbiAgICBdO1xuICAgIHJldHVybiBvO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bUtleXMoZGF0YSkge1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlDb3VudDtcbn1cbmV4cG9ydCBjb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpPT57XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCh0KXtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGEpID8gXCJuYW5cIiA6IFwibnVtYmVyXCI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN5bWJvbFwiO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmIGRhdGEuY2F0Y2ggJiYgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInByb21pc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJtYXBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZXRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImZpbGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZTogJHt0fWApO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJvcGVydHlLZXlUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcInN5bWJvbFwiXG5dKTtcbmV4cG9ydCBjb25zdCBwcmltaXRpdmVUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImJpZ2ludFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJ1bmRlZmluZWRcIlxuXSk7XG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnZXgoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG59XG4vLyB6b2Qtc3BlY2lmaWMgdXRpbHNcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShpbnN0LCBkZWYsIHBhcmFtcykge1xuICAgIGNvbnN0IGNsID0gbmV3IGluc3QuX3pvZC5jb25zdHIoZGVmID8/IGluc3QuX3pvZC5kZWYpO1xuICAgIGlmICghZGVmIHx8IHBhcmFtcz8ucGFyZW50KSBjbC5fem9kLnBhcmVudCA9IGluc3Q7XG4gICAgcmV0dXJuIGNsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gX3BhcmFtcztcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHt9O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiKSByZXR1cm4ge1xuICAgICAgICBlcnJvcjogKCk9PnBhcmFtc1xuICAgIH07XG4gICAgaWYgKHBhcmFtcz8ubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXJhbXM/LmVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGJvdGggYG1lc3NhZ2VgIGFuZCBgZXJyb3JgIHBhcmFtc1wiKTtcbiAgICAgICAgcGFyYW1zLmVycm9yID0gcGFyYW1zLm1lc3NhZ2U7XG4gICAgfVxuICAgIGRlbGV0ZSBwYXJhbXMubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5lcnJvciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBlcnJvcjogKCk9PnBhcmFtcy5lcnJvclxuICAgIH07XG4gICAgcmV0dXJuIHBhcmFtcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc3BhcmVudFByb3h5KGdldHRlcikge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICBnZXQgKF8sIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IChfLCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWxldGVQcm9wZXJ0eSAoXywgcHJvcCkge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBvd25LZXlzIChfKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWZpbmVQcm9wZXJ0eSAoXywgcHJvcCwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5UHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkgKyBcIm5cIjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxLZXlzKHNoYXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNoYXBlKS5maWx0ZXIoKGspPT57XG4gICAgICAgIHJldHVybiBzaGFwZVtrXS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIgJiYgc2hhcGVba10uX3pvZC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIjtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBOVU1CRVJfRk9STUFUX1JBTkdFUyA9IHtcbiAgICBzYWZlaW50OiBbXG4gICAgICAgIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIF0sXG4gICAgaW50MzI6IFtcbiAgICAgICAgLTIxNDc0ODM2NDgsXG4gICAgICAgIDIxNDc0ODM2NDdcbiAgICBdLFxuICAgIHVpbnQzMjogW1xuICAgICAgICAwLFxuICAgICAgICA0Mjk0OTY3Mjk1XG4gICAgXSxcbiAgICBmbG9hdDMyOiBbXG4gICAgICAgIC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgsXG4gICAgICAgIDMuNDAyODIzNDY2Mzg1Mjg4NmUzOFxuICAgIF0sXG4gICAgZmxvYXQ2NDogW1xuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgTnVtYmVyLk1BWF9WQUxVRVxuICAgIF1cbn07XG5leHBvcnQgY29uc3QgQklHSU5UX0ZPUk1BVF9SQU5HRVMgPSB7XG4gICAgaW50NjQ6IFtcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIilcbiAgICBdLFxuICAgIHVpbnQ2NDogW1xuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoMCksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIpXG4gICAgXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGN1cnJEZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIGN1cnJEZWYuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGN1cnJEZWYuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBuZXdTaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIG5ld1NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvbWl0KHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGN1cnJEZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gY3VyckRlZi5zaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3U2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBuZXdTaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIG5ld1NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQoc2NoZW1hLCBzaGFwZSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChzaGFwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCB0byBleHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0XCIpO1xuICAgIH1cbiAgICBjb25zdCBjaGVja3MgPSBzY2hlbWEuX3pvZC5kZWYuY2hlY2tzO1xuICAgIGNvbnN0IGhhc0NoZWNrcyA9IGNoZWNrcyAmJiBjaGVja3MubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzQ2hlY2tzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMgY2Fubm90IGJlIGV4dGVuZGVkLiBVc2UgYC5zYWZlRXh0ZW5kKClgIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2FmZUV4dGVuZChzY2hlbWEsIHNoYXBlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHRvIHNhZmVFeHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0XCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZixcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IF9zaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEuX3pvZC5kZWYuc2hhcGUsXG4gICAgICAgICAgICAgICAgLi4uc2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgX3NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gX3NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IHNjaGVtYS5fem9kLmRlZi5jaGVja3NcbiAgICB9O1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoYSwgYikge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhhLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uYS5fem9kLmRlZi5zaGFwZSxcbiAgICAgICAgICAgICAgICAuLi5iLl96b2QuZGVmLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGNhdGNoYWxsICgpIHtcbiAgICAgICAgICAgIHJldHVybiBiLl96b2QuZGVmLmNhdGNoYWxsO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKGEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbChDbGFzcywgc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkU2hhcGUgPSBzY2hlbWEuX3pvZC5kZWYuc2hhcGU7XG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5vbGRTaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9sZFNoYXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAob2xkU2hhcGVba2V5XSEuX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IENsYXNzID8gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KSA6IG9sZFNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG9sZFNoYXBlKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9sZFNoYXBlW2tleV0hLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBDbGFzcyA/IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkgOiBvbGRTaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBzaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChDbGFzcywgc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkU2hhcGUgPSBzY2hlbWEuX3pvZC5kZWYuc2hhcGU7XG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5vbGRTaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIHNoYXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdGUgd2l0aCBub24tb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm5vbm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG9sZFNoYXBlKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHdpdGggbm9uLW9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBzaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbi8vIGludmFsaWRfdHlwZSB8IHRvb19iaWcgfCB0b29fc21hbGwgfCBpbnZhbGlkX2Zvcm1hdCB8IG5vdF9tdWx0aXBsZV9vZiB8IHVucmVjb2duaXplZF9rZXlzIHwgaW52YWxpZF91bmlvbiB8IGludmFsaWRfa2V5IHwgaW52YWxpZF9lbGVtZW50IHwgaW52YWxpZF92YWx1ZSB8IGN1c3RvbVxuZXhwb3J0IGZ1bmN0aW9uIGFib3J0ZWQoeCwgc3RhcnRJbmRleCA9IDApIHtcbiAgICBpZiAoeC5hYm9ydGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgeC5pc3N1ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBpZiAoeC5pc3N1ZXNbaV0/LmNvbnRpbnVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJlZml4SXNzdWVzKHBhdGgsIGlzc3Vlcykge1xuICAgIHJldHVybiBpc3N1ZXMubWFwKChpc3MpPT57XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gaXNzKS5wYXRoID8/IChfYS5wYXRoID0gW10pO1xuICAgICAgICBpc3MucGF0aC51bnNoaWZ0KHBhdGgpO1xuICAgICAgICByZXR1cm4gaXNzO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiBtZXNzYWdlPy5tZXNzYWdlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvbmZpZykge1xuICAgIGNvbnN0IGZ1bGwgPSB7XG4gICAgICAgIC4uLmlzcyxcbiAgICAgICAgcGF0aDogaXNzLnBhdGggPz8gW11cbiAgICB9O1xuICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGlmICghaXNzLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHVud3JhcE1lc3NhZ2UoaXNzLmluc3Q/Ll96b2QuZGVmPy5lcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY3R4Py5lcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY29uZmlnLmN1c3RvbUVycm9yPy4oaXNzKSkgPz8gdW53cmFwTWVzc2FnZShjb25maWcubG9jYWxlRXJyb3I/Lihpc3MpKSA/PyBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgZnVsbC5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgLy8gZGVsZXRlIChmdWxsIGFzIGFueSkuZGVmO1xuICAgIGRlbGV0ZSBmdWxsLmluc3Q7XG4gICAgZGVsZXRlIGZ1bGwuY29udGludWU7XG4gICAgaWYgKCFjdHg/LnJlcG9ydElucHV0KSB7XG4gICAgICAgIGRlbGV0ZSBmdWxsLmlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gZnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaXphYmxlT3JpZ2luKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgU2V0KSByZXR1cm4gXCJzZXRcIjtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBNYXApIHJldHVybiBcIm1hcFwiO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlKSByZXR1cm4gXCJmaWxlXCI7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHJldHVybiBcImFycmF5XCI7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBbaXNzLCBpbnB1dCwgaW5zdF0gPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgaXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBpc3MsXG4gICAgICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlzc1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY2xlYW5FbnVtKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW2ssIF9dKT0+e1xuICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBOYU4sIG1lYW5pbmcgaXQncyBub3QgYSBudW1iZXIsIHRodXMgYSBzdHJpbmcga2V5XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oTnVtYmVyLnBhcnNlSW50KGssIDEwKSk7XG4gICAgfSkubWFwKChlbCk9PmVsWzFdKTtcbn1cbi8vIENvZGVjIHV0aWxpdHkgZnVuY3Rpb25zXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NCkge1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeVN0cmluZy5sZW5ndGgpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspe1xuICAgICAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDhBcnJheVRvQmFzZTY0KGJ5dGVzKSB7XG4gICAgbGV0IGJpbmFyeVN0cmluZyA9IFwiXCI7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgYmluYXJ5U3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShiaW5hcnlTdHJpbmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NHVybFRvVWludDhBcnJheShiYXNlNjR1cmwpIHtcbiAgICBjb25zdCBiYXNlNjQgPSBiYXNlNjR1cmwucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgY29uc3QgcGFkZGluZyA9IFwiPVwiLnJlcGVhdCgoNCAtIGJhc2U2NC5sZW5ndGggJSA0KSAlIDQpO1xuICAgIHJldHVybiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0ICsgcGFkZGluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDhBcnJheVRvQmFzZTY0dXJsKGJ5dGVzKSB7XG4gICAgcmV0dXJuIHVpbnQ4QXJyYXlUb0Jhc2U2NChieXRlcykucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0vZywgXCJcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4VG9VaW50OEFycmF5KGhleCkge1xuICAgIGNvbnN0IGNsZWFuSGV4ID0gaGV4LnJlcGxhY2UoL14weC8sIFwiXCIpO1xuICAgIGlmIChjbGVhbkhleC5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGV4IHN0cmluZyBsZW5ndGhcIik7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoY2xlYW5IZXgubGVuZ3RoIC8gMik7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGNsZWFuSGV4Lmxlbmd0aDsgaSArPSAyKXtcbiAgICAgICAgYnl0ZXNbaSAvIDJdID0gTnVtYmVyLnBhcnNlSW50KGNsZWFuSGV4LnNsaWNlKGksIGkgKyAyKSwgMTYpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDhBcnJheVRvSGV4KGJ5dGVzKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpLm1hcCgoYik9PmIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbn1cbi8vIGluc3RhbmNlb2ZcbmV4cG9ydCBjbGFzcyBDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoLi4uX2FyZ3Mpe31cbn1cbiIsICJpbXBvcnQgeyAkY29uc3RydWN0b3IgfSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuL3V0aWwuanNcIjtcbmNvbnN0IGluaXRpYWxpemVyID0gKGluc3QsIGRlZik9PntcbiAgICBpbnN0Lm5hbWUgPSBcIiRab2RFcnJvclwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcIl96b2RcIiwge1xuICAgICAgICB2YWx1ZTogaW5zdC5fem9kLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcImlzc3Vlc1wiLCB7XG4gICAgICAgIHZhbHVlOiBkZWYsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgaW5zdC5tZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZGVmLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwidG9TdHJpbmdcIiwge1xuICAgICAgICB2YWx1ZTogKCk9Pmluc3QubWVzc2FnZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbn07XG5leHBvcnQgY29uc3QgJFpvZEVycm9yID0gJGNvbnN0cnVjdG9yKFwiJFpvZEVycm9yXCIsIGluaXRpYWxpemVyKTtcbmV4cG9ydCBjb25zdCAkWm9kUmVhbEVycm9yID0gJGNvbnN0cnVjdG9yKFwiJFpvZEVycm9yXCIsIGluaXRpYWxpemVyLCB7XG4gICAgUGFyZW50OiBFcnJvclxufSk7XG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkVycm9yKGVycm9yLCBtYXBwZXIgPSAoaXNzdWUpPT5pc3N1ZS5tZXNzYWdlKSB7XG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICBjb25zdCBmb3JtRXJyb3JzID0gW107XG4gICAgZm9yIChjb25zdCBzdWIgb2YgZXJyb3IuaXNzdWVzKXtcbiAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSA9IGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSB8fCBbXTtcbiAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXS5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybUVycm9ycyxcbiAgICAgICAgZmllbGRFcnJvcnNcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yLCBfbWFwcGVyKSB7XG4gICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fCBmdW5jdGlvbihpc3N1ZSkge1xuICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTtcbiAgICB9O1xuICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge1xuICAgICAgICBfZXJyb3JzOiBbXVxuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKT0+e1xuICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcyl7XG4gICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3VuaW9uXCIgJiYgaXNzdWUuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlzc3VlLmVycm9ycy5tYXAoKGlzc3Vlcyk9PnByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfa2V5XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfZWxlbWVudFwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlKGkgPCBpc3N1ZS5wYXRoLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWwgPSBpID09PSBpc3N1ZS5wYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Vycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbZWxdO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBwcm9jZXNzRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmaWVsZEVycm9ycztcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmVlaWZ5RXJyb3IoZXJyb3IsIF9tYXBwZXIpIHtcbiAgICBjb25zdCBtYXBwZXIgPSBfbWFwcGVyIHx8IGZ1bmN0aW9uKGlzc3VlKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IsIHBhdGggPSBbXSk9PntcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyByZWd1bGFyIHVuaW9uIGVycm9yXG4gICAgICAgICAgICAgICAgaXNzdWUuZXJyb3JzLm1hcCgoaXNzdWVzKT0+cHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9LCBpc3N1ZS5wYXRoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9rZXlcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSwgaXNzdWUucGF0aCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9lbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0sIGlzc3VlLnBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxscGF0aCA9IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgLi4uaXNzdWUucGF0aFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUoaSA8IGZ1bGxwYXRoLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnVsbHBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gZnVsbHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyci5wcm9wZXJ0aWVzID8/IChjdXJyLnByb3BlcnRpZXMgPSB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2EgPSBjdXJyLnByb3BlcnRpZXMpW2VsXSA/PyAoX2FbZWxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIucHJvcGVydGllc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLml0ZW1zID8/IChjdXJyLml0ZW1zID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gY3Vyci5pdGVtcylbZWxdID8/IChfYltlbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5pdGVtc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLmVycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBGb3JtYXQgYSBab2RFcnJvciBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpbiB0aGUgZm9sbG93aW5nIGZvcm0uXG4gKlxuICogRnJvbVxuICpcbiAqIGBgYHRzXG4gKiBab2RFcnJvciB7XG4gKiAgIGlzc3VlczogW1xuICogICAgIHtcbiAqICAgICAgIGV4cGVjdGVkOiAnc3RyaW5nJyxcbiAqICAgICAgIGNvZGU6ICdpbnZhbGlkX3R5cGUnLFxuICogICAgICAgcGF0aDogWyAndXNlcm5hbWUnIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgc3RyaW5nJ1xuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgZXhwZWN0ZWQ6ICdudW1iZXInLFxuICogICAgICAgY29kZTogJ2ludmFsaWRfdHlwZScsXG4gKiAgICAgICBwYXRoOiBbICdmYXZvcml0ZU51bWJlcnMnLCAxIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgbnVtYmVyJ1xuICogICAgIH1cbiAqICAgXTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHRvXG4gKlxuICogYGBgXG4gKiB1c2VybmFtZVxuICogICBcdTI3MTYgRXhwZWN0ZWQgbnVtYmVyLCByZWNlaXZlZCBzdHJpbmcgYXQgXCJ1c2VybmFtZVxuICogZmF2b3JpdGVOdW1iZXJzWzBdXG4gKiAgIFx1MjcxNiBJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBudW1iZXJcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB0b0RvdFBhdGgoX3BhdGgpIHtcbiAgICBjb25zdCBzZWdzID0gW107XG4gICAgY29uc3QgcGF0aCA9IF9wYXRoLm1hcCgoc2VnKT0+dHlwZW9mIHNlZyA9PT0gXCJvYmplY3RcIiA/IHNlZy5rZXkgOiBzZWcpO1xuICAgIGZvciAoY29uc3Qgc2VnIG9mIHBhdGgpe1xuICAgICAgICBpZiAodHlwZW9mIHNlZyA9PT0gXCJudW1iZXJcIikgc2Vncy5wdXNoKGBbJHtzZWd9XWApO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2VnID09PSBcInN5bWJvbFwiKSBzZWdzLnB1c2goYFske0pTT04uc3RyaW5naWZ5KFN0cmluZyhzZWcpKX1dYCk7XG4gICAgICAgIGVsc2UgaWYgKC9bXlxcdyRdLy50ZXN0KHNlZykpIHNlZ3MucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoc2VnKX1dYCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlZ3MubGVuZ3RoKSBzZWdzLnB1c2goXCIuXCIpO1xuICAgICAgICAgICAgc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ3Muam9pbihcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcmV0dGlmeUVycm9yKGVycm9yKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAvLyBzb3J0IGJ5IHBhdGggbGVuZ3RoXG4gICAgY29uc3QgaXNzdWVzID0gW1xuICAgICAgICAuLi5lcnJvci5pc3N1ZXNcbiAgICBdLnNvcnQoKGEsIGIpPT4oYS5wYXRoID8/IFtdKS5sZW5ndGggLSAoYi5wYXRoID8/IFtdKS5sZW5ndGgpO1xuICAgIC8vIFByb2Nlc3MgZWFjaCBpc3N1ZVxuICAgIGZvciAoY29uc3QgaXNzdWUgb2YgaXNzdWVzKXtcbiAgICAgICAgbGluZXMucHVzaChgXHUyNzE2ICR7aXNzdWUubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGlzc3VlLnBhdGg/Lmxlbmd0aCkgbGluZXMucHVzaChgICBcdTIxOTIgYXQgJHt0b0RvdFBhdGgoaXNzdWUucGF0aCl9YCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgTWFwIHRvIGZvcm1hdHRlZCBzdHJpbmdcbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0IF9wYXJzZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgsIF9wYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyAoX3BhcmFtcz8uRXJyID8/IF9FcnIpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSk7XG4gICAgICAgICAgICB1dGlsLmNhcHR1cmVTdGFja1RyYWNlKGUsIF9wYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9wYXJzZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3BhcnNlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4LCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IChwYXJhbXM/LkVyciA/PyBfRXJyKShyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpO1xuICAgICAgICAgICAgdXRpbC5jYXB0dXJlU3RhY2tUcmFjZShlLCBwYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3BhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2UgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8ge1xuICAgICAgICAgICAgLi4uX2N0eCxcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IChfRXJyID8/IGVycm9ycy4kWm9kRXJyb3IpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHQudmFsdWVcbiAgICAgICAgfTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9zYWZlUGFyc2UoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2VBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IF9FcnIocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfc2FmZVBhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9lbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfcGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyovIF9lbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9kZWNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX2RlY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2VuY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX2VuY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9kZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVFbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVFbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRW5jb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRW5jb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG4iLCAiZXhwb3J0IGNvbnN0IGN1aWQgPSAvXltjQ11bXlxccy1dezgsfSQvO1xuZXhwb3J0IGNvbnN0IGN1aWQyID0gL15bMC05YS16XSskLztcbmV4cG9ydCBjb25zdCB1bGlkID0gL15bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI2fSQvO1xuZXhwb3J0IGNvbnN0IHhpZCA9IC9eWzAtOWEtdkEtVl17MjB9JC87XG5leHBvcnQgY29uc3Qga3N1aWQgPSAvXltBLVphLXowLTldezI3fSQvO1xuZXhwb3J0IGNvbnN0IG5hbm9pZCA9IC9eW2EtekEtWjAtOV8tXXsyMX0kLztcbi8qKiBJU08gODYwMS0xIGR1cmF0aW9uIHJlZ2V4LiBEb2VzIG5vdCBzdXBwb3J0IHRoZSA4NjAxLTIgZXh0ZW5zaW9ucyBsaWtlIG5lZ2F0aXZlIGR1cmF0aW9ucyBvciBmcmFjdGlvbmFsL25lZ2F0aXZlIGNvbXBvbmVudHMuICovIGV4cG9ydCBjb25zdCBkdXJhdGlvbiA9IC9eUCg/OihcXGQrVyl8KD8hLipXKSg/PVxcZHxUXFxkKShcXGQrWSk/KFxcZCtNKT8oXFxkK0QpPyhUKD89XFxkKShcXGQrSCk/KFxcZCtNKT8oXFxkKyhbLixdXFxkKyk/Uyk/KT8pJC87XG4vKiogSW1wbGVtZW50cyBJU08gODYwMS0yIGV4dGVuc2lvbnMgbGlrZSBleHBsaWNpdCArLSBwcmVmaXhlcywgbWl4aW5nIHdlZWtzIHdpdGggb3RoZXIgdW5pdHMsIGFuZCBmcmFjdGlvbmFsL25lZ2F0aXZlIGNvbXBvbmVudHMuICovIGV4cG9ydCBjb25zdCBleHRlbmRlZER1cmF0aW9uID0gL15bLStdP1AoPyEkKSg/Oig/OlstK10/XFxkK1kpfCg/OlstK10/XFxkK1suLF1cXGQrWSQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86KD86Wy0rXT9cXGQrVyl8KD86Wy0rXT9cXGQrWy4sXVxcZCtXJCkpPyg/Oig/OlstK10/XFxkK0QpfCg/OlstK10/XFxkK1suLF1cXGQrRCQpKT8oPzpUKD89W1xcZCstXSkoPzooPzpbLStdP1xcZCtIKXwoPzpbLStdP1xcZCtbLixdXFxkK0gkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/OlstK10/XFxkKyg/OlsuLF1cXGQrKT9TKT8pPz8kLztcbi8qKiBBIHJlZ2V4IGZvciBhbnkgVVVJRC1saWtlIGlkZW50aWZpZXI6IDgtNC00LTQtMTIgaGV4IHBhdHRlcm4gKi8gZXhwb3J0IGNvbnN0IGd1aWQgPSAvXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0pJC87XG4vKiogUmV0dXJucyBhIHJlZ2V4IGZvciB2YWxpZGF0aW5nIGFuIFJGQyA5NTYyLzQxMjIgVVVJRC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiBPcHRpb25hbGx5IHNwZWNpZnkgYSB2ZXJzaW9uIDEtOC4gSWYgbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWQsIGFsbCB2ZXJzaW9ucyBhcmUgc3VwcG9ydGVkLiAqLyBleHBvcnQgY29uc3QgdXVpZCA9ICh2ZXJzaW9uKT0+e1xuICAgIGlmICghdmVyc2lvbikgcmV0dXJuIC9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVsxLThdWzAtOWEtZkEtRl17M30tWzg5YWJBQl1bMC05YS1mQS1GXXszfS1bMC05YS1mQS1GXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkLztcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS0ke3ZlcnNpb259WzAtOWEtZkEtRl17M30tWzg5YWJBQl1bMC05YS1mQS1GXXszfS1bMC05YS1mQS1GXXsxMn0pJGApO1xufTtcbmV4cG9ydCBjb25zdCB1dWlkNCA9IC8qQF9fUFVSRV9fKi8gdXVpZCg0KTtcbmV4cG9ydCBjb25zdCB1dWlkNiA9IC8qQF9fUFVSRV9fKi8gdXVpZCg2KTtcbmV4cG9ydCBjb25zdCB1dWlkNyA9IC8qQF9fUFVSRV9fKi8gdXVpZCg3KTtcbi8qKiBQcmFjdGljYWwgZW1haWwgdmFsaWRhdGlvbiAqLyBleHBvcnQgY29uc3QgZW1haWwgPSAvXig/IVxcLikoPyEuKlxcLlxcLikoW0EtWmEtejAtOV8nK1xcLVxcLl0qKVtBLVphLXowLTlfKy1dQChbQS1aYS16MC05XVtBLVphLXowLTlcXC1dKlxcLikrW0EtWmEtel17Mix9JC87XG4vKiogRXF1aXZhbGVudCB0byB0aGUgSFRNTDUgaW5wdXRbdHlwZT1lbWFpbF0gdmFsaWRhdGlvbiBpbXBsZW1lbnRlZCBieSBicm93c2Vycy4gU291cmNlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvZW1haWwgKi8gZXhwb3J0IGNvbnN0IGh0bWw1RW1haWwgPSAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87XG4vKiogVGhlIGNsYXNzaWMgZW1haWxyZWdleC5jb20gcmVnZXggZm9yIFJGQyA1MzIyLWNvbXBsaWFudCBlbWFpbHMgKi8gZXhwb3J0IGNvbnN0IHJmYzUzMjJFbWFpbCA9IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvO1xuLyoqIEEgbG9vc2UgcmVnZXggdGhhdCBhbGxvd3MgVW5pY29kZSBjaGFyYWN0ZXJzLCBlbmZvcmNlcyBsZW5ndGggbGltaXRzLCBhbmQgdGhhdCdzIGFib3V0IGl0LiAqLyBleHBvcnQgY29uc3QgdW5pY29kZUVtYWlsID0gL15bXlxcc0BcIl17MSw2NH1AW15cXHNAXXsxLDI1NX0kL3U7XG5leHBvcnQgY29uc3QgaWRuRW1haWwgPSB1bmljb2RlRW1haWw7XG5leHBvcnQgY29uc3QgYnJvd3NlckVtYWlsID0gL15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamkgPSBgXihcXFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxcXFxwe0Vtb2ppX0NvbXBvbmVudH0pKyRgO1xuZXhwb3J0IGZ1bmN0aW9uIGVtb2ppKCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKF9lbW9qaSwgXCJ1XCIpO1xufVxuZXhwb3J0IGNvbnN0IGlwdjQgPSAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvO1xuZXhwb3J0IGNvbnN0IGlwdjYgPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopKSQvO1xuZXhwb3J0IGNvbnN0IGNpZHJ2NCA9IC9eKCgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwvKFswLTldfFsxLTJdWzAtOV18M1swLTJdKSQvO1xuZXhwb3J0IGNvbnN0IGNpZHJ2NiA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fDo6fChbMC05YS1mQS1GXXsxLDR9KT86OihbMC05YS1mQS1GXXsxLDR9Oj8pezAsNn0pXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMS05XT9bMC05XSkkLztcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4NjAzOTIvZGV0ZXJtaW5lLWlmLXN0cmluZy1pcy1pbi1iYXNlNjQtdXNpbmctamF2YXNjcmlwdFxuZXhwb3J0IGNvbnN0IGJhc2U2NCA9IC9eJHxeKD86WzAtOWEtekEtWisvXXs0fSkqKD86KD86WzAtOWEtekEtWisvXXsyfT09KXwoPzpbMC05YS16QS1aKy9dezN9PSkpPyQvO1xuZXhwb3J0IGNvbnN0IGJhc2U2NHVybCA9IC9eW0EtWmEtejAtOV8tXSokLztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNjE3OS9yZWd1bGFyLWV4cHJlc3Npb24tdG8tbWF0Y2gtZG5zLWhvc3RuYW1lLW9yLWlwLWFkZHJlc3Ncbi8vIGV4cG9ydCBjb25zdCBob3N0bmFtZTogUmVnRXhwID0gL14oW2EtekEtWjAtOS1dK1xcLikqW2EtekEtWjAtOS1dKyQvO1xuZXhwb3J0IGNvbnN0IGhvc3RuYW1lID0gL14oPz0uezEsMjUzfVxcLj8kKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86Wy0wLTlhLXpBLVpdezAsNjF9WzAtOWEtekEtWl0pPykqXFwuPyQvO1xuZXhwb3J0IGNvbnN0IGRvbWFpbiA9IC9eKFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pP1xcLikrW2EtekEtWl17Mix9JC87XG4vLyBodHRwczovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL3ZhbGlkYXRlLXBob25lLW51bWJlciNyNC0zIChyZWdleCBzYW5zIHNwYWNlcylcbmV4cG9ydCBjb25zdCBlMTY0ID0gL15cXCsoPzpbMC05XSl7NiwxNH1bMC05XSQvO1xuLy8gY29uc3QgZGF0ZVNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVNvdXJjZSA9IGAoPzooPzpcXFxcZFxcXFxkWzI0NjhdWzA0OF18XFxcXGRcXFxcZFsxMzU3OV1bMjZdfFxcXFxkXFxcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXFxcZHs0fS0oPzooPzowWzEzNTc4XXwxWzAyXSktKD86MFsxLTldfFsxMl1cXFxcZHwzWzAxXSl8KD86MFs0NjldfDExKS0oPzowWzEtOV18WzEyXVxcXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuZXhwb3J0IGNvbnN0IGRhdGUgPSAvKkBfX1BVUkVfXyovIG5ldyBSZWdFeHAoYF4ke2RhdGVTb3VyY2V9JGApO1xuZnVuY3Rpb24gdGltZVNvdXJjZShhcmdzKSB7XG4gICAgY29uc3QgaGhtbSA9IGAoPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkYDtcbiAgICBjb25zdCByZWdleCA9IHR5cGVvZiBhcmdzLnByZWNpc2lvbiA9PT0gXCJudW1iZXJcIiA/IGFyZ3MucHJlY2lzaW9uID09PSAtMSA/IGAke2hobW19YCA6IGFyZ3MucHJlY2lzaW9uID09PSAwID8gYCR7aGhtbX06WzAtNV1cXFxcZGAgOiBgJHtoaG1tfTpbMC01XVxcXFxkXFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gIDogYCR7aGhtbX0oPzo6WzAtNV1cXFxcZCg/OlxcXFwuXFxcXGQrKT8pP2A7XG4gICAgcmV0dXJuIHJlZ2V4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRpbWUoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lU291cmNlKGFyZ3MpfSRgKTtcbn1cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lKGFyZ3MpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZVNvdXJjZSh7XG4gICAgICAgIHByZWNpc2lvbjogYXJncy5wcmVjaXNpb25cbiAgICB9KTtcbiAgICBjb25zdCBvcHRzID0gW1xuICAgICAgICBcIlpcIlxuICAgIF07XG4gICAgaWYgKGFyZ3MubG9jYWwpIG9wdHMucHVzaChcIlwiKTtcbiAgICAvLyBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV1cXFxcZHsyfTpcXFxcZHsyfSlgKTtcbiAgICBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV0oPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKWApO1xuICAgIGNvbnN0IHRpbWVSZWdleCA9IGAke3RpbWV9KD86JHtvcHRzLmpvaW4oXCJ8XCIpfSlgO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtkYXRlU291cmNlfVQoPzoke3RpbWVSZWdleH0pJGApO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZyA9IChwYXJhbXMpPT57XG4gICAgY29uc3QgcmVnZXggPSBwYXJhbXMgPyBgW1xcXFxzXFxcXFNdeyR7cGFyYW1zPy5taW5pbXVtID8/IDB9LCR7cGFyYW1zPy5tYXhpbXVtID8/IFwiXCJ9fWAgOiBgW1xcXFxzXFxcXFNdKmA7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTtcbn07XG5leHBvcnQgY29uc3QgYmlnaW50ID0gL14tP1xcZCtuPyQvO1xuZXhwb3J0IGNvbnN0IGludGVnZXIgPSAvXi0/XFxkKyQvO1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IC9eLT9cXGQrKD86XFwuXFxkKyk/LztcbmV4cG9ydCBjb25zdCBib29sZWFuID0gL14oPzp0cnVlfGZhbHNlKSQvaTtcbmNvbnN0IF9udWxsID0gL15udWxsJC9pO1xuZXhwb3J0IHsgX251bGwgYXMgbnVsbCB9O1xuY29uc3QgX3VuZGVmaW5lZCA9IC9edW5kZWZpbmVkJC9pO1xuZXhwb3J0IHsgX3VuZGVmaW5lZCBhcyB1bmRlZmluZWQgfTtcbi8vIHJlZ2V4IGZvciBzdHJpbmcgd2l0aCBubyB1cHBlcmNhc2UgbGV0dGVyc1xuZXhwb3J0IGNvbnN0IGxvd2VyY2FzZSA9IC9eW15BLVpdKiQvO1xuLy8gcmVnZXggZm9yIHN0cmluZyB3aXRoIG5vIGxvd2VyY2FzZSBsZXR0ZXJzXG5leHBvcnQgY29uc3QgdXBwZXJjYXNlID0gL15bXmEtel0qJC87XG4vLyByZWdleCBmb3IgaGV4YWRlY2ltYWwgc3RyaW5ncyAoYW55IGxlbmd0aClcbmV4cG9ydCBjb25zdCBoZXggPSAvXlswLTlhLWZBLUZdKiQvO1xuLy8gSGFzaCByZWdleGVzIGZvciBkaWZmZXJlbnQgYWxnb3JpdGhtcyBhbmQgZW5jb2RpbmdzXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGJhc2U2NCByZWdleCB3aXRoIGV4YWN0IGxlbmd0aCBhbmQgcGFkZGluZ1xuZnVuY3Rpb24gZml4ZWRCYXNlNjQoYm9keUxlbmd0aCwgcGFkZGluZykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeW0EtWmEtejAtOSsvXXske2JvZHlMZW5ndGh9fSR7cGFkZGluZ30kYCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGJhc2U2NHVybCByZWdleCB3aXRoIGV4YWN0IGxlbmd0aCAobm8gcGFkZGluZylcbmZ1bmN0aW9uIGZpeGVkQmFzZTY0dXJsKGxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeW0EtWmEtejAtOV8tXXske2xlbmd0aH19JGApO1xufVxuLy8gTUQ1ICgxNiBieXRlcyk6IGJhc2U2NCA9IDI0IGNoYXJzIHRvdGFsICgyMiArIFwiPT1cIilcbmV4cG9ydCBjb25zdCBtZDVfaGV4ID0gL15bMC05YS1mQS1GXXszMn0kLztcbmV4cG9ydCBjb25zdCBtZDVfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCgyMiwgXCI9PVwiKTtcbmV4cG9ydCBjb25zdCBtZDVfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCgyMik7XG4vLyBTSEExICgyMCBieXRlcyk6IGJhc2U2NCA9IDI4IGNoYXJzIHRvdGFsICgyNyArIFwiPVwiKVxuZXhwb3J0IGNvbnN0IHNoYTFfaGV4ID0gL15bMC05YS1mQS1GXXs0MH0kLztcbmV4cG9ydCBjb25zdCBzaGExX2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoMjcsIFwiPVwiKTtcbmV4cG9ydCBjb25zdCBzaGExX2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoMjcpO1xuLy8gU0hBMjU2ICgzMiBieXRlcyk6IGJhc2U2NCA9IDQ0IGNoYXJzIHRvdGFsICg0MyArIFwiPVwiKVxuZXhwb3J0IGNvbnN0IHNoYTI1Nl9oZXggPSAvXlswLTlhLWZBLUZdezY0fSQvO1xuZXhwb3J0IGNvbnN0IHNoYTI1Nl9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDQzLCBcIj1cIik7XG5leHBvcnQgY29uc3Qgc2hhMjU2X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoNDMpO1xuLy8gU0hBMzg0ICg0OCBieXRlcyk6IGJhc2U2NCA9IDY0IGNoYXJzIHRvdGFsIChubyBwYWRkaW5nKVxuZXhwb3J0IGNvbnN0IHNoYTM4NF9oZXggPSAvXlswLTlhLWZBLUZdezk2fSQvO1xuZXhwb3J0IGNvbnN0IHNoYTM4NF9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDY0LCBcIlwiKTtcbmV4cG9ydCBjb25zdCBzaGEzODRfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCg2NCk7XG4vLyBTSEE1MTIgKDY0IGJ5dGVzKTogYmFzZTY0ID0gODggY2hhcnMgdG90YWwgKDg2ICsgXCI9PVwiKVxuZXhwb3J0IGNvbnN0IHNoYTUxMl9oZXggPSAvXlswLTlhLWZBLUZdezEyOH0kLztcbmV4cG9ydCBjb25zdCBzaGE1MTJfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg4NiwgXCI9PVwiKTtcbmV4cG9ydCBjb25zdCBzaGE1MTJfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCg4Nik7XG4iLCAiLy8gaW1wb3J0IHsgJFpvZFR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIHJlZ2V4ZXMgZnJvbSBcIi4vcmVnZXhlcy5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICBpbnN0Ll96b2QgPz8gKGluc3QuX3pvZCA9IHt9KTtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIChfYSA9IGluc3QuX3pvZCkub25hdHRhY2ggPz8gKF9hLm9uYXR0YWNoID0gW10pO1xufSk7XG5jb25zdCBudW1lcmljT3JpZ2luTWFwID0ge1xuICAgIG51bWJlcjogXCJudW1iZXJcIixcbiAgICBiaWdpbnQ6IFwiYmlnaW50XCIsXG4gICAgb2JqZWN0OiBcImRhdGVcIlxufTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tMZXNzVGhhbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tMZXNzVGhhblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3Qgb3JpZ2luID0gbnVtZXJpY09yaWdpbk1hcFt0eXBlb2YgZGVmLnZhbHVlXTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgY29uc3QgY3VyciA9IChkZWYuaW5jbHVzaXZlID8gYmFnLm1heGltdW0gOiBiYWcuZXhjbHVzaXZlTWF4aW11bSkgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLnZhbHVlIDwgY3Vycikge1xuICAgICAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUpIGJhZy5tYXhpbXVtID0gZGVmLnZhbHVlO1xuICAgICAgICAgICAgZWxzZSBiYWcuZXhjbHVzaXZlTWF4aW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoZGVmLmluY2x1c2l2ZSA/IHBheWxvYWQudmFsdWUgPD0gZGVmLnZhbHVlIDogcGF5bG9hZC52YWx1ZSA8IGRlZi52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICBtYXhpbXVtOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZGVmLmluY2x1c2l2ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrR3JlYXRlclRoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrR3JlYXRlclRoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5taW5pbXVtIDogYmFnLmV4Y2x1c2l2ZU1pbmltdW0pID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA+IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWluaW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1pbmltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlID49IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPiBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZGVmLmluY2x1c2l2ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTXVsdGlwbGVPZiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNdWx0aXBsZU9mXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBpbnN0Ll96b2QuYmFnKS5tdWx0aXBsZU9mID8/IChfYS5tdWx0aXBsZU9mID0gZGVmLnZhbHVlKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSB0eXBlb2YgZGVmLnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbWl4IG51bWJlciBhbmQgYmlnaW50IGluIG11bHRpcGxlX29mIGNoZWNrLlwiKTtcbiAgICAgICAgY29uc3QgaXNNdWx0aXBsZSA9IHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcImJpZ2ludFwiID8gcGF5bG9hZC52YWx1ZSAlIGRlZi52YWx1ZSA9PT0gQmlnSW50KDApIDogdXRpbC5mbG9hdFNhZmVSZW1haW5kZXIocGF5bG9hZC52YWx1ZSwgZGVmLnZhbHVlKSA9PT0gMDtcbiAgICAgICAgaWYgKGlzTXVsdGlwbGUpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHR5cGVvZiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgY29kZTogXCJub3RfbXVsdGlwbGVfb2ZcIixcbiAgICAgICAgICAgIGRpdmlzb3I6IGRlZi52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tOdW1iZXJGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTnVtYmVyRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc1xuICAgIGRlZi5mb3JtYXQgPSBkZWYuZm9ybWF0IHx8IFwiZmxvYXQ2NFwiO1xuICAgIGNvbnN0IGlzSW50ID0gZGVmLmZvcm1hdD8uaW5jbHVkZXMoXCJpbnRcIik7XG4gICAgY29uc3Qgb3JpZ2luID0gaXNJbnQgPyBcImludFwiIDogXCJudW1iZXJcIjtcbiAgICBjb25zdCBbbWluaW11bSwgbWF4aW11bV0gPSB1dGlsLk5VTUJFUl9GT1JNQVRfUkFOR0VTW2RlZi5mb3JtYXRdO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gZGVmLmZvcm1hdDtcbiAgICAgICAgYmFnLm1pbmltdW0gPSBtaW5pbXVtO1xuICAgICAgICBiYWcubWF4aW11bSA9IG1heGltdW07XG4gICAgICAgIGlmIChpc0ludCkgYmFnLnBhdHRlcm4gPSByZWdleGVzLmludGVnZXI7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKGlzSW50KSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgLy8gaW52YWxpZF9mb3JtYXQgaXNzdWVcbiAgICAgICAgICAgICAgICAvLyBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAvLyAgIGV4cGVjdGVkOiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgICAgIC8vICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgICAgIC8vICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIC8vICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgLy8gICBpbnN0LFxuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIC8vIGludmFsaWRfdHlwZSBpc3N1ZVxuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogb3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyBub3RfbXVsdGlwbGVfb2YgaXNzdWVcbiAgICAgICAgICAgIC8vIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgLy8gICBjb2RlOiBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgICAgICAgICAgLy8gICBvcmlnaW46IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAvLyAgIGlucHV0LFxuICAgICAgICAgICAgLy8gICBpbnN0LFxuICAgICAgICAgICAgLy8gICBkaXZpc29yOiAxLFxuICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9vX2JpZ1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b29fc21hbGxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtLFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0JpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tCaWdJbnRGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgY29uc3QgW21pbmltdW0sIG1heGltdW1dID0gdXRpbC5CSUdJTlRfRk9STUFUX1JBTkdFU1tkZWYuZm9ybWF0XTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGRlZi5mb3JtYXQ7XG4gICAgICAgIGJhZy5taW5pbXVtID0gbWluaW11bTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBtYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnB1dCA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IG1pbmltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtLFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01heFNpemUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWF4U2l6ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwuc2l6ZSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBjdXJyID0gaW5zdC5fem9kLmJhZy5tYXhpbXVtID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi5tYXhpbXVtIDwgY3VycikgaW5zdC5fem9kLmJhZy5tYXhpbXVtID0gZGVmLm1heGltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlucHV0LnNpemU7XG4gICAgICAgIGlmIChzaXplIDw9IGRlZi5tYXhpbXVtKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB1dGlsLmdldFNpemFibGVPcmlnaW4oaW5wdXQpLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4aW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNaW5TaXplID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01pblNpemVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWluaW11bSA+IGN1cnIpIGluc3QuX3pvZC5iYWcubWluaW11bSA9IGRlZi5taW5pbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaXplO1xuICAgICAgICBpZiAoc2l6ZSA+PSBkZWYubWluaW11bSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdXRpbC5nZXRTaXphYmxlT3JpZ2luKGlucHV0KSxcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluaW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tTaXplRXF1YWxzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1NpemVFcXVhbHNcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLm1pbmltdW0gPSBkZWYuc2l6ZTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBkZWYuc2l6ZTtcbiAgICAgICAgYmFnLnNpemUgPSBkZWYuc2l6ZTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBzaXplID0gaW5wdXQuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgPT09IGRlZi5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRvb0JpZyA9IHNpemUgPiBkZWYuc2l6ZTtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHV0aWwuZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCksXG4gICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLnNpemVcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYuc2l6ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01heExlbmd0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNYXhMZW5ndGhcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBjdXJyID0gaW5zdC5fem9kLmJhZy5tYXhpbXVtID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi5tYXhpbXVtIDwgY3VycikgaW5zdC5fem9kLmJhZy5tYXhpbXVtID0gZGVmLm1heGltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDw9IGRlZi5tYXhpbXVtKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHV0aWwuZ2V0TGVuZ3RoYWJsZU9yaWdpbihpbnB1dCk7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4aW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNaW5MZW5ndGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWluTGVuZ3RoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWluaW11bSA+IGN1cnIpIGluc3QuX3pvZC5iYWcubWluaW11bSA9IGRlZi5taW5pbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA+PSBkZWYubWluaW11bSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluaW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tMZW5ndGhFcXVhbHMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTGVuZ3RoRXF1YWxzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLm1pbmltdW0gPSBkZWYubGVuZ3RoO1xuICAgICAgICBiYWcubWF4aW11bSA9IGRlZi5sZW5ndGg7XG4gICAgICAgIGJhZy5sZW5ndGggPSBkZWYubGVuZ3RoO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gZGVmLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBjb25zdCB0b29CaWcgPSBsZW5ndGggPiBkZWYubGVuZ3RoO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIC4uLnRvb0JpZyA/IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubGVuZ3RoXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bTogZGVmLmxlbmd0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1N0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2EsIF9iO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBkZWYuZm9ybWF0O1xuICAgICAgICBpZiAoZGVmLnBhdHRlcm4pIHtcbiAgICAgICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgICAgIGJhZy5wYXR0ZXJucy5hZGQoZGVmLnBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRlZi5wYXR0ZXJuKSAoX2EgPSBpbnN0Ll96b2QpLmNoZWNrID8/IChfYS5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBkZWYucGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoZGVmLnBhdHRlcm4udGVzdChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgLi4uZGVmLnBhdHRlcm4gPyB7XG4gICAgICAgICAgICAgICAgcGF0dGVybjogZGVmLnBhdHRlcm4udG9TdHJpbmcoKVxuICAgICAgICAgICAgfSA6IHt9LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGVsc2UgKF9iID0gaW5zdC5fem9kKS5jaGVjayA/PyAoX2IuY2hlY2sgPSAoKT0+e30pO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrUmVnZXggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrUmVnZXhcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBkZWYucGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoZGVmLnBhdHRlcm4udGVzdChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJyZWdleFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBwYXR0ZXJuOiBkZWYucGF0dGVybi50b1N0cmluZygpLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tMb3dlckNhc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTG93ZXJDYXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5sb3dlcmNhc2UpO1xuICAgICRab2RDaGVja1N0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tVcHBlckNhc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrVXBwZXJDYXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy51cHBlcmNhc2UpO1xuICAgICRab2RDaGVja1N0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tJbmNsdWRlcyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tJbmNsdWRlc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgZXNjYXBlZFJlZ2V4ID0gdXRpbC5lc2NhcGVSZWdleChkZWYuaW5jbHVkZXMpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHR5cGVvZiBkZWYucG9zaXRpb24gPT09IFwibnVtYmVyXCIgPyBgXi57JHtkZWYucG9zaXRpb259fSR7ZXNjYXBlZFJlZ2V4fWAgOiBlc2NhcGVkUmVnZXgpO1xuICAgIGRlZi5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5pbmNsdWRlcyhkZWYuaW5jbHVkZXMsIGRlZi5wb3NpdGlvbikpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgICAgIGluY2x1ZGVzOiBkZWYuaW5jbHVkZXMsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrU3RhcnRzV2l0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTdGFydHNXaXRoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7dXRpbC5lc2NhcGVSZWdleChkZWYucHJlZml4KX0uKmApO1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHBhdHRlcm4pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgIGJhZy5wYXR0ZXJucy5hZGQocGF0dGVybik7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlLnN0YXJ0c1dpdGgoZGVmLnByZWZpeCkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwic3RhcnRzX3dpdGhcIixcbiAgICAgICAgICAgIHByZWZpeDogZGVmLnByZWZpeCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tFbmRzV2l0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tFbmRzV2l0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYC4qJHt1dGlsLmVzY2FwZVJlZ2V4KGRlZi5zdWZmaXgpfSRgKTtcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSBwYXR0ZXJuKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5lbmRzV2l0aChkZWYuc3VmZml4KSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJlbmRzX3dpdGhcIixcbiAgICAgICAgICAgIHN1ZmZpeDogZGVmLnN1ZmZpeCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLyAgICAkWm9kQ2hlY2tQcm9wZXJ0eSAgICAvLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGhhbmRsZUNoZWNrUHJvcGVydHlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKHByb3BlcnR5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0ICRab2RDaGVja1Byb3BlcnR5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1Byb3BlcnR5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogcGF5bG9hZC52YWx1ZVtkZWYucHJvcGVydHldLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZUNoZWNrUHJvcGVydHlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBkZWYucHJvcGVydHkpKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgZGVmLnByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNaW1lVHlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNaW1lVHlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgbWltZVNldCA9IG5ldyBTZXQoZGVmLm1pbWUpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBpbnN0Ll96b2QuYmFnLm1pbWUgPSBkZWYubWltZTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKG1pbWVTZXQuaGFzKHBheWxvYWQudmFsdWUudHlwZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgIHZhbHVlczogZGVmLm1pbWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZS50eXBlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tPdmVyd3JpdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrT3ZlcndyaXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi50eChwYXlsb2FkLnZhbHVlKTtcbiAgICB9O1xufSk7XG4iLCAiZXhwb3J0IGNsYXNzIERvYyB7XG4gICAgY29uc3RydWN0b3IoYXJncyA9IFtdKXtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgaWYgKHRoaXMpIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuICAgIGluZGVudGVkKGZuKSB7XG4gICAgICAgIHRoaXMuaW5kZW50ICs9IDE7XG4gICAgICAgIGZuKHRoaXMpO1xuICAgICAgICB0aGlzLmluZGVudCAtPSAxO1xuICAgIH1cbiAgICB3cml0ZShhcmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYXJnKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBleGVjdXRpb246IFwic3luY1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFyZyh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcImFzeW5jXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcmc7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKS5maWx0ZXIoKHgpPT54KTtcbiAgICAgICAgY29uc3QgbWluSW5kZW50ID0gTWF0aC5taW4oLi4ubGluZXMubWFwKCh4KT0+eC5sZW5ndGggLSB4LnRyaW1TdGFydCgpLmxlbmd0aCkpO1xuICAgICAgICBjb25zdCBkZWRlbnRlZCA9IGxpbmVzLm1hcCgoeCk9Pnguc2xpY2UobWluSW5kZW50KSkubWFwKCh4KT0+XCIgXCIucmVwZWF0KHRoaXMuaW5kZW50ICogMikgKyB4KTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGRlZGVudGVkKXtcbiAgICAgICAgICAgIHRoaXMuY29udGVudC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGNvbnN0IEYgPSBGdW5jdGlvbjtcbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXM/LmFyZ3M7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzPy5jb250ZW50ID8/IFtcbiAgICAgICAgICAgIGBgXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgICAgICAgLi4uY29udGVudC5tYXAoKHgpPT5gICAke3h9YClcbiAgICAgICAgXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cobGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgICAgIHJldHVybiBuZXcgRiguLi5hcmdzLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSB7XG4gICAgbWFqb3I6IDQsXG4gICAgbWlub3I6IDEsXG4gICAgcGF0Y2g6IDExXG59O1xuIiwgImltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0IHsgRG9jIH0gZnJvbSBcIi4vZG9jLmpzXCI7XG5pbXBvcnQgeyBwYXJzZSwgcGFyc2VBc3luYywgc2FmZVBhcnNlLCBzYWZlUGFyc2VBc3luYyB9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL3ZlcnNpb25zLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZFR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdCA/PyAoaW5zdCA9IHt9KTtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmOyAvLyBzZXQgX2RlZiBwcm9wZXJ0eVxuICAgIGluc3QuX3pvZC5iYWcgPSBpbnN0Ll96b2QuYmFnIHx8IHt9OyAvLyBpbml0aWFsaXplIF9iYWcgb2JqZWN0XG4gICAgaW5zdC5fem9kLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIGNvbnN0IGNoZWNrcyA9IFtcbiAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5jaGVja3MgPz8gW11cbiAgICBdO1xuICAgIC8vIGlmIGluc3QgaXMgaXRzZWxmIGEgY2hlY2tzLiRab2RDaGVjaywgcnVuIGl0IGFzIGEgY2hlY2tcbiAgICBpZiAoaW5zdC5fem9kLnRyYWl0cy5oYXMoXCIkWm9kQ2hlY2tcIikpIHtcbiAgICAgICAgY2hlY2tzLnVuc2hpZnQoaW5zdCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBjaC5fem9kLm9uYXR0YWNoKXtcbiAgICAgICAgICAgIGZuKGluc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjaGVja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGRlZmVycmVkIGluaXRpYWxpemVyXG4gICAgICAgIC8vIGluc3QuX3pvZC5wYXJzZSBpcyBub3QgeWV0IGRlZmluZWRcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS5kZWZlcnJlZCA/PyAoX2EuZGVmZXJyZWQgPSBbXSk7XG4gICAgICAgIGluc3QuX3pvZC5kZWZlcnJlZD8ucHVzaCgoKT0+e1xuICAgICAgICAgICAgaW5zdC5fem9kLnJ1biA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcnVuQ2hlY2tzID0gKHBheWxvYWQsIGNoZWNrcywgY3R4KT0+e1xuICAgICAgICAgICAgbGV0IGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkKTtcbiAgICAgICAgICAgIGxldCBhc3luY1Jlc3VsdDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgICAgICAgICBpZiAoY2guX3pvZC5kZWYud2hlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRSdW4gPSBjaC5fem9kLmRlZi53aGVuKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFJ1bikgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IGNoLl96b2QuY2hlY2socGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgaWYgKF8gaW5zdGFuY2VvZiBQcm9taXNlICYmIGN0eD8uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCB8fCBfIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3VsdCA9IChhc3luY1Jlc3VsdCA/PyBQcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYyAoKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgXztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExlbiA9PT0gY3VyckxlbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Fib3J0ZWQpIGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkLCBjdXJyTGVuKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dExlbiA9IHBheWxvYWQuaXNzdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMZW4gPT09IGN1cnJMZW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWJvcnRlZCkgaXNBYm9ydGVkID0gdXRpbC5hYm9ydGVkKHBheWxvYWQsIGN1cnJMZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhc3luY1Jlc3VsdC50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGNvbnN0IGhhbmRsZUNoZWNrc1Jlc3VsdCA9IChcbiAgICAgICAgLy8gICBjaGVja1Jlc3VsdDogUGFyc2VQYXlsb2FkLFxuICAgICAgICAvLyAgIG9yaWdpbmFsUmVzdWx0OiBQYXJzZVBheWxvYWQsXG4gICAgICAgIC8vICAgY3R4OiBQYXJzZUNvbnRleHRJbnRlcm5hbFxuICAgICAgICAvLyApOiB1dGlsLk1heWJlQXN5bmM8UGFyc2VQYXlsb2FkPiA9PiB7XG4gICAgICAgIC8vICAgLy8gaWYgdGhlIGNoZWNrcyBtdXRhdGVkIHRoZSB2YWx1ZSAmJiB0aGVyZSBhcmUgbm8gaXNzdWVzLCByZS1wYXJzZSB0aGUgcmVzdWx0XG4gICAgICAgIC8vICAgaWYgKGNoZWNrUmVzdWx0LnZhbHVlICE9PSBvcmlnaW5hbFJlc3VsdC52YWx1ZSAmJiAhY2hlY2tSZXN1bHQuaXNzdWVzLmxlbmd0aClcbiAgICAgICAgLy8gICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UoY2hlY2tSZXN1bHQsIGN0eCk7XG4gICAgICAgIC8vICAgcmV0dXJuIG9yaWdpbmFsUmVzdWx0O1xuICAgICAgICAvLyB9O1xuICAgICAgICBjb25zdCBoYW5kbGVDYW5hcnlSZXN1bHQgPSAoY2FuYXJ5LCBwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgICAgICAvLyBhYm9ydCBpZiB0aGUgY2FuYXJ5IGlzIGFib3J0ZWRcbiAgICAgICAgICAgIGlmICh1dGlsLmFib3J0ZWQoY2FuYXJ5KSkge1xuICAgICAgICAgICAgICAgIGNhbmFyeS5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FuYXJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcnVuIGNoZWNrcyBmaXJzdCwgdGhlblxuICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBydW5DaGVja3MocGF5bG9hZCwgY2hlY2tzLCBjdHgpO1xuICAgICAgICAgICAgaWYgKGNoZWNrUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdHguYXN5bmMgPT09IGZhbHNlKSB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1Jlc3VsdC50aGVuKChjaGVja1Jlc3VsdCk9Pmluc3QuX3pvZC5wYXJzZShjaGVja1Jlc3VsdCwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5fem9kLnBhcnNlKGNoZWNrUmVzdWx0LCBjdHgpO1xuICAgICAgICB9O1xuICAgICAgICBpbnN0Ll96b2QucnVuID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgICAgIGlmIChjdHguc2tpcENoZWNrcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBydW4gY2FuYXJ5XG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbCBwYXNzIChubyBjaGVja3MpXG4gICAgICAgICAgICAgICAgY29uc3QgY2FuYXJ5ID0gaW5zdC5fem9kLnBhcnNlKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgc2tpcENoZWNrczogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChjYW5hcnkgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5hcnkudGhlbigoY2FuYXJ5KT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNhbmFyeVJlc3VsdChjYW5hcnksIHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2FuYXJ5UmVzdWx0KGNhbmFyeSwgcGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZvcndhcmRcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGluc3QuX3pvZC5wYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3R4LmFzeW5jID09PSBmYWxzZSkgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PnJ1bkNoZWNrcyhyZXN1bHQsIGNoZWNrcywgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVuQ2hlY2tzKHJlc3VsdCwgY2hlY2tzLCBjdHgpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpbnN0W1wifnN0YW5kYXJkXCJdID0ge1xuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlKT0+e1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gc2FmZVBhcnNlKGluc3QsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5zdWNjZXNzID8ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogci5kYXRhXG4gICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByLmVycm9yPy5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYWZlUGFyc2VBc3luYyhpbnN0LCB2YWx1ZSkudGhlbigocik9PnIuc3VjY2VzcyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlczogci5lcnJvcj8uaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2ZW5kb3I6IFwiem9kXCIsXG4gICAgICAgIHZlcnNpb246IDFcbiAgICB9O1xufSk7XG5leHBvcnQgeyBjbG9uZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBbXG4gICAgICAgIC4uLmluc3Q/Ll96b2QuYmFnPy5wYXR0ZXJucyA/PyBbXVxuICAgIF0ucG9wKCkgPz8gcmVnZXhlcy5zdHJpbmcoaW5zdC5fem9kLmJhZyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF8pPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IFN0cmluZyhwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBjaGVjayBpbml0aWFsaXphdGlvbiBtdXN0IGNvbWUgZmlyc3RcbiAgICBjaGVja3MuJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RHVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5ndWlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgaWYgKGRlZi52ZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25NYXAgPSB7XG4gICAgICAgICAgICB2MTogMSxcbiAgICAgICAgICAgIHYyOiAyLFxuICAgICAgICAgICAgdjM6IDMsXG4gICAgICAgICAgICB2NDogNCxcbiAgICAgICAgICAgIHY1OiA1LFxuICAgICAgICAgICAgdjY6IDYsXG4gICAgICAgICAgICB2NzogNyxcbiAgICAgICAgICAgIHY4OiA4XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHYgPSB2ZXJzaW9uTWFwW2RlZi52ZXJzaW9uXTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFVVSUQgdmVyc2lvbjogXCIke2RlZi52ZXJzaW9ufVwiYCk7XG4gICAgICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCh2KSk7XG4gICAgfSBlbHNlIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCgpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW1haWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmVtYWlsKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVHJpbSB3aGl0ZXNwYWNlIGZyb20gaW5wdXRcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwYXlsb2FkLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAoZGVmLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVmLmhvc3RuYW1lLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWYuaG9zdG5hbWUudGVzdCh1cmwuaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIGhvc3RuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiByZWdleGVzLmhvc3RuYW1lLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWYucHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICBkZWYucHJvdG9jb2wubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZi5wcm90b2NvbC50ZXN0KHVybC5wcm90b2NvbC5lbmRzV2l0aChcIjpcIikgPyB1cmwucHJvdG9jb2wuc2xpY2UoMCwgLTEpIDogdXJsLnByb3RvY29sKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW52YWxpZCBwcm90b2NvbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogZGVmLnByb3RvY29sLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCB0aGUgb3V0cHV0IHZhbHVlIGJhc2VkIG9uIG5vcm1hbGl6ZSBmbGFnXG4gICAgICAgICAgICBpZiAoZGVmLm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBub3JtYWxpemVkIFVSTFxuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB1cmwuaHJlZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGlucHV0ICh0cmltbWVkKVxuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB0cmltbWVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFbW9qaSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW1vamlcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmVtb2ppKCkpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5hbm9JRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTmFub0lEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5uYW5vaWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmN1aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENVSUQyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDVUlEMlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY3VpZDIpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVMSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVMSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnVsaWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFhJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kWElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy54aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEtTVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RLU1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMua3N1aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT0RhdGVUaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EYXRlVGltZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZGF0ZXRpbWUoZGVmKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZGF0ZSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPVGltZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPVGltZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudGltZShkZWYpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09EdXJhdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPRHVyYXRpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmR1cmF0aW9uKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJUHY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJUHY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5pcHY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGBpcHY0YDtcbiAgICB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJUHY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJUHY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5pcHY2KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGBpcHY2YDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ldyBVUkwoYGh0dHA6Ly9bJHtwYXlsb2FkLnZhbHVlfV1gKTtcbiAgICAgICAgLy8gcmV0dXJuO1xuICAgICAgICB9IGNhdGNoICB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImlwdjZcIixcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ0lEUnY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDSURSdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmNpZHJ2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ0lEUnY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDSURSdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmNpZHJ2Nik7IC8vIG5vdCB1c2VkIGZvciB2YWxpZGF0aW9uXG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF5bG9hZC52YWx1ZS5zcGxpdChcIi9cIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IFthZGRyZXNzLCBwcmVmaXhdID0gcGFydHM7XG4gICAgICAgICAgICBpZiAoIXByZWZpeCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXhOdW0gPSBOdW1iZXIocHJlZml4KTtcbiAgICAgICAgICAgIGlmIChgJHtwcmVmaXhOdW19YCAhPT0gcHJlZml4KSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGlmIChwcmVmaXhOdW0gPCAwIHx8IHByZWZpeE51bSA+IDEyOCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXcgVVJMKGBodHRwOi8vWyR7YWRkcmVzc31dYCk7XG4gICAgICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiY2lkcnY2XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBab2RCYXNlNjQgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmFzZTY0KGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKGRhdGEubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYXRvYihkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0ICRab2RCYXNlNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJhc2U2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuYmFzZTY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgaW5zdC5fem9kLmJhZy5jb250ZW50RW5jb2RpbmcgPSBcImJhc2U2NFwiO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEJhc2U2NChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFpvZEJhc2U2NCAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjRVUkwoZGF0YSkge1xuICAgIGlmICghcmVnZXhlcy5iYXNlNjR1cmwudGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGJhc2U2NCA9IGRhdGEucmVwbGFjZSgvWy1fXS9nLCAoYyk9PmMgPT09IFwiLVwiID8gXCIrXCIgOiBcIi9cIik7XG4gICAgY29uc3QgcGFkZGVkID0gYmFzZTY0LnBhZEVuZChNYXRoLmNlaWwoYmFzZTY0Lmxlbmd0aCAvIDQpICogNCwgXCI9XCIpO1xuICAgIHJldHVybiBpc1ZhbGlkQmFzZTY0KHBhZGRlZCk7XG59XG5leHBvcnQgY29uc3QgJFpvZEJhc2U2NFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmFzZTY0VVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5iYXNlNjR1cmwpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBpbnN0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZyA9IFwiYmFzZTY0dXJsXCI7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChpc1ZhbGlkQmFzZTY0VVJMKHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImJhc2U2NHVybFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFMTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFMTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5lMTY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgWm9kSldUICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEpXVCh0b2tlbiwgYWxnb3JpdGhtID0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2Vuc1BhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAodG9rZW5zUGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IFtoZWFkZXJdID0gdG9rZW5zUGFydHM7XG4gICAgICAgIGlmICghaGVhZGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgcGFyc2VkSGVhZGVyID0gSlNPTi5wYXJzZShhdG9iKGhlYWRlcikpO1xuICAgICAgICBpZiAoXCJ0eXBcIiBpbiBwYXJzZWRIZWFkZXIgJiYgcGFyc2VkSGVhZGVyPy50eXAgIT09IFwiSldUXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFwYXJzZWRIZWFkZXIuYWxnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhbGdvcml0aG0gJiYgKCEoXCJhbGdcIiBpbiBwYXJzZWRIZWFkZXIpIHx8IHBhcnNlZEhlYWRlci5hbGcgIT09IGFsZ29yaXRobSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0ICRab2RKV1QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEpXVFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEpXVChwYXlsb2FkLnZhbHVlLCBkZWYuYWxnKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJqd3RcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDdXN0b21TdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5mbihwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVtYmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdW1iZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBpbnN0Ll96b2QuYmFnLnBhdHRlcm4gPz8gcmVnZXhlcy5udW1iZXI7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IE51bWJlcihwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNOYU4oaW5wdXQpICYmIE51bWJlci5pc0Zpbml0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkID0gdHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiID8gTnVtYmVyLmlzTmFOKGlucHV0KSA/IFwiTmFOXCIgOiAhTnVtYmVyLmlzRmluaXRlKGlucHV0KSA/IFwiSW5maW5pdHlcIiA6IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJudW1iZXJcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAuLi5yZWNlaXZlZCA/IHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZFxuICAgICAgICAgICAgfSA6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bWJlckZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVtYmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY2hlY2tzLiRab2RDaGVja051bWJlckZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgJFpvZE51bWJlci5pbml0KGluc3QsIGRlZik7IC8vIG5vIGZvcm1hdCBjaGVja3NwXG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQm9vbGVhbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQm9vbGVhblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMuYm9vbGVhbjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gQm9vbGVhbihwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RCaWdJbnQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJpZ0ludFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMuYmlnaW50O1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBCaWdJbnQocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEJpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmlnSW50XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY2hlY2tzLiRab2RDaGVja0JpZ0ludEZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgJFpvZEJpZ0ludC5pbml0KGluc3QsIGRlZik7IC8vIG5vIGZvcm1hdCBjaGVja3Ncbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RTeW1ib2wgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN5bWJvbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN5bWJvbFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJzeW1ib2xcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVW5kZWZpbmVkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVbmRlZmluZWRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLnVuZGVmaW5lZDtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChbXG4gICAgICAgIHVuZGVmaW5lZFxuICAgIF0pO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2Qub3B0b3V0ID0gXCJvcHRpb25hbFwiO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInVuZGVmaW5lZFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdWxsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdWxsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy5udWxsO1xuICAgIGluc3QuX3pvZC52YWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAgICAgbnVsbFxuICAgIF0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibnVsbFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RBbnkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEFueVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCk9PnBheWxvYWQ7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVW5rbm93biA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVW5rbm93blwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCk9PnBheWxvYWQ7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmV2ZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE5ldmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm5ldmVyXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFZvaWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFZvaWRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwidm9pZFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2REYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2REYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IERhdGUocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7fVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgaXNEYXRlID0gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IGlzRGF0ZSAmJiAhTnVtYmVyLmlzTmFOKGlucHV0LmdldFRpbWUoKSk7XG4gICAgICAgIGlmIChpc1ZhbGlkRGF0ZSkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgLi4uaXNEYXRlID8ge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBcIkludmFsaWQgRGF0ZVwiXG4gICAgICAgICAgICB9IDoge30sXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVBcnJheVJlc3VsdChyZXN1bHQsIGZpbmFsLCBpbmRleCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhpbmRleCwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbiAgICBmaW5hbC52YWx1ZVtpbmRleF0gPSByZXN1bHQudmFsdWU7XG59XG5leHBvcnQgY29uc3QgJFpvZEFycmF5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RBcnJheVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBBcnJheShpbnB1dC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGlucHV0W2ldO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmVsZW1lbnQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZUFycmF5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQXJyYXlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkOyAvL2hhbmRsZUFycmF5UmVzdWx0c0FzeW5jKHBhcnNlUmVzdWx0cywgZmluYWwpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5UmVzdWx0KHJlc3VsdCwgZmluYWwsIGtleSwgaW5wdXQpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoa2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgICBmaW5hbC52YWx1ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmluYWwudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVEZWYoZGVmKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRlZi5zaGFwZSk7XG4gICAgZm9yIChjb25zdCBrIG9mIGtleXMpe1xuICAgICAgICBpZiAoIWRlZi5zaGFwZT8uW2tdPy5fem9kPy50cmFpdHM/LmhhcyhcIiRab2RUeXBlXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhdCBrZXkgXCIke2t9XCI6IGV4cGVjdGVkIGEgWm9kIHNjaGVtYWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9rZXlzID0gdXRpbC5vcHRpb25hbEtleXMoZGVmLnNoYXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGtleXMsXG4gICAgICAgIGtleVNldDogbmV3IFNldChrZXlzKSxcbiAgICAgICAgbnVtS2V5czoga2V5cy5sZW5ndGgsXG4gICAgICAgIG9wdGlvbmFsS2V5czogbmV3IFNldChva2V5cylcbiAgICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlQ2F0Y2hhbGwocHJvbXMsIGlucHV0LCBwYXlsb2FkLCBjdHgsIGRlZiwgaW5zdCkge1xuICAgIGNvbnN0IHVucmVjb2duaXplZCA9IFtdO1xuICAgIC8vIGl0ZXJhdGUgb3ZlciBpbnB1dCBrZXlzXG4gICAgY29uc3Qga2V5U2V0ID0gZGVmLmtleVNldDtcbiAgICBjb25zdCBfY2F0Y2hhbGwgPSBkZWYuY2F0Y2hhbGwuX3pvZDtcbiAgICBjb25zdCB0ID0gX2NhdGNoYWxsLmRlZi50eXBlO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGlucHV0KSl7XG4gICAgICAgIGlmIChrZXlTZXQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAodCA9PT0gXCJuZXZlclwiKSB7XG4gICAgICAgICAgICB1bnJlY29nbml6ZWQucHVzaChrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgciA9IF9jYXRjaGFsbC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcHJvbXMucHVzaChyLnRoZW4oKHIpPT5oYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlSZXN1bHQociwgcGF5bG9hZCwga2V5LCBpbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVucmVjb2duaXplZC5sZW5ndGgpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgICAgICAgICBrZXlzOiB1bnJlY29nbml6ZWQsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghcHJvbXMubGVuZ3RoKSByZXR1cm4gcGF5bG9hZDtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PntcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgJFpvZE9iamVjdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT2JqZWN0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gcmVxdWlyZXMgY2FzdCBiZWNhdXNlIHRlY2huaWNhbGx5ICRab2RPYmplY3QgZG9lc24ndCBleHRlbmRcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gY29uc3Qgc2ggPSBkZWYuc2hhcGU7XG4gICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmLCBcInNoYXBlXCIpO1xuICAgIGlmICghZGVzYz8uZ2V0KSB7XG4gICAgICAgIGNvbnN0IHNoID0gZGVmLnNoYXBlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVmLCBcInNoYXBlXCIsIHtcbiAgICAgICAgICAgIGdldDogKCk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTaCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2hcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWYsIFwic2hhcGVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3U2hcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3U2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBfbm9ybWFsaXplZCA9IHV0aWwuY2FjaGVkKCgpPT5ub3JtYWxpemVEZWYoZGVmKSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHNoYXBlID0gZGVmLnNoYXBlO1xuICAgICAgICBjb25zdCBwcm9wVmFsdWVzID0ge307XG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2hhcGUpe1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBzaGFwZVtrZXldLl96b2Q7XG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgcHJvcFZhbHVlc1trZXldID8/IChwcm9wVmFsdWVzW2tleV0gPSBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiBmaWVsZC52YWx1ZXMpcHJvcFZhbHVlc1trZXldLmFkZCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcFZhbHVlcztcbiAgICB9KTtcbiAgICBjb25zdCBpc09iamVjdCA9IHV0aWwuaXNPYmplY3Q7XG4gICAgY29uc3QgY2F0Y2hhbGwgPSBkZWYuY2F0Y2hhbGw7XG4gICAgbGV0IHZhbHVlO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIHZhbHVlID8/ICh2YWx1ZSA9IF9ub3JtYWxpemVkLnZhbHVlKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSB7fTtcbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB2YWx1ZS5zaGFwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdmFsdWUua2V5cyl7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHNoYXBlW2tleV07XG4gICAgICAgICAgICBjb25zdCByID0gZWwuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHIudGhlbigocik9PmhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2F0Y2hhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9tcy5sZW5ndGggPyBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVDYXRjaGFsbChwcm9tcywgaW5wdXQsIHBheWxvYWQsIGN0eCwgX25vcm1hbGl6ZWQudmFsdWUsIGluc3QpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kT2JqZWN0SklUID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RPYmplY3RKSVRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyByZXF1aXJlcyBjYXN0IGJlY2F1c2UgdGVjaG5pY2FsbHkgJFpvZE9iamVjdCBkb2Vzbid0IGV4dGVuZFxuICAgICRab2RPYmplY3QuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHN1cGVyUGFyc2UgPSBpbnN0Ll96b2QucGFyc2U7XG4gICAgY29uc3QgX25vcm1hbGl6ZWQgPSB1dGlsLmNhY2hlZCgoKT0+bm9ybWFsaXplRGVmKGRlZikpO1xuICAgIGNvbnN0IGdlbmVyYXRlRmFzdHBhc3MgPSAoc2hhcGUpPT57XG4gICAgICAgIGNvbnN0IGRvYyA9IG5ldyBEb2MoW1xuICAgICAgICAgICAgXCJzaGFwZVwiLFxuICAgICAgICAgICAgXCJwYXlsb2FkXCIsXG4gICAgICAgICAgICBcImN0eFwiXG4gICAgICAgIF0pO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gX25vcm1hbGl6ZWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlU3RyID0gKGtleSk9PntcbiAgICAgICAgICAgIGNvbnN0IGsgPSB1dGlsLmVzYyhrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIGBzaGFwZVske2t9XS5fem9kLnJ1bih7IHZhbHVlOiBpbnB1dFske2t9XSwgaXNzdWVzOiBbXSB9LCBjdHgpYDtcbiAgICAgICAgfTtcbiAgICAgICAgZG9jLndyaXRlKGBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7YCk7XG4gICAgICAgIGNvbnN0IGlkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygbm9ybWFsaXplZC5rZXlzKXtcbiAgICAgICAgICAgIGlkc1trZXldID0gYGtleV8ke2NvdW50ZXIrK31gO1xuICAgICAgICB9XG4gICAgICAgIC8vIEE6IHByZXNlcnZlIGtleSBvcmRlciB7XG4gICAgICAgIGRvYy53cml0ZShgY29uc3QgbmV3UmVzdWx0ID0ge307YCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbGl6ZWQua2V5cyl7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGlkc1trZXldO1xuICAgICAgICAgICAgY29uc3QgayA9IHV0aWwuZXNjKGtleSk7XG4gICAgICAgICAgICBkb2Mud3JpdGUoYGNvbnN0ICR7aWR9ID0gJHtwYXJzZVN0cihrZXkpfTtgKTtcbiAgICAgICAgICAgIGRvYy53cml0ZShgXG4gICAgICAgIGlmICgke2lkfS5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtpZH0uaXNzdWVzLm1hcChpc3MgPT4gKHtcbiAgICAgICAgICAgIC4uLmlzcyxcbiAgICAgICAgICAgIHBhdGg6IGlzcy5wYXRoID8gWyR7a30sIC4uLmlzcy5wYXRoXSA6IFske2t9XVxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICBpZiAoJHtpZH0udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgke2t9IGluIGlucHV0KSB7XG4gICAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1Jlc3VsdFske2t9XSA9ICR7aWR9LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgYCk7XG4gICAgICAgIH1cbiAgICAgICAgZG9jLndyaXRlKGBwYXlsb2FkLnZhbHVlID0gbmV3UmVzdWx0O2ApO1xuICAgICAgICBkb2Mud3JpdGUoYHJldHVybiBwYXlsb2FkO2ApO1xuICAgICAgICBjb25zdCBmbiA9IGRvYy5jb21waWxlKCk7XG4gICAgICAgIHJldHVybiAocGF5bG9hZCwgY3R4KT0+Zm4oc2hhcGUsIHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbiAgICBsZXQgZmFzdHBhc3M7XG4gICAgY29uc3QgaXNPYmplY3QgPSB1dGlsLmlzT2JqZWN0O1xuICAgIGNvbnN0IGppdCA9ICFjb3JlLmdsb2JhbENvbmZpZy5qaXRsZXNzO1xuICAgIGNvbnN0IGFsbG93c0V2YWwgPSB1dGlsLmFsbG93c0V2YWw7XG4gICAgY29uc3QgZmFzdEVuYWJsZWQgPSBqaXQgJiYgYWxsb3dzRXZhbC52YWx1ZTsgLy8gJiYgIWRlZi5jYXRjaGFsbDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGppdCAmJiBmYXN0RW5hYmxlZCAmJiBjdHg/LmFzeW5jID09PSBmYWxzZSAmJiBjdHguaml0bGVzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gYWx3YXlzIHN5bmNocm9ub3VzXG4gICAgICAgICAgICBpZiAoIWZhc3RwYXNzKSBmYXN0cGFzcyA9IGdlbmVyYXRlRmFzdHBhc3MoZGVmLnNoYXBlKTtcbiAgICAgICAgICAgIHBheWxvYWQgPSBmYXN0cGFzcyhwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKCFjYXRjaGFsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwoW10sIGlucHV0LCBwYXlsb2FkLCBjdHgsIHZhbHVlLCBpbnN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXJQYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBmaW5hbCwgaW5zdCwgY3R4KSB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cyl7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZmluYWwudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9uYWJvcnRlZCA9IHJlc3VsdHMuZmlsdGVyKChyKT0+IXV0aWwuYWJvcnRlZChyKSk7XG4gICAgaWYgKG5vbmFib3J0ZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbmFsLnZhbHVlID0gbm9uYWJvcnRlZFswXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5vbmFib3J0ZWRbMF07XG4gICAgfVxuICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgIGlucHV0OiBmaW5hbC52YWx1ZSxcbiAgICAgICAgaW5zdCxcbiAgICAgICAgZXJyb3JzOiByZXN1bHRzLm1hcCgocmVzdWx0KT0+cmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5vcHRpb25zLnNvbWUoKG8pPT5vLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgPyBcIm9wdGlvbmFsXCIgOiB1bmRlZmluZWQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3B0aW9ucy5zb21lKChvKT0+by5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiKSA/IFwib3B0aW9uYWxcIiA6IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgaWYgKGRlZi5vcHRpb25zLmV2ZXJ5KChvKT0+by5fem9kLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KGRlZi5vcHRpb25zLmZsYXRNYXAoKG9wdGlvbik9PkFycmF5LmZyb20ob3B0aW9uLl96b2QudmFsdWVzKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGlmIChkZWYub3B0aW9ucy5ldmVyeSgobyk9Pm8uX3pvZC5wYXR0ZXJuKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBkZWYub3B0aW9ucy5tYXAoKG8pPT5vLl96b2QucGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXigke3BhdHRlcm5zLm1hcCgocCk9PnV0aWwuY2xlYW5SZWdleChwLnNvdXJjZSkpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGUgPSBkZWYub3B0aW9ucy5sZW5ndGggPT09IDE7XG4gICAgY29uc3QgZmlyc3QgPSBkZWYub3B0aW9uc1swXS5fem9kLnJ1bjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3QocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYXN5bmMpIHJldHVybiBoYW5kbGVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlVW5pb25SZXN1bHRzKHJlc3VsdHMsIHBheWxvYWQsIGluc3QsIGN0eCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGlzY3JpbWluYXRlZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2REaXNjcmltaW5hdGVkVW5pb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IF9zdXBlciA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3QgcHJvcFZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCBwdiA9IG9wdGlvbi5fem9kLnByb3BWYWx1ZXM7XG4gICAgICAgICAgICBpZiAoIXB2IHx8IE9iamVjdC5rZXlzKHB2KS5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkaXNjcmltaW5hdGVkIHVuaW9uIG9wdGlvbiBhdCBpbmRleCBcIiR7ZGVmLm9wdGlvbnMuaW5kZXhPZihvcHRpb24pfVwiYCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwdikpe1xuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlc1trXSkgcHJvcFZhbHVlc1trXSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2KXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlc1trXS5hZGQodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZXM7XG4gICAgfSk7XG4gICAgY29uc3QgZGlzYyA9IHV0aWwuY2FjaGVkKCgpPT57XG4gICAgICAgIGNvbnN0IG9wdHMgPSBkZWYub3B0aW9ucztcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG8gb2Ygb3B0cyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvLl96b2QucHJvcFZhbHVlcz8uW2RlZi5kaXNjcmltaW5hdG9yXTtcbiAgICAgICAgICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggXCIke2RlZi5vcHRpb25zLmluZGV4T2Yobyl9XCJgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgXCIke1N0cmluZyh2KX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXAuc2V0KHYsIG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gZGlzYy52YWx1ZS5nZXQoaW5wdXQ/LltkZWYuZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi51bmlvbkZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF91bmlvblwiLFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIG5vdGU6IFwiTm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclwiLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcjogZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICBkZWYuZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSW50ZXJzZWN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmxlZnQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBjb25zdCByaWdodCA9IGRlZi5yaWdodC5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGNvbnN0IGFzeW5jID0gbGVmdCBpbnN0YW5jZW9mIFByb21pc2UgfHwgcmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIC8vIGNvbnN0IGFUeXBlID0gcGFyc2UudChhKTtcbiAgICAvLyBjb25zdCBiVHlwZSA9IHBhcnNlLnQoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUgJiYgK2EgPT09ICtiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaXNQbGFpbk9iamVjdChhKSAmJiB1dGlsLmlzUGxhaW5PYmplY3QoYikpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoa2V5KT0+YktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcbiAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAuLi5iXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpe1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXJnZUVycm9yUGF0aDogW1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogbmV3T2JqXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IG5ld0FycmF5XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUludGVyc2VjdGlvblJlc3VsdHMocmVzdWx0LCBsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKC4uLmxlZnQuaXNzdWVzKTtcbiAgICB9XG4gICAgaWYgKHJpZ2h0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKC4uLnJpZ2h0Lmlzc3Vlcyk7XG4gICAgfVxuICAgIGlmICh1dGlsLmFib3J0ZWQocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhsZWZ0LnZhbHVlLCByaWdodC52YWx1ZSk7XG4gICAgaWYgKCFtZXJnZWQudmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbm1lcmdhYmxlIGludGVyc2VjdGlvbi4gRXJyb3IgcGF0aDogYCArIGAke0pTT04uc3RyaW5naWZ5KG1lcmdlZC5tZXJnZUVycm9yUGF0aCl9YCk7XG4gICAgfVxuICAgIHJlc3VsdC52YWx1ZSA9IG1lcmdlZC5kYXRhO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFR1cGxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUdXBsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBpdGVtcyA9IGRlZi5pdGVtcztcbiAgICBjb25zdCBvcHRTdGFydCA9IGl0ZW1zLmxlbmd0aCAtIFtcbiAgICAgICAgLi4uaXRlbXNcbiAgICBdLnJldmVyc2UoKS5maW5kSW5kZXgoKGl0ZW0pPT5pdGVtLl96b2Qub3B0aW4gIT09IFwib3B0aW9uYWxcIik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInR1cGxlXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gW107XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGlmICghZGVmLnJlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGlucHV0Lmxlbmd0aCA+IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQubGVuZ3RoIDwgb3B0U3RhcnQgLSAxO1xuICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGl0ZW1zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGl0ZW1zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IC0xO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpe1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaWYgKGkgPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gb3B0U3RhcnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlbS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2ldLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnJlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBpbnB1dC5zbGljZShpdGVtcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiByZXN0KXtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnJlc3QuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWwsXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIGZpbmFsLCBpbmRleCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhpbmRleCwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbiAgICBmaW5hbC52YWx1ZVtpbmRleF0gPSByZXN1bHQudmFsdWU7XG59XG5leHBvcnQgY29uc3QgJFpvZFJlY29yZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUmVjb3JkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCF1dGlsLmlzUGxhaW5PYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJyZWNvcmRcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgaWYgKGRlZi5rZXlUeXBlLl96b2QudmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBkZWYua2V5VHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHZhbHVlcyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdW5yZWNvZ25pemVkO1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBpbnB1dCl7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkID0gdW5yZWNvZ25pemVkID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICB1bnJlY29nbml6ZWQucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnJlY29nbml6ZWQgJiYgdW5yZWNvZ25pemVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAga2V5czogdW5yZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoaW5wdXQpKXtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlSZXN1bHQgPSBkZWYua2V5VHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXlSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9rZXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogXCJyZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlczoga2V5UmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleVJlc3VsdC52YWx1ZV0gPSBrZXlSZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleVJlc3VsdC52YWx1ZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXlSZXN1bHQudmFsdWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTWFwID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RNYXBcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm1hcFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpbnB1dCl7XG4gICAgICAgICAgICBjb25zdCBrZXlSZXN1bHQgPSBkZWYua2V5VHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVSZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChrZXlSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHZhbHVlUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2goUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBrZXlSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUmVzdWx0XG4gICAgICAgICAgICAgICAgXSkudGhlbigoW2tleVJlc3VsdCwgdmFsdWVSZXN1bHRdKT0+e1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgcGF5bG9hZCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1hcFJlc3VsdChrZXlSZXN1bHQsIHZhbHVlUmVzdWx0LCBwYXlsb2FkLCBrZXksIGlucHV0LCBpbnN0LCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU1hcFJlc3VsdChrZXlSZXN1bHQsIHZhbHVlUmVzdWx0LCBmaW5hbCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KSB7XG4gICAgaWYgKGtleVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh1dGlsLnByb3BlcnR5S2V5VHlwZXMuaGFzKHR5cGVvZiBrZXkpKSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIGtleVJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfa2V5XCIsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm1hcFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBrZXlSZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh1dGlsLnByb3BlcnR5S2V5VHlwZXMuaGFzKHR5cGVvZiBrZXkpKSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHZhbHVlUmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgaXNzdWVzOiB2YWx1ZVJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluYWwudmFsdWUuc2V0KGtleVJlc3VsdC52YWx1ZSwgdmFsdWVSZXN1bHQudmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RTZXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFNldFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJzZXRcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBwYXlsb2FkKSkpO1xuICAgICAgICAgICAgfSBlbHNlIGhhbmRsZVNldFJlc3VsdChyZXN1bHQsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVNldFJlc3VsdChyZXN1bHQsIGZpbmFsKSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5pc3N1ZXMpO1xuICAgIH1cbiAgICBmaW5hbC52YWx1ZS5hZGQocmVzdWx0LnZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kRW51bSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW51bVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEVudW1WYWx1ZXMoZGVmLmVudHJpZXMpO1xuICAgIGNvbnN0IHZhbHVlc1NldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gdmFsdWVzU2V0O1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXigke3ZhbHVlcy5maWx0ZXIoKGspPT51dGlsLnByb3BlcnR5S2V5VHlwZXMuaGFzKHR5cGVvZiBrKSkubWFwKChvKT0+dHlwZW9mIG8gPT09IFwic3RyaW5nXCIgPyB1dGlsLmVzY2FwZVJlZ2V4KG8pIDogby50b1N0cmluZygpKS5qb2luKFwifFwiKX0pJGApO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZXNTZXQuaGFzKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGlmIChkZWYudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGxpdGVyYWwgc2NoZW1hIHdpdGggbm8gdmFsaWQgdmFsdWVzXCIpO1xuICAgIH1cbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4oJHtkZWYudmFsdWVzLm1hcCgobyk9PnR5cGVvZiBvID09PSBcInN0cmluZ1wiID8gdXRpbC5lc2NhcGVSZWdleChvKSA6IG8gPyB1dGlsLmVzY2FwZVJlZ2V4KG8udG9TdHJpbmcoKSkgOiBTdHJpbmcobykpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKGluc3QuX3pvZC52YWx1ZXMuaGFzKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgIHZhbHVlczogZGVmLnZhbHVlcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RGaWxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RGaWxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiZmlsZVwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RUcmFuc2Zvcm0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFRyYW5zZm9ybVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kRW5jb2RlRXJyb3IoaW5zdC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfb3V0ID0gZGVmLnRyYW5zZm9ybShwYXlsb2FkLnZhbHVlLCBwYXlsb2FkKTtcbiAgICAgICAgaWYgKGN0eC5hc3luYykge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gX291dCBpbnN0YW5jZW9mIFByb21pc2UgPyBfb3V0IDogUHJvbWlzZS5yZXNvbHZlKF9vdXQpO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC50aGVuKChvdXRwdXQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfb3V0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gX291dDtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCAmJiBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0ICRab2RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9wdGluID0gXCJvcHRpb25hbFwiO1xuICAgIGluc3QuX3pvZC5vcHRvdXQgPSBcIm9wdGlvbmFsXCI7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMgPyBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMsXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgXSkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBkZWYuaW5uZXJUeXBlLl96b2QucGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUmVnRXhwKGBeKCR7dXRpbC5jbGVhblJlZ2V4KHBhdHRlcm4uc291cmNlKX0pPyRgKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmlubmVyVHlwZS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gcmVzdWx0LnRoZW4oKHIpPT5oYW5kbGVPcHRpb25hbFJlc3VsdChyLCBwYXlsb2FkLnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVsbGFibGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bGxhYmxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+e1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gZGVmLmlubmVyVHlwZS5fem9kLnBhdHRlcm47XG4gICAgICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFJlZ0V4cChgXigke3V0aWwuY2xlYW5SZWdleChwYXR0ZXJuLnNvdXJjZSl9fG51bGwpJGApIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzID8gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICBdKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYWxsb3cgbnVsbCB0byBwYXNzIHRocm91Z2hcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IG51bGwpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRGVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBpbnN0Ll96b2QucWluID0gXCJ0cnVlXCI7XG4gICAgaW5zdC5fem9kLm9wdGluID0gXCJvcHRpb25hbFwiO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhcHBseSBkZWZhdWx0cyBmb3IgdW5kZWZpbmVkIGlucHV0XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAkWm9kRGVmYXVsdCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGltbWVkaWF0ZWx5IGluIGZvcndhcmQgZGlyZWN0aW9uLlxuICAgICAgICAgICAgICogSXQgZG9lc24ndCBwYXNzIHRoZSBkZWZhdWx0IHZhbHVlIGludG8gdGhlIHZhbGlkYXRvciAoXCJwcmVmYXVsdFwiKS4gVGhlcmUncyBubyByZWFzb24gdG8gcGFzcyB0aGUgZGVmYXVsdCB2YWx1ZSB0aHJvdWdoIHZhbGlkYXRpb24uIFRoZSB2YWxpZGl0eSBvZiB0aGUgZGVmYXVsdCBpcyBlbmZvcmNlZCBieSBUeXBlU2NyaXB0IHN0YXRpY2FsbHkuIE90aGVyd2lzZSwgaXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIgdG8gZW5zdXJlIHRoZSBkZWZhdWx0IGlzIHZhbGlkLiBJbiB0aGUgY2FzZSBvZiBwaXBlcyB3aXRoIGRpdmVyZ2VudCBpbi9vdXQgdHlwZXMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgZGVmYXVsdCBvbiB0aGUgYGluYCBzY2hlbWEgb2YgeW91ciBab2RQaXBlIHRvIHNldCBhIFwicHJlZmF1bHRcIiBmb3IgdGhlIHBpcGUuICAgKi8gcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb246IGNvbnRpbnVlIHdpdGggZGVmYXVsdCBoYW5kbGluZ1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZURlZmF1bHRSZXN1bHQocmVzdWx0LCBkZWYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlRGVmYXVsdFJlc3VsdChyZXN1bHQsIGRlZik7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlRGVmYXVsdFJlc3VsdChwYXlsb2FkLCBkZWYpIHtcbiAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kUHJlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFByZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYXBwbHkgcHJlZmF1bHQgZm9yIHVuZGVmaW5lZCBpbnB1dFxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTm9uT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE5vbk9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHYgPSBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzO1xuICAgICAgICByZXR1cm4gdiA/IG5ldyBTZXQoW1xuICAgICAgICAgICAgLi4udlxuICAgICAgICBdLmZpbHRlcigoeCk9PnggIT09IHVuZGVmaW5lZCkpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlTm9uT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBpbnN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5zdCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlTm9uT3B0aW9uYWxSZXN1bHQocGF5bG9hZCwgaW5zdCkge1xuICAgIGlmICghcGF5bG9hZC5pc3N1ZXMubGVuZ3RoICYmIHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBleHBlY3RlZDogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kU3VjY2VzcyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kU3VjY2Vzc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kRW5jb2RlRXJyb3IoXCJab2RTdWNjZXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDYXRjaCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2F0Y2hcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdG91dCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFwcGx5IGNhdGNoIGxvZ2ljXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogcmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmFOID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROYU5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzTmFOKHBheWxvYWQudmFsdWUpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm5hblwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RQaXBlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQaXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW4uX3pvZC52YWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbi5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLm91dC5fem9kLm9wdG91dCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5kZWYuaW4uX3pvZC5wcm9wVmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IGRlZi5vdXQuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyaWdodCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQudGhlbigocmlnaHQpPT5oYW5kbGVQaXBlUmVzdWx0KHJpZ2h0LCBkZWYuaW4sIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBpcGVSZXN1bHQocmlnaHQsIGRlZi5pbiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmluLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGxlZnQudGhlbigobGVmdCk9PmhhbmRsZVBpcGVSZXN1bHQobGVmdCwgZGVmLm91dCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZVBpcGVSZXN1bHQobGVmdCwgZGVmLm91dCwgY3R4KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVQaXBlUmVzdWx0KGxlZnQsIG5leHQsIGN0eCkge1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gcHJldmVudCBmdXJ0aGVyIGNoZWNrc1xuICAgICAgICBsZWZ0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQuX3pvZC5ydW4oe1xuICAgICAgICB2YWx1ZTogbGVmdC52YWx1ZSxcbiAgICAgICAgaXNzdWVzOiBsZWZ0Lmlzc3Vlc1xuICAgIH0sIGN0eCk7XG59XG5leHBvcnQgY29uc3QgJFpvZENvZGVjID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDb2RlY1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW4uX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5vdXQuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QucHJvcFZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gY3R4LmRpcmVjdGlvbiB8fCBcImZvcndhcmRcIjtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJmb3J3YXJkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBkZWYuaW4uX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0LnRoZW4oKGxlZnQpPT5oYW5kbGVDb2RlY0FSZXN1bHQobGVmdCwgZGVmLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDb2RlY0FSZXN1bHQobGVmdCwgZGVmLCBjdHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBkZWYub3V0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LnRoZW4oKHJpZ2h0KT0+aGFuZGxlQ29kZWNBUmVzdWx0KHJpZ2h0LCBkZWYsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjQVJlc3VsdChyaWdodCwgZGVmLCBjdHgpO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlQ29kZWNBUmVzdWx0KHJlc3VsdCwgZGVmLCBjdHgpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gcHJldmVudCBmdXJ0aGVyIGNoZWNrc1xuICAgICAgICByZXN1bHQuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGN0eC5kaXJlY3Rpb24gfHwgXCJmb3J3YXJkXCI7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJmb3J3YXJkXCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBkZWYudHJhbnNmb3JtKHJlc3VsdC52YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkLnRoZW4oKHZhbHVlKT0+aGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHZhbHVlLCBkZWYub3V0LCBjdHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHRyYW5zZm9ybWVkLCBkZWYub3V0LCBjdHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gZGVmLnJldmVyc2VUcmFuc2Zvcm0ocmVzdWx0LnZhbHVlLCByZXN1bHQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQudGhlbigodmFsdWUpPT5oYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdmFsdWUsIGRlZi5pbiwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB0cmFuc2Zvcm1lZCwgZGVmLmluLCBjdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUNvZGVjVHhSZXN1bHQobGVmdCwgdmFsdWUsIG5leHRTY2hlbWEsIGN0eCkge1xuICAgIC8vIENoZWNrIGlmIHRyYW5zZm9ybSBhZGRlZCBhbnkgaXNzdWVzXG4gICAgaWYgKGxlZnQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBsZWZ0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRTY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXNzdWVzOiBsZWZ0Lmlzc3Vlc1xuICAgIH0sIGN0eCk7XG59XG5leHBvcnQgY29uc3QgJFpvZFJlYWRvbmx5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RSZWFkb25seVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdG91dCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oaGFuZGxlUmVhZG9ubHlSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVSZWFkb25seVJlc3VsdChyZXN1bHQpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVJlYWRvbmx5UmVzdWx0KHBheWxvYWQpIHtcbiAgICBwYXlsb2FkLnZhbHVlID0gT2JqZWN0LmZyZWV6ZShwYXlsb2FkLnZhbHVlKTtcbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVGVtcGxhdGVMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUZW1wbGF0ZUxpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcmVnZXhQYXJ0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBkZWYucGFydHMpe1xuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgcGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaXMgWm9kIHNjaGVtYVxuICAgICAgICAgICAgaWYgKCFwYXJ0Ll96b2QucGF0dGVybikge1xuICAgICAgICAgICAgICAgIC8vIGlmICghc291cmNlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQsIG5vIHBhdHRlcm4gZm91bmQ6ICR7W1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXJ0Ll96b2QudHJhaXRzXG4gICAgICAgICAgICAgICAgXS5zaGlmdCgpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gcGFydC5fem9kLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHAgPyBwYXJ0Ll96b2QucGF0dGVybi5zb3VyY2UgOiBwYXJ0Ll96b2QucGF0dGVybjtcbiAgICAgICAgICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0OiAke3BhcnQuX3pvZC50cmFpdHN9YCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHNvdXJjZS5zdGFydHNXaXRoKFwiXlwiKSA/IDEgOiAwO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc291cmNlLmVuZHNXaXRoKFwiJFwiKSA/IHNvdXJjZS5sZW5ndGggLSAxIDogc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJlZ2V4UGFydHMucHVzaChzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09IG51bGwgfHwgdXRpbC5wcmltaXRpdmVUeXBlcy5oYXModHlwZW9mIHBhcnQpKSB7XG4gICAgICAgICAgICByZWdleFBhcnRzLnB1c2godXRpbC5lc2NhcGVSZWdleChgJHtwYXJ0fWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7cGFydH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4UGFydHMuam9pbihcIlwiKX0kYCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBpbnN0Ll96b2QucGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoIWluc3QuX3pvZC5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCA/PyBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBpbnN0Ll96b2QucGF0dGVybi5zb3VyY2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RGdW5jdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRnVuY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fZGVmID0gZGVmO1xuICAgIGluc3QuX3pvZC5kZWYgPSBkZWY7XG4gICAgaW5zdC5pbXBsZW1lbnQgPSAoZnVuYyk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltcGxlbWVudCgpIG11c3QgYmUgY2FsbGVkIHdpdGggYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IGluc3QuX2RlZi5pbnB1dCA/IHBhcnNlKGluc3QuX2RlZi5pbnB1dCwgYXJncykgOiBhcmdzO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmdW5jLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIGlmIChpbnN0Ll9kZWYub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlKGluc3QuX2RlZi5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgaW5zdC5pbXBsZW1lbnRBc3luYyA9IChmdW5jKT0+e1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1wbGVtZW50QXN5bmMoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBpbnN0Ll9kZWYuaW5wdXQgPyBhd2FpdCBwYXJzZUFzeW5jKGluc3QuX2RlZi5pbnB1dCwgYXJncykgOiBhcmdzO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmdW5jLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIGlmIChpbnN0Ll9kZWYub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHBhcnNlQXN5bmMoaW5zdC5fZGVmLm91dHB1dCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIG91dHB1dCBpcyBhIHByb21pc2UgdHlwZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHVzZSBhc3luYyBpbXBsZW1lbnRhdGlvblxuICAgICAgICBjb25zdCBoYXNQcm9taXNlT3V0cHV0ID0gaW5zdC5fZGVmLm91dHB1dCAmJiBpbnN0Ll9kZWYub3V0cHV0Ll96b2QuZGVmLnR5cGUgPT09IFwicHJvbWlzZVwiO1xuICAgICAgICBpZiAoaGFzUHJvbWlzZU91dHB1dCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGluc3QuaW1wbGVtZW50QXN5bmMocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gaW5zdC5pbXBsZW1lbnQocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbiAgICBpbnN0LmlucHV0ID0gKC4uLmFyZ3MpPT57XG4gICAgICAgIGNvbnN0IEYgPSBpbnN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IG5ldyAkWm9kVHVwbGUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInR1cGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBhcmdzWzBdLFxuICAgICAgICAgICAgICAgICAgICByZXN0OiBhcmdzWzFdXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBpbnN0Ll9kZWYub3V0cHV0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEYoe1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgaW5wdXQ6IGFyZ3NbMF0sXG4gICAgICAgICAgICBvdXRwdXQ6IGluc3QuX2RlZi5vdXRwdXRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbnN0Lm91dHB1dCA9IChvdXRwdXQpPT57XG4gICAgICAgIGNvbnN0IEYgPSBpbnN0LmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IEYoe1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgaW5wdXQ6IGluc3QuX2RlZi5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBpbnN0O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFByb21pc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFByb21pc2VcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYXlsb2FkLnZhbHVlKS50aGVuKChpbm5lcik9PmRlZi5pbm5lclR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpbm5lcixcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpKTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZExhenkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZExhenlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gbGV0IF9pbm5lclR5cGUhOiBhbnk7XG4gICAgLy8gdXRpbC5kZWZpbmVMYXp5KGRlZiwgXCJnZXR0ZXJcIiwgKCkgPT4ge1xuICAgIC8vICAgaWYgKCFfaW5uZXJUeXBlKSB7XG4gICAgLy8gICAgIF9pbm5lclR5cGUgPSBkZWYuZ2V0dGVyKCk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gKCkgPT4gX2lubmVyVHlwZTtcbiAgICAvLyB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcImlubmVyVHlwZVwiLCAoKT0+ZGVmLmdldHRlcigpKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlLl96b2Qub3B0aW4gPz8gdW5kZWZpbmVkKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+aW5zdC5fem9kLmlubmVyVHlwZS5fem9kLm9wdG91dCA/PyB1bmRlZmluZWQpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlubmVyID0gaW5zdC5fem9kLmlubmVyVHlwZTtcbiAgICAgICAgcmV0dXJuIGlubmVyLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b20gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgXyk9PntcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCByID0gZGVmLmZuKGlucHV0KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gci50aGVuKChyKT0+aGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVJlZmluZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGlucHV0LCBpbnN0KSB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgY29uc3QgX2lzcyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5wYXRoID8/IFtdXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY29udGludWU6ICFpbnN0Ll96b2QuZGVmLmFib3J0XG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbnN0Ll96b2QuZGVmLnBhcmFtcykgX2lzcy5wYXJhbXMgPSBpbnN0Ll96b2QuZGVmLnBhcmFtcztcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3MpKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0ICRvdXRwdXQgPSBTeW1ib2woXCJab2RPdXRwdXRcIik7XG5leHBvcnQgY29uc3QgJGlucHV0ID0gU3ltYm9sKFwiWm9kSW5wdXRcIik7XG5leHBvcnQgY2xhc3MgJFpvZFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLl9pZG1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgYWRkKHNjaGVtYSwgLi4uX21ldGEpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IF9tZXRhWzBdO1xuICAgICAgICB0aGlzLl9tYXAuc2V0KHNjaGVtYSwgbWV0YSk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiBtZXRhKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faWRtYXAuaGFzKG1ldGEuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJRCAke21ldGEuaWR9IGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWdpc3RyeWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5faWRtYXAuc2V0KG1ldGEuaWQsIHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLl9pZG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlbW92ZShzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX21hcC5nZXQoc2NoZW1hKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIG1ldGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2lkbWFwLmRlbGV0ZShtZXRhLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKHNjaGVtYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXQoc2NoZW1hKSB7XG4gICAgICAgIC8vIHJldHVybiB0aGlzLl9tYXAuZ2V0KHNjaGVtYSkgYXMgYW55O1xuICAgICAgICAvLyBpbmhlcml0IG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IHAgPSBzY2hlbWEuX3pvZC5wYXJlbnQ7XG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICBjb25zdCBwbSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldChwKSA/PyB7fVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlbGV0ZSBwbS5pZDsgLy8gZG8gbm90IGluaGVyaXQgaWRcbiAgICAgICAgICAgIGNvbnN0IGYgPSB7XG4gICAgICAgICAgICAgICAgLi4ucG0sXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fbWFwLmdldChzY2hlbWEpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGYpLmxlbmd0aCA/IGYgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoc2NoZW1hKTtcbiAgICB9XG4gICAgaGFzKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhzY2hlbWEpO1xuICAgIH1cbn1cbi8vIHJlZ2lzdHJpZXNcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gbmV3ICRab2RSZWdpc3RyeSgpO1xufVxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gLypAX19QVVJFX18qLyByZWdpc3RyeSgpO1xuIiwgImltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIHNjaGVtYXMgZnJvbSBcIi4vc2NoZW1hcy5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gX3N0cmluZyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZFN0cmluZyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lbWFpbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJlbWFpbFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9ndWlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImd1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3V1aWR2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICB2ZXJzaW9uOiBcInY0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZHY2KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInV1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIHZlcnNpb246IFwidjZcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjcoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VybChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1cmxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZW1vamkoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZW1vamlcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmFub2lkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcIm5hbm9pZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jdWlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImN1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY3VpZDIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiY3VpZDJcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdWxpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1bGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3hpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ4aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfa3N1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwia3N1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXB2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJpcHY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2lwdjYoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiaXB2NlwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jaWRydjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiY2lkcnY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYmFzZTY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImJhc2U2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9iYXNlNjR1cmwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2UxNjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZTE2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9qd3QoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiand0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgVGltZVByZWNpc2lvbiA9IHtcbiAgICBBbnk6IG51bGwsXG4gICAgTWludXRlOiAtMSxcbiAgICBTZWNvbmQ6IDAsXG4gICAgTWlsbGlzZWNvbmQ6IDMsXG4gICAgTWljcm9zZWNvbmQ6IDZcbn07XG5leHBvcnQgZnVuY3Rpb24gX2lzb0RhdGVUaW1lKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImRhdGV0aW1lXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgbG9jYWw6IGZhbHNlLFxuICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pc29UaW1lKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInRpbWVcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRHVyYXRpb24oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZHVyYXRpb25cIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX251bWJlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZE51bWJlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcInNhZmVpbnRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9mbG9hdDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJmbG9hdDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZmxvYXQ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiZmxvYXQ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2ludDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJpbnQzMlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VpbnQzMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwidWludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYm9vbGVhbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWRCb29sZWFuKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9iaWdpbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWRCaWdpbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW50NjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICBjaGVjazogXCJiaWdpbnRfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImludDY0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdWludDY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY2hlY2s6IFwiYmlnaW50X2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJ1aW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zeW1ib2woQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN5bWJvbFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VuZGVmaW5lZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidW5kZWZpbmVkXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbnVsbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVsbFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2FueShDbGFzcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImFueVwiXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3Vua25vd24oQ2xhc3MpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmtub3duXCJcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmV2ZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm5ldmVyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdm9pZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidm9pZFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2RhdGUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmFuKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJuYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9sdCh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTGVzc1RoYW4oe1xuICAgICAgICBjaGVjazogXCJsZXNzX3RoYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogZmFsc2VcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbHRlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmx0ZSgpYCBpbnN0ZWFkLiAqLyBfbHRlIGFzIF9tYXggfTtcbmV4cG9ydCBmdW5jdGlvbiBfZ3QodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0dyZWF0ZXJUaGFuKHtcbiAgICAgICAgY2hlY2s6IFwiZ3JlYXRlcl90aGFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2d0ZSh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrR3JlYXRlclRoYW4oe1xuICAgICAgICBjaGVjazogXCJncmVhdGVyX3RoYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgLyoqIEBkZXByZWNhdGVkIFVzZSBgei5ndGUoKWAgaW5zdGVhZC4gKi8gX2d0ZSBhcyBfbWluIH07XG5leHBvcnQgZnVuY3Rpb24gX3Bvc2l0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfZ3QoMCwgcGFyYW1zKTtcbn1cbi8vIG5lZ2F0aXZlXG5leHBvcnQgZnVuY3Rpb24gX25lZ2F0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfbHQoMCwgcGFyYW1zKTtcbn1cbi8vIG5vbnBvc2l0aXZlXG5leHBvcnQgZnVuY3Rpb24gX25vbnBvc2l0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfbHRlKDAsIHBhcmFtcyk7XG59XG4vLyBub25uZWdhdGl2ZVxuZXhwb3J0IGZ1bmN0aW9uIF9ub25uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2d0ZSgwLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNdWx0aXBsZU9mKHtcbiAgICAgICAgY2hlY2s6IFwibXVsdGlwbGVfb2ZcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWF4U2l6ZShtYXhpbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNYXhTaXplKHtcbiAgICAgICAgY2hlY2s6IFwibWF4X3NpemVcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWF4aW11bVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9taW5TaXplKG1pbmltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pblNpemUoe1xuICAgICAgICBjaGVjazogXCJtaW5fc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtaW5pbXVtXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3NpemUoc2l6ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrU2l6ZUVxdWFscyh7XG4gICAgICAgIGNoZWNrOiBcInNpemVfZXF1YWxzXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHNpemVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWF4TGVuZ3RoKG1heGltdW0sIHBhcmFtcykge1xuICAgIGNvbnN0IGNoID0gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNYXhMZW5ndGgoe1xuICAgICAgICBjaGVjazogXCJtYXhfbGVuZ3RoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1heGltdW1cbiAgICB9KTtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gX21pbkxlbmd0aChtaW5pbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNaW5MZW5ndGgoe1xuICAgICAgICBjaGVjazogXCJtaW5fbGVuZ3RoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1pbmltdW1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbGVuZ3RoKGxlbmd0aCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTGVuZ3RoRXF1YWxzKHtcbiAgICAgICAgY2hlY2s6IFwibGVuZ3RoX2VxdWFsc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBsZW5ndGhcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcmVnZXgocGF0dGVybiwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrUmVnZXgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJyZWdleFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBwYXR0ZXJuXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2xvd2VyY2FzZShwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMb3dlckNhc2Uoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJsb3dlcmNhc2VcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91cHBlcmNhc2UocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrVXBwZXJDYXNlKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwidXBwZXJjYXNlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW5jbHVkZXMoaW5jbHVkZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0luY2x1ZGVzKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgaW5jbHVkZXNcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3RhcnRzV2l0aChwcmVmaXgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1N0YXJ0c1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJzdGFydHNfd2l0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBwcmVmaXhcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZW5kc1dpdGgoc3VmZml4LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tFbmRzV2l0aCh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcImVuZHNfd2l0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBzdWZmaXhcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcHJvcGVydHkocHJvcGVydHksIHNjaGVtYSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrUHJvcGVydHkoe1xuICAgICAgICBjaGVjazogXCJwcm9wZXJ0eVwiLFxuICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX21pbWUodHlwZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pbWVUeXBlKHtcbiAgICAgICAgY2hlY2s6IFwibWltZV90eXBlXCIsXG4gICAgICAgIG1pbWU6IHR5cGVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX292ZXJ3cml0ZSh0eCkge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja092ZXJ3cml0ZSh7XG4gICAgICAgIGNoZWNrOiBcIm92ZXJ3cml0ZVwiLFxuICAgICAgICB0eFxuICAgIH0pO1xufVxuLy8gbm9ybWFsaXplXG5leHBvcnQgZnVuY3Rpb24gX25vcm1hbGl6ZShmb3JtKSB7XG4gICAgcmV0dXJuIF9vdmVyd3JpdGUoKGlucHV0KT0+aW5wdXQubm9ybWFsaXplKGZvcm0pKTtcbn1cbi8vIHRyaW1cbmV4cG9ydCBmdW5jdGlvbiBfdHJpbSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50cmltKCkpO1xufVxuLy8gdG9Mb3dlckNhc2VcbmV4cG9ydCBmdW5jdGlvbiBfdG9Mb3dlckNhc2UoKSB7XG4gICAgcmV0dXJuIF9vdmVyd3JpdGUoKGlucHV0KT0+aW5wdXQudG9Mb3dlckNhc2UoKSk7XG59XG4vLyB0b1VwcGVyQ2FzZVxuZXhwb3J0IGZ1bmN0aW9uIF90b1VwcGVyQ2FzZSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50b1VwcGVyQ2FzZSgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYXJyYXkoQ2xhc3MsIGVsZW1lbnQsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIC8vIGdldCBlbGVtZW50KCkge1xuICAgICAgICAvLyAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAvLyB9LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VuaW9uKENsYXNzLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Rpc2NyaW1pbmF0ZWRVbmlvbihDbGFzcywgZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbnRlcnNlY3Rpb24oQ2xhc3MsIGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiaW50ZXJzZWN0aW9uXCIsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHJpZ2h0XG4gICAgfSk7XG59XG4vLyBleHBvcnQgZnVuY3Rpb24gX3R1cGxlKFxuLy8gICBDbGFzczogdXRpbC5TY2hlbWFDbGFzczxzY2hlbWFzLiRab2RUdXBsZT4sXG4vLyAgIGl0ZW1zOiBbXSxcbi8vICAgcGFyYW1zPzogc3RyaW5nIHwgJFpvZFR1cGxlUGFyYW1zXG4vLyApOiBzY2hlbWFzLiRab2RUdXBsZTxbXSwgbnVsbD47XG5leHBvcnQgZnVuY3Rpb24gX3R1cGxlKENsYXNzLCBpdGVtcywgX3BhcmFtc09yUmVzdCwgX3BhcmFtcykge1xuICAgIGNvbnN0IGhhc1Jlc3QgPSBfcGFyYW1zT3JSZXN0IGluc3RhbmNlb2Ygc2NoZW1hcy4kWm9kVHlwZTtcbiAgICBjb25zdCBwYXJhbXMgPSBoYXNSZXN0ID8gX3BhcmFtcyA6IF9wYXJhbXNPclJlc3Q7XG4gICAgY29uc3QgcmVzdCA9IGhhc1Jlc3QgPyBfcGFyYW1zT3JSZXN0IDogbnVsbDtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICBpdGVtcyxcbiAgICAgICAgcmVzdCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9yZWNvcmQoQ2xhc3MsIGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9tYXAoQ2xhc3MsIGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibWFwXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zZXQoQ2xhc3MsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lbnVtKENsYXNzLCB2YWx1ZXMsIHBhcmFtcykge1xuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyBPYmplY3QuZnJvbUVudHJpZXModmFsdWVzLm1hcCgodik9PltcbiAgICAgICAgICAgIHYsXG4gICAgICAgICAgICB2XG4gICAgICAgIF0pKSA6IHZhbHVlcztcbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgLy8gICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIC8vICAgICBlbnRyaWVzW3ZhbHVlXSA9IHZhbHVlO1xuICAgIC8vICAgfVxuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICBPYmplY3QuYXNzaWduKGVudHJpZXMsIHZhbHVlcyk7XG4gICAgLy8gfVxuICAgIC8vIGNvbnN0IGVudHJpZXM6IHV0aWwuRW51bUxpa2UgPSB7fTtcbiAgICAvLyBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAvLyAgIGVudHJpZXNbdmFsXSA9IHZhbDtcbiAgICAvLyB9XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgVGhpcyBBUEkgaGFzIGJlZW4gbWVyZ2VkIGludG8gYHouZW51bSgpYC4gVXNlIGB6LmVudW0oKWAgaW5zdGVhZC5cbiAqXG4gKiBgYGB0c1xuICogZW51bSBDb2xvcnMgeyByZWQsIGdyZWVuLCBibHVlIH1cbiAqIHouZW51bShDb2xvcnMpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIF9uYXRpdmVFbnVtKENsYXNzLCBlbnRyaWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbGl0ZXJhbChDbGFzcywgdmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9maWxlKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdHJhbnNmb3JtKENsYXNzLCBmbikge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInRyYW5zZm9ybVwiLFxuICAgICAgICB0cmFuc2Zvcm06IGZuXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX29wdGlvbmFsKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbnVsbGFibGUoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bGxhYmxlXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9kZWZhdWx0KENsYXNzLCBpbm5lclR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImRlZmF1bHRcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbm9ub3B0aW9uYWwoQ2xhc3MsIGlubmVyVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N1Y2Nlc3MoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NhdGNoKENsYXNzLCBpbm5lclR5cGUsIGNhdGNoVmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJjYXRjaFwiLFxuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBjYXRjaFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBjYXRjaFZhbHVlIDogKCk9PmNhdGNoVmFsdWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcGlwZShDbGFzcywgaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9yZWFkb25seShDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicmVhZG9ubHlcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3RlbXBsYXRlTGl0ZXJhbChDbGFzcywgcGFydHMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgcGFydHMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbGF6eShDbGFzcywgZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibGF6eVwiLFxuICAgICAgICBnZXR0ZXJcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcHJvbWlzZShDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicHJvbWlzZVwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY3VzdG9tKENsYXNzLCBmbiwgX3BhcmFtcykge1xuICAgIGNvbnN0IG5vcm0gPSB1dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKTtcbiAgICBub3JtLmFib3J0ID8/IChub3JtLmFib3J0ID0gdHJ1ZSk7IC8vIGRlZmF1bHQgdG8gYWJvcnQ6ZmFsc2VcbiAgICBjb25zdCBzY2hlbWEgPSBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICBjaGVjazogXCJjdXN0b21cIixcbiAgICAgICAgZm46IGZuLFxuICAgICAgICAuLi5ub3JtXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbn1cbi8vIHNhbWUgYXMgX2N1c3RvbSBidXQgZGVmYXVsdHMgdG8gYWJvcnQ6ZmFsc2VcbmV4cG9ydCBmdW5jdGlvbiBfcmVmaW5lKENsYXNzLCBmbiwgX3BhcmFtcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3VwZXJSZWZpbmUoZm4pIHtcbiAgICBjb25zdCBjaCA9IF9jaGVjaygocGF5bG9hZCk9PntcbiAgICAgICAgcGF5bG9hZC5hZGRJc3N1ZSA9IChpc3N1ZSk9PntcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoaXNzdWUsIHBheWxvYWQudmFsdWUsIGNoLl96b2QuZGVmKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZvciBab2QgMyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IF9pc3N1ZSA9IGlzc3VlO1xuICAgICAgICAgICAgICAgIGlmIChfaXNzdWUuZmF0YWwpIF9pc3N1ZS5jb250aW51ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5jb2RlID8/IChfaXNzdWUuY29kZSA9IFwiY3VzdG9tXCIpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnB1dCA/PyAoX2lzc3VlLmlucHV0ID0gcGF5bG9hZC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmluc3QgPz8gKF9pc3N1ZS5pbnN0ID0gY2gpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5jb250aW51ZSA/PyAoX2lzc3VlLmNvbnRpbnVlID0gIWNoLl96b2QuZGVmLmFib3J0KTsgLy8gYWJvcnQgaXMgYWx3YXlzIHVuZGVmaW5lZCwgc28gdGhpcyBpcyBhbHdheXMgdHJ1ZS4uLlxuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2godXRpbC5pc3N1ZShfaXNzdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZuKHBheWxvYWQudmFsdWUsIHBheWxvYWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjaDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY2hlY2soZm4sIHBhcmFtcykge1xuICAgIGNvbnN0IGNoID0gbmV3IGNoZWNrcy4kWm9kQ2hlY2soe1xuICAgICAgICBjaGVjazogXCJjdXN0b21cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xuICAgIGNoLl96b2QuY2hlY2sgPSBmbjtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N0cmluZ2Jvb2woQ2xhc3NlcywgX3BhcmFtcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IHV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpO1xuICAgIGxldCB0cnV0aHlBcnJheSA9IHBhcmFtcy50cnV0aHkgPz8gW1xuICAgICAgICBcInRydWVcIixcbiAgICAgICAgXCIxXCIsXG4gICAgICAgIFwieWVzXCIsXG4gICAgICAgIFwib25cIixcbiAgICAgICAgXCJ5XCIsXG4gICAgICAgIFwiZW5hYmxlZFwiXG4gICAgXTtcbiAgICBsZXQgZmFsc3lBcnJheSA9IHBhcmFtcy5mYWxzeSA/PyBbXG4gICAgICAgIFwiZmFsc2VcIixcbiAgICAgICAgXCIwXCIsXG4gICAgICAgIFwibm9cIixcbiAgICAgICAgXCJvZmZcIixcbiAgICAgICAgXCJuXCIsXG4gICAgICAgIFwiZGlzYWJsZWRcIlxuICAgIF07XG4gICAgaWYgKHBhcmFtcy5jYXNlICE9PSBcInNlbnNpdGl2ZVwiKSB7XG4gICAgICAgIHRydXRoeUFycmF5ID0gdHJ1dGh5QXJyYXkubWFwKCh2KT0+dHlwZW9mIHYgPT09IFwic3RyaW5nXCIgPyB2LnRvTG93ZXJDYXNlKCkgOiB2KTtcbiAgICAgICAgZmFsc3lBcnJheSA9IGZhbHN5QXJyYXkubWFwKCh2KT0+dHlwZW9mIHYgPT09IFwic3RyaW5nXCIgPyB2LnRvTG93ZXJDYXNlKCkgOiB2KTtcbiAgICB9XG4gICAgY29uc3QgdHJ1dGh5U2V0ID0gbmV3IFNldCh0cnV0aHlBcnJheSk7XG4gICAgY29uc3QgZmFsc3lTZXQgPSBuZXcgU2V0KGZhbHN5QXJyYXkpO1xuICAgIGNvbnN0IF9Db2RlYyA9IENsYXNzZXMuQ29kZWMgPz8gc2NoZW1hcy4kWm9kQ29kZWM7XG4gICAgY29uc3QgX0Jvb2xlYW4gPSBDbGFzc2VzLkJvb2xlYW4gPz8gc2NoZW1hcy4kWm9kQm9vbGVhbjtcbiAgICBjb25zdCBfU3RyaW5nID0gQ2xhc3Nlcy5TdHJpbmcgPz8gc2NoZW1hcy4kWm9kU3RyaW5nO1xuICAgIGNvbnN0IHN0cmluZ1NjaGVtYSA9IG5ldyBfU3RyaW5nKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH0pO1xuICAgIGNvbnN0IGJvb2xlYW5TY2hlbWEgPSBuZXcgX0Jvb2xlYW4oe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH0pO1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IF9Db2RlYyh7XG4gICAgICAgIHR5cGU6IFwicGlwZVwiLFxuICAgICAgICBpbjogc3RyaW5nU2NoZW1hLFxuICAgICAgICBvdXQ6IGJvb2xlYW5TY2hlbWEsXG4gICAgICAgIHRyYW5zZm9ybTogKGlucHV0LCBwYXlsb2FkKT0+e1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBpbnB1dDtcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY2FzZSAhPT0gXCJzZW5zaXRpdmVcIikgZGF0YSA9IGRhdGEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0cnV0aHlTZXQuaGFzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZhbHN5U2V0LmhhcyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF92YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJzdHJpbmdib29sXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udHJ1dGh5U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZmFsc3lTZXRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluc3Q6IGNvZGVjLFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm06IChpbnB1dCwgX3BheWxvYWQpPT57XG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1dGh5QXJyYXlbMF0gfHwgXCJ0cnVlXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzeUFycmF5WzBdIHx8IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH0pO1xuICAgIHJldHVybiBjb2RlYztcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nRm9ybWF0KENsYXNzLCBmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSxcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIGZuOiB0eXBlb2YgZm5PclJlZ2V4ID09PSBcImZ1bmN0aW9uXCIgPyBmbk9yUmVnZXggOiAodmFsKT0+Zm5PclJlZ2V4LnRlc3QodmFsKSxcbiAgICAgICAgLi4ucGFyYW1zXG4gICAgfTtcbiAgICBpZiAoZm5PclJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGRlZi5wYXR0ZXJuID0gZm5PclJlZ2V4O1xuICAgIH1cbiAgICBjb25zdCBpbnN0ID0gbmV3IENsYXNzKGRlZik7XG4gICAgcmV0dXJuIGluc3Q7XG59XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgc2NoZW1hcyBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVRpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EYXRlVGltZS5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGVUaW1lKFpvZElTT0RhdGVUaW1lLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElTT0RhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT0RhdGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGUoWm9kSVNPRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT1RpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09UaW1lLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0aW1lKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29UaW1lKFpvZElTT1RpbWUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVNPRHVyYXRpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRHVyYXRpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EdXJhdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZHVyYXRpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0R1cmF0aW9uKFpvZElTT0R1cmF0aW9uLCBwYXJhbXMpO1xufVxuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7ICRab2RFcnJvciB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuLi9jb3JlL3V0aWwuanNcIjtcbmNvbnN0IGluaXRpYWxpemVyID0gKGluc3QsIGlzc3Vlcyk9PntcbiAgICAkWm9kRXJyb3IuaW5pdChpbnN0LCBpc3N1ZXMpO1xuICAgIGluc3QubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbnN0LCB7XG4gICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZvcm1hdEVycm9yKGluc3QsIG1hcHBlcilcbiAgICAgICAgfSxcbiAgICAgICAgZmxhdHRlbjoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZsYXR0ZW5FcnJvcihpbnN0LCBtYXBwZXIpXG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3VlOiB7XG4gICAgICAgICAgICB2YWx1ZTogKGlzc3VlKT0+e1xuICAgICAgICAgICAgICAgIGluc3QuaXNzdWVzLnB1c2goaXNzdWUpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3Vlczoge1xuICAgICAgICAgICAgdmFsdWU6IChpc3N1ZXMpPT57XG4gICAgICAgICAgICAgICAgaW5zdC5pc3N1ZXMucHVzaCguLi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzRW1wdHk6IHtcbiAgICAgICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNFbXB0eVwiLCB7XG4vLyAgIGdldCgpIHtcbi8vICAgICByZXR1cm4gaW5zdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuLy8gICB9LFxuLy8gfSk7XG59O1xuZXhwb3J0IGNvbnN0IFpvZEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplcik7XG5leHBvcnQgY29uc3QgWm9kUmVhbEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplciwge1xuICAgIFBhcmVudDogRXJyb3Jcbn0pOyAvLyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6LmNvcmUuJFpvZEVycm9yTWFwQ3R4YCBpbnN0ZWFkLiAqL1xuIC8vIGV4cG9ydCB0eXBlIEVycm9yTWFwQ3R4ID0gY29yZS4kWm9kRXJyb3JNYXBDdHg7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgWm9kUmVhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgY29uc3QgcGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fcGFyc2UoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3BhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbi8vIENvZGVjIGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9lbmNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZGVjb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgZW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9kZWNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZUVuY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBjaGVja3MgZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgKiBhcyBpc28gZnJvbSBcIi4vaXNvLmpzXCI7XG5pbXBvcnQgKiBhcyBwYXJzZSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuZXhwb3J0IGNvbnN0IFpvZFR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZGVmID0gZGVmO1xuICAgIGluc3QudHlwZSA9IGRlZi50eXBlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcIl9kZWZcIiwge1xuICAgICAgICB2YWx1ZTogZGVmXG4gICAgfSk7XG4gICAgLy8gYmFzZSBtZXRob2RzXG4gICAgaW5zdC5jaGVjayA9ICguLi5jaGVja3MpPT57XG4gICAgICAgIHJldHVybiBpbnN0LmNsb25lKHV0aWwubWVyZ2VEZWZzKGRlZiwge1xuICAgICAgICAgICAgY2hlY2tzOiBbXG4gICAgICAgICAgICAgICAgLi4uZGVmLmNoZWNrcyA/PyBbXSxcbiAgICAgICAgICAgICAgICAuLi5jaGVja3MubWFwKChjaCk9PnR5cGVvZiBjaCA9PT0gXCJmdW5jdGlvblwiID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3pvZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOiBjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWY6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uYXR0YWNoOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IDogY2gpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIGluc3QuY2xvbmUgPSAoZGVmLCBwYXJhbXMpPT5jb3JlLmNsb25lKGluc3QsIGRlZiwgcGFyYW1zKTtcbiAgICBpbnN0LmJyYW5kID0gKCk9Pmluc3Q7XG4gICAgaW5zdC5yZWdpc3RlciA9IChyZWcsIG1ldGEpPT57XG4gICAgICAgIHJlZy5hZGQoaW5zdCwgbWV0YSk7XG4gICAgICAgIHJldHVybiBpbnN0O1xuICAgIH07XG4gICAgLy8gcGFyc2luZ1xuICAgIGluc3QucGFyc2UgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2UucGFyc2UoaW5zdCwgZGF0YSwgcGFyYW1zLCB7XG4gICAgICAgICAgICBjYWxsZWU6IGluc3QucGFyc2VcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zYWZlUGFyc2UgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZVBhcnNlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5wYXJzZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnBhcnNlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zLCB7XG4gICAgICAgICAgICBjYWxsZWU6IGluc3QucGFyc2VBc3luY1xuICAgICAgICB9KTtcbiAgICBpbnN0LnNhZmVQYXJzZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVQYXJzZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zcGEgPSBpbnN0LnNhZmVQYXJzZUFzeW5jO1xuICAgIC8vIGVuY29kaW5nL2RlY29kaW5nXG4gICAgaW5zdC5lbmNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZW5jb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5kZWNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZGVjb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5lbmNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5lbmNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3QuZGVjb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZGVjb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVFbmNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZUVuY29kZShpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZURlY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRGVjb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRW5jb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZUVuY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRGVjb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZURlY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgLy8gcmVmaW5lbWVudHNcbiAgICBpbnN0LnJlZmluZSA9IChjaGVjaywgcGFyYW1zKT0+aW5zdC5jaGVjayhyZWZpbmUoY2hlY2ssIHBhcmFtcykpO1xuICAgIGluc3Quc3VwZXJSZWZpbmUgPSAocmVmaW5lbWVudCk9Pmluc3QuY2hlY2soc3VwZXJSZWZpbmUocmVmaW5lbWVudCkpO1xuICAgIGluc3Qub3ZlcndyaXRlID0gKGZuKT0+aW5zdC5jaGVjayhjaGVja3Mub3ZlcndyaXRlKGZuKSk7XG4gICAgLy8gd3JhcHBlcnNcbiAgICBpbnN0Lm9wdGlvbmFsID0gKCk9Pm9wdGlvbmFsKGluc3QpO1xuICAgIGluc3QubnVsbGFibGUgPSAoKT0+bnVsbGFibGUoaW5zdCk7XG4gICAgaW5zdC5udWxsaXNoID0gKCk9Pm9wdGlvbmFsKG51bGxhYmxlKGluc3QpKTtcbiAgICBpbnN0Lm5vbm9wdGlvbmFsID0gKHBhcmFtcyk9Pm5vbm9wdGlvbmFsKGluc3QsIHBhcmFtcyk7XG4gICAgaW5zdC5hcnJheSA9ICgpPT5hcnJheShpbnN0KTtcbiAgICBpbnN0Lm9yID0gKGFyZyk9PnVuaW9uKFtcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBhcmdcbiAgICAgICAgXSk7XG4gICAgaW5zdC5hbmQgPSAoYXJnKT0+aW50ZXJzZWN0aW9uKGluc3QsIGFyZyk7XG4gICAgaW5zdC50cmFuc2Zvcm0gPSAodHgpPT5waXBlKGluc3QsIHRyYW5zZm9ybSh0eCkpO1xuICAgIGluc3QuZGVmYXVsdCA9IChkZWYpPT5fZGVmYXVsdChpbnN0LCBkZWYpO1xuICAgIGluc3QucHJlZmF1bHQgPSAoZGVmKT0+cHJlZmF1bHQoaW5zdCwgZGVmKTtcbiAgICAvLyBpbnN0LmNvYWxlc2NlID0gKGRlZiwgcGFyYW1zKSA9PiBjb2FsZXNjZShpbnN0LCBkZWYsIHBhcmFtcyk7XG4gICAgaW5zdC5jYXRjaCA9IChwYXJhbXMpPT5fY2F0Y2goaW5zdCwgcGFyYW1zKTtcbiAgICBpbnN0LnBpcGUgPSAodGFyZ2V0KT0+cGlwZShpbnN0LCB0YXJnZXQpO1xuICAgIGluc3QucmVhZG9ubHkgPSAoKT0+cmVhZG9ubHkoaW5zdCk7XG4gICAgLy8gbWV0YVxuICAgIGluc3QuZGVzY3JpYmUgPSAoZGVzY3JpcHRpb24pPT57XG4gICAgICAgIGNvbnN0IGNsID0gaW5zdC5jbG9uZSgpO1xuICAgICAgICBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmFkZChjbCwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbDtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcImRlc2NyaXB0aW9uXCIsIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KT8uZGVzY3JpcHRpb247XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGluc3QubWV0YSA9ICguLi5hcmdzKT0+e1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbCA9IGluc3QuY2xvbmUoKTtcbiAgICAgICAgY29yZS5nbG9iYWxSZWdpc3RyeS5hZGQoY2wsIGFyZ3NbMF0pO1xuICAgICAgICByZXR1cm4gY2w7XG4gICAgfTtcbiAgICAvLyBoZWxwZXJzXG4gICAgaW5zdC5pc09wdGlvbmFsID0gKCk9Pmluc3Quc2FmZVBhcnNlKHVuZGVmaW5lZCkuc3VjY2VzcztcbiAgICBpbnN0LmlzTnVsbGFibGUgPSAoKT0+aW5zdC5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgX1pvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJfWm9kU3RyaW5nXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QuZm9ybWF0ID0gYmFnLmZvcm1hdCA/PyBudWxsO1xuICAgIGluc3QubWluTGVuZ3RoID0gYmFnLm1pbmltdW0gPz8gbnVsbDtcbiAgICBpbnN0Lm1heExlbmd0aCA9IGJhZy5tYXhpbXVtID8/IG51bGw7XG4gICAgLy8gdmFsaWRhdGlvbnNcbiAgICBpbnN0LnJlZ2V4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5yZWdleCguLi5hcmdzKSk7XG4gICAgaW5zdC5pbmNsdWRlcyA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MuaW5jbHVkZXMoLi4uYXJncykpO1xuICAgIGluc3Quc3RhcnRzV2l0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3Muc3RhcnRzV2l0aCguLi5hcmdzKSk7XG4gICAgaW5zdC5lbmRzV2l0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MuZW5kc1dpdGgoLi4uYXJncykpO1xuICAgIGluc3QubWluID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgoLi4uYXJncykpO1xuICAgIGluc3QubWF4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5tYXhMZW5ndGgoLi4uYXJncykpO1xuICAgIGluc3QubGVuZ3RoID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5sZW5ndGgoLi4uYXJncykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aCgxLCAuLi5hcmdzKSk7XG4gICAgaW5zdC5sb3dlcmNhc2UgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubG93ZXJjYXNlKHBhcmFtcykpO1xuICAgIGluc3QudXBwZXJjYXNlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLnVwcGVyY2FzZShwYXJhbXMpKTtcbiAgICAvLyB0cmFuc2Zvcm1zXG4gICAgaW5zdC50cmltID0gKCk9Pmluc3QuY2hlY2soY2hlY2tzLnRyaW0oKSk7XG4gICAgaW5zdC5ub3JtYWxpemUgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLm5vcm1hbGl6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC50b0xvd2VyQ2FzZSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50b0xvd2VyQ2FzZSgpKTtcbiAgICBpbnN0LnRvVXBwZXJDYXNlID0gKCk9Pmluc3QuY2hlY2soY2hlY2tzLnRvVXBwZXJDYXNlKCkpO1xufSk7XG5leHBvcnQgY29uc3QgWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN0cmluZ1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG4gICAgX1pvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5lbWFpbCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2VtYWlsKFpvZEVtYWlsLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVybCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3VybChab2RVUkwsIHBhcmFtcykpO1xuICAgIGluc3Quand0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fand0KFpvZEpXVCwgcGFyYW1zKSk7XG4gICAgaW5zdC5lbW9qaSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2Vtb2ppKFpvZEVtb2ppLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9ndWlkKFpvZEdVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3V1aWQoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkdjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkdjQoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkdjYgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkdjYoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkdjcgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkdjcoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5uYW5vaWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9uYW5vaWQoWm9kTmFub0lELCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9ndWlkKFpvZEdVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuY3VpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2N1aWQoWm9kQ1VJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5jdWlkMiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2N1aWQyKFpvZENVSUQyLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVsaWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91bGlkKFpvZFVMSUQsIHBhcmFtcykpO1xuICAgIGluc3QuYmFzZTY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fYmFzZTY0KFpvZEJhc2U2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5iYXNlNjR1cmwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9iYXNlNjR1cmwoWm9kQmFzZTY0VVJMLCBwYXJhbXMpKTtcbiAgICBpbnN0LnhpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3hpZChab2RYSUQsIHBhcmFtcykpO1xuICAgIGluc3Qua3N1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9rc3VpZChab2RLU1VJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5pcHY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5faXB2NChab2RJUHY0LCBwYXJhbXMpKTtcbiAgICBpbnN0LmlwdjYgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9pcHY2KFpvZElQdjYsIHBhcmFtcykpO1xuICAgIGluc3QuY2lkcnY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY2lkcnY0KFpvZENJRFJ2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5jaWRydjYgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jaWRydjYoWm9kQ0lEUnY2LCBwYXJhbXMpKTtcbiAgICBpbnN0LmUxNjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lMTY0KFpvZEUxNjQsIHBhcmFtcykpO1xuICAgIC8vIGlzb1xuICAgIGluc3QuZGF0ZXRpbWUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28uZGF0ZXRpbWUocGFyYW1zKSk7XG4gICAgaW5zdC5kYXRlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLmRhdGUocGFyYW1zKSk7XG4gICAgaW5zdC50aW1lID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLnRpbWUocGFyYW1zKSk7XG4gICAgaW5zdC5kdXJhdGlvbiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby5kdXJhdGlvbihwYXJhbXMpKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nKFpvZFN0cmluZywgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RTdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBfWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0IFpvZEVtYWlsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEVtYWlsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RFbWFpbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9lbWFpbChab2RFbWFpbCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RHVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEdVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEdVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBndWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9ndWlkKFpvZEdVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVVVJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RVVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdXVpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZChab2RVVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZHY0KFpvZFVVSUQsIHBhcmFtcyk7XG59XG4vLyBab2RVVUlEdjZcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjYocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWR2Nihab2RVVUlELCBwYXJhbXMpO1xufVxuLy8gWm9kVVVJRHY3XG5leHBvcnQgZnVuY3Rpb24gdXVpZHY3KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkdjcoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RVUkwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1cmwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VybChab2RVUkwsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaHR0cFVybChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXJsKFpvZFVSTCwge1xuICAgICAgICBwcm90b2NvbDogL15odHRwcz8kLyxcbiAgICAgICAgaG9zdG5hbWU6IGNvcmUucmVnZXhlcy5kb21haW4sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RFbW9qaSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFbW9qaVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRW1vamkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlbW9qaShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZW1vamkoWm9kRW1vamksIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTmFub0lEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5hbm9JRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kTmFub0lELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmFub2lkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9uYW5vaWQoWm9kTmFub0lELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ1VJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGN1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1aWQoWm9kQ1VJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDVUlEMiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDVUlEMlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ1VJRDIuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjdWlkMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY3VpZDIoWm9kQ1VJRDIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVUxJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVTElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RVTElELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdWxpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWxpZChab2RVTElELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFhJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RYSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZFhJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHhpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5feGlkKFpvZFhJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RLU1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RLU1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kS1NVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBrc3VpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fa3N1aWQoWm9kS1NVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVB2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJUHY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RJUHY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaXB2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXB2NChab2RJUHY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElQdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVB2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSVB2Ni5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlwdjYocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lwdjYoWm9kSVB2NiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDSURSdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ0lEUnY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ0lEUnY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY2lkcnY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jaWRydjQoWm9kQ0lEUnY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENJRFJ2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDSURSdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDSURSdjYuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjaWRydjYocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2NpZHJ2Nihab2RDSURSdjYsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmFzZTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJhc2U2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQmFzZTY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9iYXNlNjQoWm9kQmFzZTY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJhc2U2NFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCYXNlNjRVUkxcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEJhc2U2NFVSTC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NHVybChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmFzZTY0dXJsKFpvZEJhc2U2NFVSTCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RFMTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEUxNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEUxNjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlMTY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9lMTY0KFpvZEUxNjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSldUID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEpXVFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSldULmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gand0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9qd3QoWm9kSldULCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDdXN0b21TdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdChmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIGZvcm1hdCwgZm5PclJlZ2V4LCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBob3N0bmFtZShfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIFwiaG9zdG5hbWVcIiwgY29yZS5yZWdleGVzLmhvc3RuYW1lLCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoZXgoX3BhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zdHJpbmdGb3JtYXQoWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LCBcImhleFwiLCBjb3JlLnJlZ2V4ZXMuaGV4LCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKGFsZywgcGFyYW1zKSB7XG4gICAgY29uc3QgZW5jID0gcGFyYW1zPy5lbmMgPz8gXCJoZXhcIjtcbiAgICBjb25zdCBmb3JtYXQgPSBgJHthbGd9XyR7ZW5jfWA7XG4gICAgY29uc3QgcmVnZXggPSBjb3JlLnJlZ2V4ZXNbZm9ybWF0XTtcbiAgICBpZiAoIXJlZ2V4KSB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBoYXNoIGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIGZvcm1hdCwgcmVnZXgsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVtYmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bWJlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bWJlci5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5ndCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuZ3RlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHQgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0LmludCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGludChwYXJhbXMpKTtcbiAgICBpbnN0LnNhZmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpbnQocGFyYW1zKSk7XG4gICAgaW5zdC5wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KDAsIHBhcmFtcykpO1xuICAgIGluc3Qubm9ucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKDAsIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5zdGVwID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpKTtcbiAgICAvLyBpbnN0LmZpbml0ZSA9IChwYXJhbXMpID0+IGluc3QuY2hlY2soY29yZS5maW5pdGUocGFyYW1zKSk7XG4gICAgaW5zdC5maW5pdGUgPSAoKT0+aW5zdDtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QubWluVmFsdWUgPSBNYXRoLm1heChiYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIGJhZy5leGNsdXNpdmVNaW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gTWF0aC5taW4oYmFnLm1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBiYWcuZXhjbHVzaXZlTWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpID8/IG51bGw7XG4gICAgaW5zdC5pc0ludCA9IChiYWcuZm9ybWF0ID8/IFwiXCIpLmluY2x1ZGVzKFwiaW50XCIpIHx8IE51bWJlci5pc1NhZmVJbnRlZ2VyKGJhZy5tdWx0aXBsZU9mID8/IDAuNSk7XG4gICAgaW5zdC5pc0Zpbml0ZSA9IHRydWU7XG4gICAgaW5zdC5mb3JtYXQgPSBiYWcuZm9ybWF0ID8/IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bWJlcihab2ROdW1iZXIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bWJlckZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bWJlckZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDMyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDY0KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50MzIoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWludDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCb29sZWFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCb29sZWFuLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW4ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Jvb2xlYW4oWm9kQm9vbGVhbiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCaWdJbnQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmlnSW50XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQmlnSW50LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lmd0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHRlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZShCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pblZhbHVlID0gYmFnLm1pbmltdW0gPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gYmFnLm1heGltdW0gPz8gbnVsbDtcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJpZ2ludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmlnaW50KFpvZEJpZ0ludCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmlnSW50Rm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQmlnSW50Rm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLyBpbnQ2NFxuZXhwb3J0IGZ1bmN0aW9uIGludDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG4vLyB1aW50NjRcbmV4cG9ydCBmdW5jdGlvbiB1aW50NjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VpbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN5bWJvbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN5bWJvbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzeW1ib2wocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N5bWJvbChab2RTeW1ib2wsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVW5kZWZpbmVkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVuZGVmaW5lZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFVuZGVmaW5lZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmZ1bmN0aW9uIF91bmRlZmluZWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VuZGVmaW5lZChab2RVbmRlZmluZWQsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfdW5kZWZpbmVkIGFzIHVuZGVmaW5lZCB9O1xuZXhwb3J0IGNvbnN0IFpvZE51bGwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVsbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bGwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5mdW5jdGlvbiBfbnVsbChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbnVsbChab2ROdWxsLCBwYXJhbXMpO1xufVxuZXhwb3J0IHsgX251bGwgYXMgbnVsbCB9O1xuZXhwb3J0IGNvbnN0IFpvZEFueSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RBbnlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RBbnkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYW55KCkge1xuICAgIHJldHVybiBjb3JlLl9hbnkoWm9kQW55KTtcbn1cbmV4cG9ydCBjb25zdCBab2RVbmtub3duID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVua25vd25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RVbmtub3duLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVua25vd24oKSB7XG4gICAgcmV0dXJuIGNvcmUuX3Vua25vd24oWm9kVW5rbm93bik7XG59XG5leHBvcnQgY29uc3QgWm9kTmV2ZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTmV2ZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROZXZlci5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBuZXZlcihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbmV2ZXIoWm9kTmV2ZXIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVm9pZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RWb2lkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVm9pZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmZ1bmN0aW9uIF92b2lkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl92b2lkKFpvZFZvaWQsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfdm9pZCBhcyB2b2lkIH07XG5leHBvcnQgY29uc3QgWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGF0ZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgY29uc3QgYyA9IGluc3QuX3pvZC5iYWc7XG4gICAgaW5zdC5taW5EYXRlID0gYy5taW5pbXVtID8gbmV3IERhdGUoYy5taW5pbXVtKSA6IG51bGw7XG4gICAgaW5zdC5tYXhEYXRlID0gYy5tYXhpbXVtID8gbmV3IERhdGUoYy5tYXhpbXVtKSA6IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBkYXRlKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9kYXRlKFpvZERhdGUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQXJyYXkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQXJyYXlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RBcnJheS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5lbGVtZW50ID0gZGVmLmVsZW1lbnQ7XG4gICAgaW5zdC5taW4gPSAobWluTGVuZ3RoLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgobWluTGVuZ3RoLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbmVtcHR5ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aCgxLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9IChtYXhMZW5ndGgsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1heExlbmd0aChtYXhMZW5ndGgsIHBhcmFtcykpO1xuICAgIGluc3QubGVuZ3RoID0gKGxlbiwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubGVuZ3RoKGxlbiwgcGFyYW1zKSk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5lbGVtZW50O1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYXJyYXkoZWxlbWVudCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2FycmF5KFpvZEFycmF5LCBlbGVtZW50LCBwYXJhbXMpO1xufVxuLy8gLmtleW9mXG5leHBvcnQgZnVuY3Rpb24ga2V5b2Yoc2NoZW1hKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBzY2hlbWEuX3pvZC5kZWYuc2hhcGU7XG4gICAgcmV0dXJuIF9lbnVtKE9iamVjdC5rZXlzKHNoYXBlKSk7XG59XG5leHBvcnQgY29uc3QgWm9kT2JqZWN0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE9iamVjdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE9iamVjdEpJVC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QsIFwic2hhcGVcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5zaGFwZTtcbiAgICB9KTtcbiAgICBpbnN0LmtleW9mID0gKCk9Pl9lbnVtKE9iamVjdC5rZXlzKGluc3QuX3pvZC5kZWYuc2hhcGUpKTtcbiAgICBpbnN0LmNhdGNoYWxsID0gKGNhdGNoYWxsKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsXG4gICAgICAgIH0pO1xuICAgIGluc3QucGFzc3Rocm91Z2ggPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKVxuICAgICAgICB9KTtcbiAgICBpbnN0Lmxvb3NlID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiB1bmtub3duKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpY3QgPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG5ldmVyKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpcCA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIGluc3QuZXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5leHRlbmQoaW5zdCwgaW5jb21pbmcpO1xuICAgIH07XG4gICAgaW5zdC5zYWZlRXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5zYWZlRXh0ZW5kKGluc3QsIGluY29taW5nKTtcbiAgICB9O1xuICAgIGluc3QubWVyZ2UgPSAob3RoZXIpPT51dGlsLm1lcmdlKGluc3QsIG90aGVyKTtcbiAgICBpbnN0LnBpY2sgPSAobWFzayk9PnV0aWwucGljayhpbnN0LCBtYXNrKTtcbiAgICBpbnN0Lm9taXQgPSAobWFzayk9PnV0aWwub21pdChpbnN0LCBtYXNrKTtcbiAgICBpbnN0LnBhcnRpYWwgPSAoLi4uYXJncyk9PnV0aWwucGFydGlhbChab2RPcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG4gICAgaW5zdC5yZXF1aXJlZCA9ICguLi5hcmdzKT0+dXRpbC5yZXF1aXJlZChab2ROb25PcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Qoc2hhcGUsIHBhcmFtcykge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgc2hhcGU6IHNoYXBlID8/IHt9LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdChkZWYpO1xufVxuLy8gc3RyaWN0T2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0T2JqZWN0KHNoYXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBjYXRjaGFsbDogbmV2ZXIoKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gbG9vc2VPYmplY3RcbmV4cG9ydCBmdW5jdGlvbiBsb29zZU9iamVjdChzaGFwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3Qub3B0aW9ucyA9IGRlZi5vcHRpb25zO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdW5pb24ob3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZERpc2NyaW1pbmF0ZWRVbmlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REaXNjcmltaW5hdGVkVW5pb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBab2RVbmlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRGlzY3JpbWluYXRlZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyaW1pbmF0ZWRVbmlvbihkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAvLyBjb25zdCBbb3B0aW9ucywgcGFyYW1zXSA9IGFyZ3M7XG4gICAgcmV0dXJuIG5ldyBab2REaXNjcmltaW5hdGVkVW5pb24oe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RJbnRlcnNlY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSW50ZXJzZWN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kSW50ZXJzZWN0aW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVHVwbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUdXBsZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5yZXN0ID0gKHJlc3QpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICByZXN0OiByZXN0XG4gICAgICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdHVwbGUoaXRlbXMsIF9wYXJhbXNPclJlc3QsIF9wYXJhbXMpIHtcbiAgICBjb25zdCBoYXNSZXN0ID0gX3BhcmFtc09yUmVzdCBpbnN0YW5jZW9mIGNvcmUuJFpvZFR5cGU7XG4gICAgY29uc3QgcGFyYW1zID0gaGFzUmVzdCA/IF9wYXJhbXMgOiBfcGFyYW1zT3JSZXN0O1xuICAgIGNvbnN0IHJlc3QgPSBoYXNSZXN0ID8gX3BhcmFtc09yUmVzdCA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIHR5cGU6IFwidHVwbGVcIixcbiAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICByZXN0LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFJlY29yZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlY29yZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5rZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgaW5zdC52YWx1ZVR5cGUgPSBkZWYudmFsdWVUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICB0eXBlOiBcInJlY29yZFwiLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gdHlwZSBhbGtzamYgPSBjb3JlLm91dHB1dDxjb3JlLiRab2RSZWNvcmRLZXk+O1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWxSZWNvcmQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICBjb25zdCBrID0gY29yZS5jbG9uZShrZXlUeXBlKTtcbiAgICBrLl96b2QudmFsdWVzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZTogayxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RNYXAgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTWFwLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmtleVR5cGUgPSBkZWYua2V5VHlwZTtcbiAgICBpbnN0LnZhbHVlVHlwZSA9IGRlZi52YWx1ZVR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBtYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHR5cGU6IFwibWFwXCIsXG4gICAgICAgIGtleVR5cGU6IGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kU2V0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFNldFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFNldC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5taW4gPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5ub25lbXB0eSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoMSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWF4U2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5zaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX3NpemUoLi4uYXJncykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc2V0KHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW51bVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEVudW0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZW51bSA9IGRlZi5lbnRyaWVzO1xuICAgIGluc3Qub3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoZGVmLmVudHJpZXMpO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGRlZi5lbnRyaWVzKSk7XG4gICAgaW5zdC5leHRyYWN0ID0gKHZhbHVlcywgcGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBuZXdFbnRyaWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgIGlmIChrZXlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdFbnRyaWVzW3ZhbHVlXSA9IGRlZi5lbnRyaWVzW3ZhbHVlXTtcbiAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYEtleSAke3ZhbHVlfSBub3QgZm91bmQgaW4gZW51bWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgICAgIGVudHJpZXM6IG5ld0VudHJpZXNcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbnN0LmV4Y2x1ZGUgPSAodmFsdWVzLCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSB7XG4gICAgICAgICAgICAuLi5kZWYuZW50cmllc1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG4gICAgICAgICAgICBpZiAoa2V5cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld0VudHJpZXNbdmFsdWVdO1xuICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7dmFsdWV9IG5vdCBmb3VuZCBpbiBlbnVtYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgZW50cmllczogbmV3RW50cmllc1xuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBfZW51bSh2YWx1ZXMsIHBhcmFtcykge1xuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyBPYmplY3QuZnJvbUVudHJpZXModmFsdWVzLm1hcCgodik9PltcbiAgICAgICAgICAgIHYsXG4gICAgICAgICAgICB2XG4gICAgICAgIF0pKSA6IHZhbHVlcztcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IHsgX2VudW0gYXMgZW51bSB9O1xuLyoqIEBkZXByZWNhdGVkIFRoaXMgQVBJIGhhcyBiZWVuIG1lcmdlZCBpbnRvIGB6LmVudW0oKWAuIFVzZSBgei5lbnVtKClgIGluc3RlYWQuXG4gKlxuICogYGBgdHNcbiAqIGVudW0gQ29sb3JzIHsgcmVkLCBncmVlbiwgYmx1ZSB9XG4gKiB6LmVudW0oQ29sb3JzKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBuYXRpdmVFbnVtKGVudHJpZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTGl0ZXJhbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC52YWx1ZXMgPSBuZXcgU2V0KGRlZi52YWx1ZXMpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcInZhbHVlXCIsIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgIGlmIChkZWYudmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNjaGVtYSBjb250YWlucyBtdWx0aXBsZSB2YWxpZCBsaXRlcmFsIHZhbHVlcy4gVXNlIGAudmFsdWVzYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWYudmFsdWVzWzBdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEZpbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRmlsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEZpbGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QubWluID0gKHNpemUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZShzaXplLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9IChzaXplLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoc2l6ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW1lID0gKHR5cGVzLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pbWUoQXJyYXkuaXNBcnJheSh0eXBlcykgPyB0eXBlcyA6IFtcbiAgICAgICAgICAgIHR5cGVzXG4gICAgICAgIF0sIHBhcmFtcykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZmlsZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZmlsZShab2RGaWxlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFRyYW5zZm9ybSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUcmFuc2Zvcm0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoX2N0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKGluc3QuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5hZGRJc3N1ZSA9IChpc3N1ZSk9PntcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoaXNzdWUsIHBheWxvYWQudmFsdWUsIGRlZikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgWm9kIDMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBjb25zdCBfaXNzdWUgPSBpc3N1ZTtcbiAgICAgICAgICAgICAgICBpZiAoX2lzc3VlLmZhdGFsKSBfaXNzdWUuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29kZSA/PyAoX2lzc3VlLmNvZGUgPSBcImN1c3RvbVwiKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5wdXQgPz8gKF9pc3N1ZS5pbnB1dCA9IHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnN0ID8/IChfaXNzdWUuaW5zdCA9IGluc3QpO1xuICAgICAgICAgICAgICAgIC8vIF9pc3N1ZS5jb250aW51ZSA/Pz0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoX2lzc3VlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGRlZi50cmFuc2Zvcm0ocGF5bG9hZC52YWx1ZSwgcGF5bG9hZCk7XG4gICAgICAgIGlmIChvdXRwdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0LnRoZW4oKG91dHB1dCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIHJldHVybiBuZXcgWm9kVHJhbnNmb3JtKHtcbiAgICAgICAgdHlwZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgdHJhbnNmb3JtOiBmblxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kT3B0aW9uYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWwoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7XG4gICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdWxsYWJsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bGxhYmxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxhYmxlKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICB0eXBlOiBcIm51bGxhYmxlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG4vLyBudWxsaXNoXG5leHBvcnQgZnVuY3Rpb24gbnVsbGlzaChpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gb3B0aW9uYWwobnVsbGFibGUoaW5uZXJUeXBlKSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGVmYXVsdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG4gICAgaW5zdC5yZW1vdmVEZWZhdWx0ID0gaW5zdC51bndyYXA7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBfZGVmYXVsdChpbm5lclR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgIHR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbHVlKCkgOiB1dGlsLnNoYWxsb3dDbG9uZShkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUHJlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUHJlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RQcmVmYXVsdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBwcmVmYXVsdChpbm5lclR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kUHJlZmF1bHQoe1xuICAgICAgICB0eXBlOiBcInByZWZhdWx0XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2ROb25PcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROb25PcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE5vbk9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbm9wdGlvbmFsKGlubmVyVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2ROb25PcHRpb25hbCh7XG4gICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RTdWNjZXNzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN1Y2Nlc3NcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdWNjZXNzLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3MoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RTdWNjZXNzKHtcbiAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kQ2F0Y2ggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ2F0Y2hcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDYXRjaC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG4gICAgaW5zdC5yZW1vdmVDYXRjaCA9IGluc3QudW53cmFwO1xufSk7XG5mdW5jdGlvbiBfY2F0Y2goaW5uZXJUeXBlLCBjYXRjaFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgIHR5cGU6IFwiY2F0Y2hcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBjYXRjaFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBjYXRjaFZhbHVlIDogKCk9PmNhdGNoVmFsdWVcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9jYXRjaCBhcyBjYXRjaCB9O1xuZXhwb3J0IGNvbnN0IFpvZE5hTiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROYU5cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROYU4uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmFuKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9uYW4oWm9kTmFOLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFBpcGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUGlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFBpcGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuaW4gPSBkZWYuaW47XG4gICAgaW5zdC5vdXQgPSBkZWYub3V0O1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcGlwZShpbl8sIG91dCkge1xuICAgIHJldHVybiBuZXcgWm9kUGlwZSh7XG4gICAgICAgIHR5cGU6IFwicGlwZVwiLFxuICAgICAgICBpbjogaW5fLFxuICAgICAgICBvdXQ6IG91dFxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZENvZGVjID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENvZGVjXCIsIChpbnN0LCBkZWYpPT57XG4gICAgWm9kUGlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ29kZWMuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY29kZWMoaW5fLCBvdXQsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kQ29kZWMoe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IGluXyxcbiAgICAgICAgb3V0OiBvdXQsXG4gICAgICAgIHRyYW5zZm9ybTogcGFyYW1zLmRlY29kZSxcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybTogcGFyYW1zLmVuY29kZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFJlYWRvbmx5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFJlYWRvbmx5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUmVhZG9ubHkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RSZWFkb25seSh7XG4gICAgICAgIHR5cGU6IFwicmVhZG9ubHlcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RUZW1wbGF0ZUxpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVGVtcGxhdGVMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVGVtcGxhdGVMaXRlcmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlTGl0ZXJhbChwYXJ0cywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RUZW1wbGF0ZUxpdGVyYWwoe1xuICAgICAgICB0eXBlOiBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgcGFydHMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RMYXp5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZExhenlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RMYXp5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmdldHRlcigpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbGF6eShnZXR0ZXIpIHtcbiAgICByZXR1cm4gbmV3IFpvZExhenkoe1xuICAgICAgICB0eXBlOiBcImxhenlcIixcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXJcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RQcm9taXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFByb21pc2VcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RQcm9taXNlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2UoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogXCJwcm9taXNlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRnVuY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGdW5jdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBfZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgaW5wdXQ6IEFycmF5LmlzQXJyYXkocGFyYW1zPy5pbnB1dCkgPyB0dXBsZShwYXJhbXM/LmlucHV0KSA6IHBhcmFtcz8uaW5wdXQgPz8gYXJyYXkodW5rbm93bigpKSxcbiAgICAgICAgb3V0cHV0OiBwYXJhbXM/Lm91dHB1dCA/PyB1bmtub3duKClcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9mdW5jdGlvbiBhcyBmdW5jdGlvbiB9O1xuZXhwb3J0IGNvbnN0IFpvZEN1c3RvbSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDdXN0b21cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDdXN0b20uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLyBjdXN0b20gY2hlY2tzXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soZm4pIHtcbiAgICBjb25zdCBjaCA9IG5ldyBjb3JlLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiXG4gICAgfSk7XG4gICAgY2guX3pvZC5jaGVjayA9IGZuO1xuICAgIHJldHVybiBjaDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b20oZm4sIF9wYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY3VzdG9tKFpvZEN1c3RvbSwgZm4gPz8gKCgpPT50cnVlKSwgX3BhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVmaW5lKGZuLCBfcGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gY29yZS5fcmVmaW5lKFpvZEN1c3RvbSwgZm4sIF9wYXJhbXMpO1xufVxuLy8gc3VwZXJSZWZpbmVcbmV4cG9ydCBmdW5jdGlvbiBzdXBlclJlZmluZShmbikge1xuICAgIHJldHVybiBjb3JlLl9zdXBlclJlZmluZShmbik7XG59XG5mdW5jdGlvbiBfaW5zdGFuY2VvZihjbHMsIHBhcmFtcyA9IHtcbiAgICBlcnJvcjogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWBcbn0pIHtcbiAgICBjb25zdCBpbnN0ID0gbmV3IFpvZEN1c3RvbSh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogKGRhdGEpPT5kYXRhIGluc3RhbmNlb2YgY2xzLFxuICAgICAgICBhYm9ydDogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xuICAgIGluc3QuX3pvZC5iYWcuQ2xhc3MgPSBjbHM7XG4gICAgcmV0dXJuIGluc3Q7XG59XG5leHBvcnQgeyBfaW5zdGFuY2VvZiBhcyBpbnN0YW5jZW9mIH07XG4vLyBzdHJpbmdib29sXG5leHBvcnQgY29uc3Qgc3RyaW5nYm9vbCA9ICguLi5hcmdzKT0+Y29yZS5fc3RyaW5nYm9vbCh7XG4gICAgICAgIENvZGVjOiBab2RDb2RlYyxcbiAgICAgICAgQm9vbGVhbjogWm9kQm9vbGVhbixcbiAgICAgICAgU3RyaW5nOiBab2RTdHJpbmdcbiAgICB9LCAuLi5hcmdzKTtcbmV4cG9ydCBmdW5jdGlvbiBqc29uKHBhcmFtcykge1xuICAgIGNvbnN0IGpzb25TY2hlbWEgPSBsYXp5KCgpPT57XG4gICAgICAgIHJldHVybiB1bmlvbihbXG4gICAgICAgICAgICBzdHJpbmcocGFyYW1zKSxcbiAgICAgICAgICAgIG51bWJlcigpLFxuICAgICAgICAgICAgYm9vbGVhbigpLFxuICAgICAgICAgICAgX251bGwoKSxcbiAgICAgICAgICAgIGFycmF5KGpzb25TY2hlbWEpLFxuICAgICAgICAgICAgcmVjb3JkKHN0cmluZygpLCBqc29uU2NoZW1hKVxuICAgICAgICBdKTtcbiAgICB9KTtcbiAgICByZXR1cm4ganNvblNjaGVtYTtcbn1cbi8vIHByZXByb2Nlc3Ncbi8vIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHoucGlwZSgpYCBhbmQgYHoudHJhbnNmb3JtKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzcyhmbiwgc2NoZW1hKSB7XG4gICAgcmV0dXJuIHBpcGUodHJhbnNmb3JtKGZuKSwgc2NoZW1hKTtcbn1cbiIsICJpbXBvcnQgeyBkZWZpbmVIb29rLCBnZXRXcml0YWJsZSB9IGZyb20gJ3dvcmtmbG93JztcbmltcG9ydCAqIGFzIHogZnJvbSAnem9kJztcbi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL2hvb2tzLnRzXCI6e1wiY29sbGVjdFdpdGhIb29rXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9ob29rcy50c1wiOntcIndyaXRlRXZlbnRcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9ob29rcy50cy8vd3JpdGVFdmVudFwifX19fSovO1xuZXhwb3J0IGNvbnN0IEhvb2sgPSBkZWZpbmVIb29rKHtcbiAgICBzY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgZGF0YTogei5zdHJpbmcoKSxcbiAgICAgICAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWV0YWRhdGE6IHoudW5rbm93bigpXG4gICAgfSlcbn0pO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXaXRoSG9vayh0b2tlbiwgY3VzdG9tRGF0YSkge1xuICAgIGNvbnN0IGhvb2sgPSBIb29rLmNyZWF0ZSh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgY3VzdG9tRGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29sbGVjdGVkID0gW107XG4gICAgY29uc3Qgd2YgPSBnZXRXcml0YWJsZSgpO1xuICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rQ3JlYXRlZCcpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgaG9vayl7XG4gICAgICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rUmVzdW1lZCcsIGV2ZW50KTtcbiAgICAgICAgY29sbGVjdGVkLnB1c2goZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQuZG9uZSkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbGxlY3RlZFxuICAgIH07XG59XG5jb2xsZWN0V2l0aEhvb2sud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCIsIGNvbGxlY3RXaXRoSG9vayk7XG52YXIgd3JpdGVFdmVudCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9ob29rcy50cy8vd3JpdGVFdmVudFwiKTtcbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9ub29wLnRzXCI6e1wiYnJva2VuV2ZcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vd29ya2Zsb3dzL25vb3AudHMvL2Jyb2tlbldmXCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9ub29wLnRzXCI6e1wibm9vcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL25vb3AudHMvL25vb3BcIn19fX0qLztcbmV4cG9ydCB2YXIgbm9vcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9ub29wLnRzLy9ub29wXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJyb2tlbldmKCkge1xuICAgIGNvbnN0IG51bWJlcnMgPSBbXTtcbiAgICB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChub29wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnYXdhaXQgNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTU7IGkrKyl7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vb3AoMTAwICsgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdhd2FpdCAxNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2RvbmUuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyc1xuICAgIH07XG59XG5icm9rZW5XZi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL25vb3AudHMvL2Jyb2tlbldmXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ub29wLnRzLy9icm9rZW5XZlwiLCBicm9rZW5XZik7XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzXCI6e1wibnVsbEJ5dGVXb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly93b3JrZmxvd3MvbnVsbC1ieXRlLnRzLy9udWxsQnl0ZVdvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9udWxsLWJ5dGUudHNcIjp7XCJudWxsQnl0ZVN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlU3RlcFwifX19fSovO1xudmFyIG51bGxCeXRlU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlU3RlcFwiKTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBudWxsQnl0ZVdvcmtmbG93KCkge1xuICAgIGNvbnN0IGEgPSBhd2FpdCBudWxsQnl0ZVN0ZXAoKTtcbiAgICByZXR1cm4gYTtcbn1cbm51bGxCeXRlV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlV29ya2Zsb3dcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVXb3JrZmxvd1wiLCBudWxsQnl0ZVdvcmtmbG93KTtcbiIsICJpbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSAnd29ya2Zsb3cnO1xuLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50c1wiOntcInJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzXCI6e1wic3RlcFRoYXRGYWlsc1wiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0RmFpbHNcIn0sXCJzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCI6e1wic3RlcElkXCI6XCJzdGVwLy93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvclwifX19fSovO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdygpIHtcbiAgICBjb25zdCByZXRyeWFibGVSZXN1bHQgPSBhd2FpdCBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yKCk7XG4gICAgbGV0IGdvdEZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdGVwVGhhdEZhaWxzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICAgICAgICBnb3RGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXRyeWFibGVSZXN1bHQsXG4gICAgICAgIGdvdEZhdGFsRXJyb3JcbiAgICB9O1xufVxucmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3dcIiwgcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KTtcbnZhciBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0VGhyb3dzUmV0cnlhYmxlRXJyb3JcIik7XG52YXIgc3RlcFRoYXRGYWlscyA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9zdGVwVGhhdEZhaWxzXCIpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsd0VBQUFBLFNBQUE7QUFBQTtBQUVJLFFBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFhUixJQUFBQSxRQUFPLFVBQVUsU0FBUyxLQUFLLFNBQVM7QUFDeEMsZ0JBQVUsV0FBVyxDQUFDO0FBQ3RCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3JDLGVBQU9DLE9BQU0sR0FBRztBQUFBLE1BQ3BCLFdBQVcsU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQzNDLGVBQU8sUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ3JEO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMERBQTBELEtBQUssVUFBVSxHQUFHLENBQUM7QUFBQSxJQUNqRztBQU9JLGFBQVNBLE9BQU0sS0FBSztBQUNwQixZQUFNLE9BQU8sR0FBRztBQUNoQixVQUFJLElBQUksU0FBUyxLQUFLO0FBQ2xCO0FBQUEsTUFDSjtBQUNBLFVBQUksUUFBUSxtSUFBbUksS0FBSyxHQUFHO0FBQ3ZKLFVBQUksQ0FBQyxPQUFPO0FBQ1I7QUFBQSxNQUNKO0FBQ0EsVUFBSSxJQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDM0IsVUFBSSxRQUFRLE1BQU0sQ0FBQyxLQUFLLE1BQU0sWUFBWTtBQUMxQyxjQUFPLE1BQUs7QUFBQSxRQUNSLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDRCxpQkFBTyxJQUFJO0FBQUEsUUFDZixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQ0QsaUJBQU8sSUFBSTtBQUFBLFFBQ2YsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNELGlCQUFPLElBQUk7QUFBQSxRQUNmLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDRCxpQkFBTyxJQUFJO0FBQUEsUUFDZixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQ0QsaUJBQU8sSUFBSTtBQUFBLFFBQ2YsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNELGlCQUFPLElBQUk7QUFBQSxRQUNmLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDRCxpQkFBTztBQUFBLFFBQ1g7QUFDSSxpQkFBTztBQUFBLE1BQ2Y7QUFBQSxJQUNKO0FBckRhLFdBQUFBLFFBQUE7QUE0RFQsYUFBUyxTQUFTQyxLQUFJO0FBQ3RCLFVBQUksUUFBUSxLQUFLLElBQUlBLEdBQUU7QUFDdkIsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLEtBQUssTUFBTUEsTUFBSyxDQUFDLElBQUk7QUFBQSxNQUNoQztBQUNBLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBTyxLQUFLLE1BQU1BLE1BQUssQ0FBQyxJQUFJO0FBQUEsTUFDaEM7QUFDQSxVQUFJLFNBQVMsR0FBRztBQUNaLGVBQU8sS0FBSyxNQUFNQSxNQUFLLENBQUMsSUFBSTtBQUFBLE1BQ2hDO0FBQ0EsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLEtBQUssTUFBTUEsTUFBSyxDQUFDLElBQUk7QUFBQSxNQUNoQztBQUNBLGFBQU9BLE1BQUs7QUFBQSxJQUNoQjtBQWZhO0FBc0JULGFBQVMsUUFBUUEsS0FBSTtBQUNyQixVQUFJLFFBQVEsS0FBSyxJQUFJQSxHQUFFO0FBQ3ZCLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBTyxPQUFPQSxLQUFJLE9BQU8sR0FBRyxLQUFLO0FBQUEsTUFDckM7QUFDQSxVQUFJLFNBQVMsR0FBRztBQUNaLGVBQU8sT0FBT0EsS0FBSSxPQUFPLEdBQUcsTUFBTTtBQUFBLE1BQ3RDO0FBQ0EsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLE9BQU9BLEtBQUksT0FBTyxHQUFHLFFBQVE7QUFBQSxNQUN4QztBQUNBLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBTyxPQUFPQSxLQUFJLE9BQU8sR0FBRyxRQUFRO0FBQUEsTUFDeEM7QUFDQSxhQUFPQSxNQUFLO0FBQUEsSUFDaEI7QUFmYTtBQWtCVCxhQUFTLE9BQU9BLEtBQUksT0FBTyxHQUFHLE1BQU07QUFDcEMsVUFBSSxXQUFXLFNBQVMsSUFBSTtBQUM1QixhQUFPLEtBQUssTUFBTUEsTUFBSyxDQUFDLElBQUksTUFBTSxRQUFRLFdBQVcsTUFBTTtBQUFBLElBQy9EO0FBSGE7QUFBQTtBQUFBOzs7QUN2SWIsSUFBSSxNQUFNLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsa0NBQWtDO0FBQ3hGLGVBQXNCLFNBQVMsS0FBSyxNQUFNO0FBQ3RDLFFBQU0sU0FBUyxNQUFNLElBQUksS0FBSyxJQUFJO0FBQ2xDLFVBQVEsSUFBSTtBQUFBLElBQ1I7QUFBQSxFQUNKLENBQUM7QUFDRCxTQUFPO0FBQ1g7QUFOc0I7QUFPdEIsU0FBUyxhQUFhO0FBQ3RCLFdBQVcsb0JBQW9CLElBQUksNkNBQTZDLFFBQVE7OztBQ1R4RixnQkFBZTs7O0FDVVosU0FBQSxRQUFBLE9BQUE7QUFDSCxTQUFTLE9BQVEsVUFBYyxZQUFBLFVBQUEsUUFBQSxVQUFBLFNBQUEsYUFBQTs7QUFENUI7QUE4T0MsSUFBUyxhQUFULGNBQVksTUFBc0I7RUF6UHRDLE9BeVBzQzs7O1VBQzlCO2NBQ0MsU0FBQTtBQUNOLFVBQUEsT0FBQTtBQUVELFNBQVMsT0FBZTs7RUFFeEIsT0FBQyxHQUFBLE9BQUE7QUFDRixXQUFBLFFBQUEsS0FBQSxLQUFBLE1BQUEsU0FBQTtFQUVEOzs7O0FDblFPLElBQU0sb0JBQW9CLE9BQU8sSUFBSSxtQkFBbUI7QUFDeEQsSUFBTSx1QkFBdUIsT0FBTyxJQUFJLHNCQUFzQjtBQUM5RCxJQUFNLGlCQUFpQixPQUFPLElBQUksZ0JBQWdCO0FBQ2xELElBQU0sbUJBQW1CLE9BQU8sSUFBSSxrQkFBa0I7QUFDdEQsSUFBTSx5QkFBeUIsT0FBTyxJQUFJLHdCQUF3QjtBQUNsRSxJQUFNLGNBQWMsT0FBTyxJQUFJLHNCQUFzQjtBQUNyRCxJQUFNLHFCQUFxQixPQUFPLElBQUksc0JBQXNCO0FBQzVELElBQU0scUJBQXFCLE9BQU8sSUFBSSxzQkFBc0I7QUFDNUQsSUFBTSxtQkFBbUIsT0FBTyxJQUFJLFdBQVc7QUFDL0MsSUFBTSw0QkFBNEIsT0FBTyxJQUM5QywyQkFBMkI7QUFNMUIsSUFBQSwwQkFBQSxPQUFBLElBQUEseUJBQUE7OztBQ05HLFNBQVUsV0FBb0IsU0FBcUI7QUFFdkQsUUFBTSxlQUFnQixXQUNwQixvQkFBb0I7QUFFdEIsTUFBSSxDQUFDLGNBQWM7QUFDakIsVUFBTSxJQUFJLE1BQ1IsOERBQThEO0VBRWxFO0FBQ0EsU0FBTyxhQUFhLE9BQU87QUFDN0I7QUFYZ0I7OztBQ0piLFNBQUEsYUFBQTtBQUNILFNBQU07SUFDSixPQUFPLFNBQUE7QUFDTCxhQUFPLFdBQXFCLE9BQUE7O0lBRTVCLE9BQUMsUUFBQSxVQUFBO0FBRUQsWUFBTyxJQUFjLE1BQUUsc0ZBQWdCOzs7O0FBUHhDOzs7QUNIRyxTQUFVLFlBQ2QsVUFBeUMsQ0FBQSxHQUFFO0FBRTNDLFFBQU0sRUFBRSxVQUFTLElBQUs7QUFDdEIsUUFBTSxPQUFRLFdBQW1CLHNCQUFzQixFQUFFLFNBQVM7QUFDbEUsU0FBTyxPQUFPLE9BQU8sV0FBVyxlQUFlLFdBQVc7SUFDeEQsQ0FBQyxrQkFBa0IsR0FBRztNQUNwQixPQUFPO01BQ1AsVUFBVTs7R0FFYjtBQUNIO0FBWGdCOzs7QUNTYixJQUFBLFFBQUEsV0FBQSxPQUFBLElBQUEsbUJBQUEsQ0FBQSxFQUFBLHNDQUFBOzs7QUNaZ0QsSUFBTSxRQUFRLE9BQU8sT0FBTztBQUFBLEVBQzNFLFFBQVE7QUFDWixDQUFDO0FBQUE7QUFDK0IsU0FBUyxhQUFhLE1BQU1DLGNBQWEsUUFBUTtBQUM3RSxXQUFTLEtBQUssTUFBTSxLQUFLO0FBQ3JCLFFBQUk7QUFDSixXQUFPLGVBQWUsTUFBTSxRQUFRO0FBQUEsTUFDaEMsT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUFBLE1BQ3JCLFlBQVk7QUFBQSxJQUNoQixDQUFDO0FBQ0QsS0FBQyxLQUFLLEtBQUssTUFBTSxXQUFXLEdBQUcsU0FBUyxvQkFBSSxJQUFJO0FBQ2hELFNBQUssS0FBSyxPQUFPLElBQUksSUFBSTtBQUN6QixJQUFBQSxhQUFZLE1BQU0sR0FBRztBQUVyQixlQUFVLEtBQUssRUFBRSxXQUFVO0FBQ3ZCLFVBQUksRUFBRSxLQUFLLE1BQU8sUUFBTyxlQUFlLE1BQU0sR0FBRztBQUFBLFFBQzdDLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUk7QUFBQSxNQUNuQyxDQUFDO0FBQUEsSUFDTDtBQUNBLFNBQUssS0FBSyxTQUFTO0FBQ25CLFNBQUssS0FBSyxNQUFNO0FBQUEsRUFDcEI7QUFqQlM7QUFtQlQsUUFBTSxTQUFTLFFBQVEsVUFBVTtBQUFBLEVBQ2pDLE1BQU0sbUJBQW1CLE9BQU87QUFBQSxJQXhCcEMsT0F3Qm9DO0FBQUE7QUFBQTtBQUFBLEVBQ2hDO0FBQ0EsU0FBTyxlQUFlLFlBQVksUUFBUTtBQUFBLElBQ3RDLE9BQU87QUFBQSxFQUNYLENBQUM7QUFDRCxXQUFTLEVBQUUsS0FBSztBQUNaLFFBQUk7QUFDSixVQUFNLE9BQU8sUUFBUSxTQUFTLElBQUksV0FBVyxJQUFJO0FBQ2pELFNBQUssTUFBTSxHQUFHO0FBQ2QsS0FBQyxLQUFLLEtBQUssTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQzdDLGVBQVcsTUFBTSxLQUFLLEtBQUssVUFBUztBQUNoQyxTQUFHO0FBQUEsSUFDUDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBVFM7QUFVVCxTQUFPLGVBQWUsR0FBRyxRQUFRO0FBQUEsSUFDN0IsT0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNELFNBQU8sZUFBZSxHQUFHLE9BQU8sYUFBYTtBQUFBLElBQ3pDLE9BQU8sd0JBQUMsU0FBTztBQUNYLFVBQUksUUFBUSxVQUFVLGdCQUFnQixPQUFPLE9BQVEsUUFBTztBQUM1RCxhQUFPLE1BQU0sTUFBTSxRQUFRLElBQUksSUFBSTtBQUFBLElBQ3ZDLEdBSE87QUFBQSxFQUlYLENBQUM7QUFDRCxTQUFPLGVBQWUsR0FBRyxRQUFRO0FBQUEsSUFDN0IsT0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNELFNBQU87QUFDWDtBQWpEeUM7QUFtRGxDLElBQU0sU0FBUyxPQUFPLFdBQVc7QUFDakMsSUFBTSxpQkFBTixjQUE2QixNQUFNO0FBQUEsRUF2RDFDLE9BdUQwQztBQUFBO0FBQUE7QUFBQSxFQUN0QyxjQUFhO0FBQ1QsVUFBTSwwRUFBMEU7QUFBQSxFQUNwRjtBQUNKO0FBQ08sSUFBTSxrQkFBTixjQUE4QixNQUFNO0FBQUEsRUE1RDNDLE9BNEQyQztBQUFBO0FBQUE7QUFBQSxFQUN2QyxZQUFZLE1BQUs7QUFDYixVQUFNLHVEQUF1RCxJQUFJLEVBQUU7QUFDbkUsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFDSjtBQUNPLElBQU0sZUFBZSxDQUFDO0FBQ3RCLFNBQVMsT0FBTyxXQUFXO0FBQzlCLE1BQUksVUFBVyxRQUFPLE9BQU8sY0FBYyxTQUFTO0FBQ3BELFNBQU87QUFDWDtBQUhnQjs7O0FDbkVoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDTyxTQUFTLFlBQVksS0FBSztBQUM3QixTQUFPO0FBQ1g7QUFGZ0I7QUFHVCxTQUFTLGVBQWUsS0FBSztBQUNoQyxTQUFPO0FBQ1g7QUFGZ0I7QUFHVCxTQUFTLFNBQVMsTUFBTTtBQUFDO0FBQWhCO0FBQ1QsU0FBUyxZQUFZLElBQUk7QUFDNUIsUUFBTSxJQUFJLE1BQU07QUFDcEI7QUFGZ0I7QUFHVCxTQUFTLE9BQU8sR0FBRztBQUFDO0FBQVg7QUFDVCxTQUFTLGNBQWMsU0FBUztBQUNuQyxRQUFNLGdCQUFnQixPQUFPLE9BQU8sT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFJLE9BQU8sTUFBTSxRQUFRO0FBQzlFLFFBQU0sU0FBUyxPQUFPLFFBQVEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFJLGNBQWMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQUksQ0FBQztBQUN6RyxTQUFPO0FBQ1g7QUFKZ0I7QUFLVCxTQUFTLFdBQVdDLFFBQU8sWUFBWSxLQUFLO0FBQy9DLFNBQU9BLE9BQU0sSUFBSSxDQUFDLFFBQU0sbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUztBQUNuRTtBQUZnQjtBQUdULFNBQVMsc0JBQXNCLEdBQUcsT0FBTztBQUM1QyxNQUFJLE9BQU8sVUFBVSxTQUFVLFFBQU8sTUFBTSxTQUFTO0FBQ3JELFNBQU87QUFDWDtBQUhnQjtBQUlULFNBQVMsT0FBTyxRQUFRO0FBQzNCLFFBQU0sTUFBTTtBQUNaLFNBQU87QUFBQSxJQUNILElBQUksUUFBUztBQUNULFVBQUksQ0FBQyxLQUFLO0FBQ04sY0FBTSxRQUFRLE9BQU87QUFDckIsZUFBTyxlQUFlLE1BQU0sU0FBUztBQUFBLFVBQ2pDO0FBQUEsUUFDSixDQUFDO0FBQ0QsZUFBTztBQUFBLE1BQ1g7QUFDQSxZQUFNLElBQUksTUFBTSwwQkFBMEI7QUFBQSxJQUM5QztBQUFBLEVBQ0o7QUFDSjtBQWRnQjtBQWVULFNBQVMsUUFBUSxPQUFPO0FBQzNCLFNBQU8sVUFBVSxRQUFRLFVBQVU7QUFDdkM7QUFGZ0I7QUFHVCxTQUFTLFdBQVcsUUFBUTtBQUMvQixRQUFNLFFBQVEsT0FBTyxXQUFXLEdBQUcsSUFBSSxJQUFJO0FBQzNDLFFBQU0sTUFBTSxPQUFPLFNBQVMsR0FBRyxJQUFJLE9BQU8sU0FBUyxJQUFJLE9BQU87QUFDOUQsU0FBTyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQ2xDO0FBSmdCO0FBS1QsU0FBUyxtQkFBbUIsS0FBSyxNQUFNO0FBQzFDLFFBQU0sZUFBZSxJQUFJLFNBQVMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSTtBQUN6RCxRQUFNLGFBQWEsS0FBSyxTQUFTO0FBQ2pDLE1BQUksZ0JBQWdCLFdBQVcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxLQUFLLElBQUk7QUFDcEQsTUFBSSxpQkFBaUIsS0FBSyxXQUFXLEtBQUssVUFBVSxHQUFHO0FBQ25ELFVBQU0sUUFBUSxXQUFXLE1BQU0sWUFBWTtBQUMzQyxRQUFJLFFBQVEsQ0FBQyxHQUFHO0FBQ1oscUJBQWUsT0FBTyxTQUFTLE1BQU0sQ0FBQyxDQUFDO0FBQUEsSUFDM0M7QUFBQSxFQUNKO0FBQ0EsUUFBTSxXQUFXLGNBQWMsZUFBZSxjQUFjO0FBQzVELFFBQU0sU0FBUyxPQUFPLFNBQVMsSUFBSSxRQUFRLFFBQVEsRUFBRSxRQUFRLEtBQUssRUFBRSxDQUFDO0FBQ3JFLFFBQU0sVUFBVSxPQUFPLFNBQVMsS0FBSyxRQUFRLFFBQVEsRUFBRSxRQUFRLEtBQUssRUFBRSxDQUFDO0FBQ3ZFLFNBQU8sU0FBUyxVQUFVLE1BQU07QUFDcEM7QUFkZ0I7QUFlaEIsSUFBTSxhQUFhLE9BQU8sWUFBWTtBQUMvQixTQUFTLFdBQVdDLFNBQVEsS0FBSyxRQUFRO0FBQzVDLE1BQUksUUFBUTtBQUNaLFNBQU8sZUFBZUEsU0FBUSxLQUFLO0FBQUEsSUFDL0IsTUFBTztBQUNILFVBQUksVUFBVSxZQUFZO0FBRXRCLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxVQUFVLFFBQVc7QUFDckIsZ0JBQVE7QUFDUixnQkFBUSxPQUFPO0FBQUEsTUFDbkI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsSUFBSyxHQUFHO0FBQ0osYUFBTyxlQUFlQSxTQUFRLEtBQUs7QUFBQSxRQUMvQixPQUFPO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFFTDtBQUFBLElBQ0EsY0FBYztBQUFBLEVBQ2xCLENBQUM7QUFDTDtBQXRCZ0I7QUF1QlQsU0FBUyxZQUFZLEtBQUs7QUFDN0IsU0FBTyxPQUFPLE9BQU8sT0FBTyxlQUFlLEdBQUcsR0FBRyxPQUFPLDBCQUEwQixHQUFHLENBQUM7QUFDMUY7QUFGZ0I7QUFHVCxTQUFTLFdBQVcsUUFBUSxNQUFNLE9BQU87QUFDNUMsU0FBTyxlQUFlLFFBQVEsTUFBTTtBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixZQUFZO0FBQUEsSUFDWixjQUFjO0FBQUEsRUFDbEIsQ0FBQztBQUNMO0FBUGdCO0FBUVQsU0FBUyxhQUFhLE1BQU07QUFDL0IsUUFBTSxvQkFBb0IsQ0FBQztBQUMzQixhQUFXLE9BQU8sTUFBSztBQUNuQixVQUFNLGNBQWMsT0FBTywwQkFBMEIsR0FBRztBQUN4RCxXQUFPLE9BQU8sbUJBQW1CLFdBQVc7QUFBQSxFQUNoRDtBQUNBLFNBQU8sT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLGlCQUFpQjtBQUN4RDtBQVBnQjtBQVFULFNBQVMsU0FBUyxRQUFRO0FBQzdCLFNBQU8sVUFBVSxPQUFPLEtBQUssR0FBRztBQUNwQztBQUZnQjtBQUdULFNBQVMsaUJBQWlCLEtBQUssTUFBTTtBQUN4QyxNQUFJLENBQUMsS0FBTSxRQUFPO0FBQ2xCLFNBQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxRQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUc7QUFDbEQ7QUFIZ0I7QUFJVCxTQUFTLGlCQUFpQixhQUFhO0FBQzFDLFFBQU0sT0FBTyxPQUFPLEtBQUssV0FBVztBQUNwQyxRQUFNLFdBQVcsS0FBSyxJQUFJLENBQUMsUUFBTSxZQUFZLEdBQUcsQ0FBQztBQUNqRCxTQUFPLFFBQVEsSUFBSSxRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVU7QUFDekMsVUFBTSxjQUFjLENBQUM7QUFDckIsYUFBUSxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSTtBQUNoQyxrQkFBWSxLQUFLLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUFBLElBQ3BDO0FBQ0EsV0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNMO0FBVmdCO0FBV1QsU0FBUyxhQUFhLFNBQVMsSUFBSTtBQUN0QyxRQUFNLFFBQVE7QUFDZCxNQUFJLE1BQU07QUFDVixXQUFRLElBQUksR0FBRyxJQUFJLFFBQVEsS0FBSTtBQUMzQixXQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDekQ7QUFDQSxTQUFPO0FBQ1g7QUFQZ0I7QUFRVCxTQUFTLElBQUksS0FBSztBQUNyQixTQUFPLEtBQUssVUFBVSxHQUFHO0FBQzdCO0FBRmdCO0FBR1QsSUFBTSxvQkFBb0IsdUJBQXVCLFFBQVEsTUFBTSxvQkFBb0IsSUFBSSxVQUFRO0FBQUM7QUFDaEcsU0FBUyxTQUFTLE1BQU07QUFDM0IsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsQ0FBQyxNQUFNLFFBQVEsSUFBSTtBQUMzRTtBQUZnQjtBQUdULElBQU0sYUFBYSxPQUFPLE1BQUk7QUFFakMsTUFBSSxPQUFPLGNBQWMsZUFBZSxXQUFXLFdBQVcsU0FBUyxZQUFZLEdBQUc7QUFDbEYsV0FBTztBQUFBLEVBQ1g7QUFDQSxNQUFJO0FBQ0EsVUFBTSxJQUFJO0FBQ1YsUUFBSSxFQUFFLEVBQUU7QUFDUixXQUFPO0FBQUEsRUFDWCxTQUFTLEdBQUc7QUFDUixXQUFPO0FBQUEsRUFDWDtBQUNKLENBQUM7QUFDTSxTQUFTLGNBQWMsR0FBRztBQUM3QixNQUFJLFNBQVMsQ0FBQyxNQUFNLE1BQU8sUUFBTztBQUVsQyxRQUFNLE9BQU8sRUFBRTtBQUNmLE1BQUksU0FBUyxPQUFXLFFBQU87QUFFL0IsUUFBTSxPQUFPLEtBQUs7QUFDbEIsTUFBSSxTQUFTLElBQUksTUFBTSxNQUFPLFFBQU87QUFFckMsTUFBSSxPQUFPLFVBQVUsZUFBZSxLQUFLLE1BQU0sZUFBZSxNQUFNLE9BQU87QUFDdkUsV0FBTztBQUFBLEVBQ1g7QUFDQSxTQUFPO0FBQ1g7QUFiZ0I7QUFjVCxTQUFTLGFBQWEsR0FBRztBQUM1QixNQUFJLGNBQWMsQ0FBQyxFQUFHLFFBQU87QUFBQSxJQUN6QixHQUFHO0FBQUEsRUFDUDtBQUNBLE1BQUksTUFBTSxRQUFRLENBQUMsRUFBRyxRQUFPO0FBQUEsSUFDekIsR0FBRztBQUFBLEVBQ1A7QUFDQSxTQUFPO0FBQ1g7QUFSZ0I7QUFTVCxTQUFTLFFBQVEsTUFBTTtBQUMxQixNQUFJLFdBQVc7QUFDZixhQUFVLE9BQU8sTUFBSztBQUNsQixRQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssTUFBTSxHQUFHLEdBQUc7QUFDakQ7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQVJnQjtBQVNULElBQU0sZ0JBQWdCLHdCQUFDLFNBQU87QUFDakMsUUFBTSxJQUFJLE9BQU87QUFDakIsVUFBTyxHQUFFO0FBQUEsSUFDTCxLQUFLO0FBQ0QsYUFBTztBQUFBLElBQ1gsS0FBSztBQUNELGFBQU87QUFBQSxJQUNYLEtBQUs7QUFDRCxhQUFPLE9BQU8sTUFBTSxJQUFJLElBQUksUUFBUTtBQUFBLElBQ3hDLEtBQUs7QUFDRCxhQUFPO0FBQUEsSUFDWCxLQUFLO0FBQ0QsYUFBTztBQUFBLElBQ1gsS0FBSztBQUNELGFBQU87QUFBQSxJQUNYLEtBQUs7QUFDRCxhQUFPO0FBQUEsSUFDWCxLQUFLO0FBQ0QsVUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3JCLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxTQUFTLE1BQU07QUFDZixlQUFPO0FBQUEsTUFDWDtBQUNBLFVBQUksS0FBSyxRQUFRLE9BQU8sS0FBSyxTQUFTLGNBQWMsS0FBSyxTQUFTLE9BQU8sS0FBSyxVQUFVLFlBQVk7QUFDaEcsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLE9BQU8sUUFBUSxlQUFlLGdCQUFnQixLQUFLO0FBQ25ELGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxPQUFPLFFBQVEsZUFBZSxnQkFBZ0IsS0FBSztBQUNuRCxlQUFPO0FBQUEsTUFDWDtBQUNBLFVBQUksT0FBTyxTQUFTLGVBQWUsZ0JBQWdCLE1BQU07QUFDckQsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLE9BQU8sU0FBUyxlQUFlLGdCQUFnQixNQUFNO0FBQ3JELGVBQU87QUFBQSxNQUNYO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDSSxZQUFNLElBQUksTUFBTSxzQkFBc0IsQ0FBQyxFQUFFO0FBQUEsRUFDakQ7QUFDSixHQTVDNkI7QUE2Q3RCLElBQU0sbUJBQW1CLG9CQUFJLElBQUk7QUFBQSxFQUNwQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0osQ0FBQztBQUNNLElBQU0saUJBQWlCLG9CQUFJLElBQUk7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0osQ0FBQztBQUNNLFNBQVMsWUFBWSxLQUFLO0FBQzdCLFNBQU8sSUFBSSxRQUFRLHVCQUF1QixNQUFNO0FBQ3BEO0FBRmdCO0FBSVQsU0FBUyxNQUFNLE1BQU0sS0FBSyxRQUFRO0FBQ3JDLFFBQU0sS0FBSyxJQUFJLEtBQUssS0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLLEdBQUc7QUFDcEQsTUFBSSxDQUFDLE9BQU8sUUFBUSxPQUFRLElBQUcsS0FBSyxTQUFTO0FBQzdDLFNBQU87QUFDWDtBQUpnQjtBQUtULFNBQVMsZ0JBQWdCLFNBQVM7QUFDckMsUUFBTSxTQUFTO0FBQ2YsTUFBSSxDQUFDLE9BQVEsUUFBTyxDQUFDO0FBQ3JCLE1BQUksT0FBTyxXQUFXLFNBQVUsUUFBTztBQUFBLElBQ25DLE9BQU8sNkJBQUksUUFBSjtBQUFBLEVBQ1g7QUFDQSxNQUFJLFFBQVEsWUFBWSxRQUFXO0FBQy9CLFFBQUksUUFBUSxVQUFVLE9BQVcsT0FBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQ25HLFdBQU8sUUFBUSxPQUFPO0FBQUEsRUFDMUI7QUFDQSxTQUFPLE9BQU87QUFDZCxNQUFJLE9BQU8sT0FBTyxVQUFVLFNBQVUsUUFBTztBQUFBLElBQ3pDLEdBQUc7QUFBQSxJQUNILE9BQU8sNkJBQUksT0FBTyxPQUFYO0FBQUEsRUFDWDtBQUNBLFNBQU87QUFDWDtBQWhCZ0I7QUFpQlQsU0FBUyx1QkFBdUIsUUFBUTtBQUMzQyxNQUFJO0FBQ0osU0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHO0FBQUEsSUFDakIsSUFBSyxHQUFHLE1BQU0sVUFBVTtBQUNwQixpQkFBVyxTQUFTLE9BQU87QUFDM0IsYUFBTyxRQUFRLElBQUksUUFBUSxNQUFNLFFBQVE7QUFBQSxJQUM3QztBQUFBLElBQ0EsSUFBSyxHQUFHLE1BQU0sT0FBTyxVQUFVO0FBQzNCLGlCQUFXLFNBQVMsT0FBTztBQUMzQixhQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDcEQ7QUFBQSxJQUNBLElBQUssR0FBRyxNQUFNO0FBQ1YsaUJBQVcsU0FBUyxPQUFPO0FBQzNCLGFBQU8sUUFBUSxJQUFJLFFBQVEsSUFBSTtBQUFBLElBQ25DO0FBQUEsSUFDQSxlQUFnQixHQUFHLE1BQU07QUFDckIsaUJBQVcsU0FBUyxPQUFPO0FBQzNCLGFBQU8sUUFBUSxlQUFlLFFBQVEsSUFBSTtBQUFBLElBQzlDO0FBQUEsSUFDQSxRQUFTLEdBQUc7QUFDUixpQkFBVyxTQUFTLE9BQU87QUFDM0IsYUFBTyxRQUFRLFFBQVEsTUFBTTtBQUFBLElBQ2pDO0FBQUEsSUFDQSx5QkFBMEIsR0FBRyxNQUFNO0FBQy9CLGlCQUFXLFNBQVMsT0FBTztBQUMzQixhQUFPLFFBQVEseUJBQXlCLFFBQVEsSUFBSTtBQUFBLElBQ3hEO0FBQUEsSUFDQSxlQUFnQixHQUFHLE1BQU0sWUFBWTtBQUNqQyxpQkFBVyxTQUFTLE9BQU87QUFDM0IsYUFBTyxRQUFRLGVBQWUsUUFBUSxNQUFNLFVBQVU7QUFBQSxJQUMxRDtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBaENnQjtBQWlDVCxTQUFTLG1CQUFtQixPQUFPO0FBQ3RDLE1BQUksT0FBTyxVQUFVLFNBQVUsUUFBTyxNQUFNLFNBQVMsSUFBSTtBQUN6RCxNQUFJLE9BQU8sVUFBVSxTQUFVLFFBQU8sSUFBSSxLQUFLO0FBQy9DLFNBQU8sR0FBRyxLQUFLO0FBQ25CO0FBSmdCO0FBS1QsU0FBUyxhQUFhLE9BQU87QUFDaEMsU0FBTyxPQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFJO0FBQ2xDLFdBQU8sTUFBTSxDQUFDLEVBQUUsS0FBSyxVQUFVLGNBQWMsTUFBTSxDQUFDLEVBQUUsS0FBSyxXQUFXO0FBQUEsRUFDMUUsQ0FBQztBQUNMO0FBSmdCO0FBS1QsSUFBTSx1QkFBdUI7QUFBQSxFQUNoQyxTQUFTO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ0wsQ0FBQyxPQUFPO0FBQUEsSUFDUixPQUFPO0FBQUEsRUFDWDtBQUNKO0FBQ08sSUFBTSx1QkFBdUI7QUFBQSxFQUNoQyxPQUFPO0FBQUEsSUFDWSx1QkFBTyxzQkFBc0I7QUFBQSxJQUM3Qix1QkFBTyxxQkFBcUI7QUFBQSxFQUMvQztBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQ1csdUJBQU8sQ0FBQztBQUFBLElBQ1IsdUJBQU8sc0JBQXNCO0FBQUEsRUFDaEQ7QUFDSjtBQUNPLFNBQVMsS0FBSyxRQUFRLE1BQU07QUFDL0IsUUFBTSxVQUFVLE9BQU8sS0FBSztBQUM1QixRQUFNLE1BQU0sVUFBVSxPQUFPLEtBQUssS0FBSztBQUFBLElBQ25DLElBQUksUUFBUztBQUNULFlBQU0sV0FBVyxDQUFDO0FBQ2xCLGlCQUFVLE9BQU8sTUFBSztBQUNsQixZQUFJLEVBQUUsT0FBTyxRQUFRLFFBQVE7QUFDekIsZ0JBQU0sSUFBSSxNQUFNLHNCQUFzQixHQUFHLEdBQUc7QUFBQSxRQUNoRDtBQUNBLFlBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRztBQUNoQixpQkFBUyxHQUFHLElBQUksUUFBUSxNQUFNLEdBQUc7QUFBQSxNQUNyQztBQUNBLGlCQUFXLE1BQU0sU0FBUyxRQUFRO0FBQ2xDLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxFQUNiLENBQUM7QUFDRCxTQUFPLE1BQU0sUUFBUSxHQUFHO0FBQzVCO0FBbEJnQjtBQW1CVCxTQUFTLEtBQUssUUFBUSxNQUFNO0FBQy9CLFFBQU0sVUFBVSxPQUFPLEtBQUs7QUFDNUIsUUFBTSxNQUFNLFVBQVUsT0FBTyxLQUFLLEtBQUs7QUFBQSxJQUNuQyxJQUFJLFFBQVM7QUFDVCxZQUFNLFdBQVc7QUFBQSxRQUNiLEdBQUcsT0FBTyxLQUFLLElBQUk7QUFBQSxNQUN2QjtBQUNBLGlCQUFVLE9BQU8sTUFBSztBQUNsQixZQUFJLEVBQUUsT0FBTyxRQUFRLFFBQVE7QUFDekIsZ0JBQU0sSUFBSSxNQUFNLHNCQUFzQixHQUFHLEdBQUc7QUFBQSxRQUNoRDtBQUNBLFlBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRztBQUNoQixlQUFPLFNBQVMsR0FBRztBQUFBLE1BQ3ZCO0FBQ0EsaUJBQVcsTUFBTSxTQUFTLFFBQVE7QUFDbEMsYUFBTztBQUFBLElBQ1g7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLEVBQ2IsQ0FBQztBQUNELFNBQU8sTUFBTSxRQUFRLEdBQUc7QUFDNUI7QUFwQmdCO0FBcUJULFNBQVMsT0FBTyxRQUFRLE9BQU87QUFDbEMsTUFBSSxDQUFDLGNBQWMsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLGtEQUFrRDtBQUFBLEVBQ3RFO0FBQ0EsUUFBTSxTQUFTLE9BQU8sS0FBSyxJQUFJO0FBQy9CLFFBQU0sWUFBWSxVQUFVLE9BQU8sU0FBUztBQUM1QyxNQUFJLFdBQVc7QUFDWCxVQUFNLElBQUksTUFBTSx3RkFBd0Y7QUFBQSxFQUM1RztBQUNBLFFBQU0sTUFBTSxVQUFVLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDbkMsSUFBSSxRQUFTO0FBQ1QsWUFBTSxTQUFTO0FBQUEsUUFDWCxHQUFHLE9BQU8sS0FBSyxJQUFJO0FBQUEsUUFDbkIsR0FBRztBQUFBLE1BQ1A7QUFDQSxpQkFBVyxNQUFNLFNBQVMsTUFBTTtBQUNoQyxhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsUUFBUSxDQUFDO0FBQUEsRUFDYixDQUFDO0FBQ0QsU0FBTyxNQUFNLFFBQVEsR0FBRztBQUM1QjtBQXJCZ0I7QUFzQlQsU0FBUyxXQUFXLFFBQVEsT0FBTztBQUN0QyxNQUFJLENBQUMsY0FBYyxLQUFLLEdBQUc7QUFDdkIsVUFBTSxJQUFJLE1BQU0sc0RBQXNEO0FBQUEsRUFDMUU7QUFDQSxRQUFNLE1BQU07QUFBQSxJQUNSLEdBQUcsT0FBTyxLQUFLO0FBQUEsSUFDZixJQUFJLFFBQVM7QUFDVCxZQUFNLFNBQVM7QUFBQSxRQUNYLEdBQUcsT0FBTyxLQUFLLElBQUk7QUFBQSxRQUNuQixHQUFHO0FBQUEsTUFDUDtBQUNBLGlCQUFXLE1BQU0sU0FBUyxNQUFNO0FBQ2hDLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxRQUFRLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDNUI7QUFDQSxTQUFPLE1BQU0sUUFBUSxHQUFHO0FBQzVCO0FBakJnQjtBQWtCVCxTQUFTLE1BQU0sR0FBRyxHQUFHO0FBQ3hCLFFBQU0sTUFBTSxVQUFVLEVBQUUsS0FBSyxLQUFLO0FBQUEsSUFDOUIsSUFBSSxRQUFTO0FBQ1QsWUFBTSxTQUFTO0FBQUEsUUFDWCxHQUFHLEVBQUUsS0FBSyxJQUFJO0FBQUEsUUFDZCxHQUFHLEVBQUUsS0FBSyxJQUFJO0FBQUEsTUFDbEI7QUFDQSxpQkFBVyxNQUFNLFNBQVMsTUFBTTtBQUNoQyxhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsSUFBSSxXQUFZO0FBQ1osYUFBTyxFQUFFLEtBQUssSUFBSTtBQUFBLElBQ3RCO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxFQUNiLENBQUM7QUFDRCxTQUFPLE1BQU0sR0FBRyxHQUFHO0FBQ3ZCO0FBaEJnQjtBQWlCVCxTQUFTLFFBQVFDLFFBQU8sUUFBUSxNQUFNO0FBQ3pDLFFBQU0sTUFBTSxVQUFVLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDbkMsSUFBSSxRQUFTO0FBQ1QsWUFBTSxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQ2pDLFlBQU0sUUFBUTtBQUFBLFFBQ1YsR0FBRztBQUFBLE1BQ1A7QUFDQSxVQUFJLE1BQU07QUFDTixtQkFBVSxPQUFPLE1BQUs7QUFDbEIsY0FBSSxFQUFFLE9BQU8sV0FBVztBQUNwQixrQkFBTSxJQUFJLE1BQU0sc0JBQXNCLEdBQUcsR0FBRztBQUFBLFVBQ2hEO0FBQ0EsY0FBSSxDQUFDLEtBQUssR0FBRyxFQUFHO0FBRWhCLGdCQUFNLEdBQUcsSUFBSUEsU0FBUSxJQUFJQSxPQUFNO0FBQUEsWUFDM0IsTUFBTTtBQUFBLFlBQ04sV0FBVyxTQUFTLEdBQUc7QUFBQSxVQUMzQixDQUFDLElBQUksU0FBUyxHQUFHO0FBQUEsUUFDckI7QUFBQSxNQUNKLE9BQU87QUFDSCxtQkFBVSxPQUFPLFVBQVM7QUFFdEIsZ0JBQU0sR0FBRyxJQUFJQSxTQUFRLElBQUlBLE9BQU07QUFBQSxZQUMzQixNQUFNO0FBQUEsWUFDTixXQUFXLFNBQVMsR0FBRztBQUFBLFVBQzNCLENBQUMsSUFBSSxTQUFTLEdBQUc7QUFBQSxRQUNyQjtBQUFBLE1BQ0o7QUFDQSxpQkFBVyxNQUFNLFNBQVMsS0FBSztBQUMvQixhQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsUUFBUSxDQUFDO0FBQUEsRUFDYixDQUFDO0FBQ0QsU0FBTyxNQUFNLFFBQVEsR0FBRztBQUM1QjtBQWxDZ0I7QUFtQ1QsU0FBUyxTQUFTQSxRQUFPLFFBQVEsTUFBTTtBQUMxQyxRQUFNLE1BQU0sVUFBVSxPQUFPLEtBQUssS0FBSztBQUFBLElBQ25DLElBQUksUUFBUztBQUNULFlBQU0sV0FBVyxPQUFPLEtBQUssSUFBSTtBQUNqQyxZQUFNLFFBQVE7QUFBQSxRQUNWLEdBQUc7QUFBQSxNQUNQO0FBQ0EsVUFBSSxNQUFNO0FBQ04sbUJBQVUsT0FBTyxNQUFLO0FBQ2xCLGNBQUksRUFBRSxPQUFPLFFBQVE7QUFDakIsa0JBQU0sSUFBSSxNQUFNLHNCQUFzQixHQUFHLEdBQUc7QUFBQSxVQUNoRDtBQUNBLGNBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRztBQUVoQixnQkFBTSxHQUFHLElBQUksSUFBSUEsT0FBTTtBQUFBLFlBQ25CLE1BQU07QUFBQSxZQUNOLFdBQVcsU0FBUyxHQUFHO0FBQUEsVUFDM0IsQ0FBQztBQUFBLFFBQ0w7QUFBQSxNQUNKLE9BQU87QUFDSCxtQkFBVSxPQUFPLFVBQVM7QUFFdEIsZ0JBQU0sR0FBRyxJQUFJLElBQUlBLE9BQU07QUFBQSxZQUNuQixNQUFNO0FBQUEsWUFDTixXQUFXLFNBQVMsR0FBRztBQUFBLFVBQzNCLENBQUM7QUFBQSxRQUNMO0FBQUEsTUFDSjtBQUNBLGlCQUFXLE1BQU0sU0FBUyxLQUFLO0FBQy9CLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxFQUNiLENBQUM7QUFDRCxTQUFPLE1BQU0sUUFBUSxHQUFHO0FBQzVCO0FBbENnQjtBQW9DVCxTQUFTLFFBQVEsR0FBRyxhQUFhLEdBQUc7QUFDdkMsTUFBSSxFQUFFLFlBQVksS0FBTSxRQUFPO0FBQy9CLFdBQVEsSUFBSSxZQUFZLElBQUksRUFBRSxPQUFPLFFBQVEsS0FBSTtBQUM3QyxRQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsYUFBYSxNQUFNO0FBQ2hDLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQVJnQjtBQVNULFNBQVMsYUFBYSxNQUFNLFFBQVE7QUFDdkMsU0FBTyxPQUFPLElBQUksQ0FBQyxRQUFNO0FBQ3JCLFFBQUk7QUFDSixLQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQy9CLFFBQUksS0FBSyxRQUFRLElBQUk7QUFDckIsV0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNMO0FBUGdCO0FBUVQsU0FBUyxjQUFjLFNBQVM7QUFDbkMsU0FBTyxPQUFPLFlBQVksV0FBVyxVQUFVLFNBQVM7QUFDNUQ7QUFGZ0I7QUFHVCxTQUFTLGNBQWMsS0FBSyxLQUFLQyxTQUFRO0FBQzVDLFFBQU0sT0FBTztBQUFBLElBQ1QsR0FBRztBQUFBLElBQ0gsTUFBTSxJQUFJLFFBQVEsQ0FBQztBQUFBLEVBQ3ZCO0FBRUEsTUFBSSxDQUFDLElBQUksU0FBUztBQUNkLFVBQU0sVUFBVSxjQUFjLElBQUksTUFBTSxLQUFLLEtBQUssUUFBUSxHQUFHLENBQUMsS0FBSyxjQUFjLEtBQUssUUFBUSxHQUFHLENBQUMsS0FBSyxjQUFjQSxRQUFPLGNBQWMsR0FBRyxDQUFDLEtBQUssY0FBY0EsUUFBTyxjQUFjLEdBQUcsQ0FBQyxLQUFLO0FBQy9MLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBRUEsU0FBTyxLQUFLO0FBQ1osU0FBTyxLQUFLO0FBQ1osTUFBSSxDQUFDLEtBQUssYUFBYTtBQUNuQixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUNBLFNBQU87QUFDWDtBQWpCZ0I7QUFrQlQsU0FBUyxpQkFBaUIsT0FBTztBQUNwQyxNQUFJLGlCQUFpQixJQUFLLFFBQU87QUFDakMsTUFBSSxpQkFBaUIsSUFBSyxRQUFPO0FBRWpDLE1BQUksaUJBQWlCLEtBQU0sUUFBTztBQUNsQyxTQUFPO0FBQ1g7QUFOZ0I7QUFPVCxTQUFTLG9CQUFvQixPQUFPO0FBQ3ZDLE1BQUksTUFBTSxRQUFRLEtBQUssRUFBRyxRQUFPO0FBQ2pDLE1BQUksT0FBTyxVQUFVLFNBQVUsUUFBTztBQUN0QyxTQUFPO0FBQ1g7QUFKZ0I7QUFLVCxTQUFTLFNBQVMsTUFBTTtBQUMzQixRQUFNLENBQUMsS0FBSyxPQUFPLElBQUksSUFBSTtBQUMzQixNQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLFdBQU87QUFBQSxNQUNILFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUFBLElBQ0gsR0FBRztBQUFBLEVBQ1A7QUFDSjtBQWJnQjtBQWNULFNBQVMsVUFBVSxLQUFLO0FBQzNCLFNBQU8sT0FBTyxRQUFRLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBSTtBQUV4QyxXQUFPLE9BQU8sTUFBTSxPQUFPLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFBQSxFQUM5QyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQUssR0FBRyxDQUFDLENBQUM7QUFDdEI7QUFMZ0I7QUFPVCxTQUFTLG1CQUFtQkMsU0FBUTtBQUN2QyxRQUFNLGVBQWUsS0FBS0EsT0FBTTtBQUNoQyxRQUFNLFFBQVEsSUFBSSxXQUFXLGFBQWEsTUFBTTtBQUNoRCxXQUFRLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUFJO0FBQ3hDLFVBQU0sQ0FBQyxJQUFJLGFBQWEsV0FBVyxDQUFDO0FBQUEsRUFDeEM7QUFDQSxTQUFPO0FBQ1g7QUFQZ0I7QUFRVCxTQUFTLG1CQUFtQixPQUFPO0FBQ3RDLE1BQUksZUFBZTtBQUNuQixXQUFRLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFJO0FBQ2pDLG9CQUFnQixPQUFPLGFBQWEsTUFBTSxDQUFDLENBQUM7QUFBQSxFQUNoRDtBQUNBLFNBQU8sS0FBSyxZQUFZO0FBQzVCO0FBTmdCO0FBT1QsU0FBUyxzQkFBc0JDLFlBQVc7QUFDN0MsUUFBTUQsVUFBU0MsV0FBVSxRQUFRLE1BQU0sR0FBRyxFQUFFLFFBQVEsTUFBTSxHQUFHO0FBQzdELFFBQU0sVUFBVSxJQUFJLFFBQVEsSUFBSUQsUUFBTyxTQUFTLEtBQUssQ0FBQztBQUN0RCxTQUFPLG1CQUFtQkEsVUFBUyxPQUFPO0FBQzlDO0FBSmdCO0FBS1QsU0FBUyxzQkFBc0IsT0FBTztBQUN6QyxTQUFPLG1CQUFtQixLQUFLLEVBQUUsUUFBUSxPQUFPLEdBQUcsRUFBRSxRQUFRLE9BQU8sR0FBRyxFQUFFLFFBQVEsTUFBTSxFQUFFO0FBQzdGO0FBRmdCO0FBR1QsU0FBUyxnQkFBZ0IsS0FBSztBQUNqQyxRQUFNLFdBQVcsSUFBSSxRQUFRLE9BQU8sRUFBRTtBQUN0QyxNQUFJLFNBQVMsU0FBUyxNQUFNLEdBQUc7QUFDM0IsVUFBTSxJQUFJLE1BQU0sMkJBQTJCO0FBQUEsRUFDL0M7QUFDQSxRQUFNLFFBQVEsSUFBSSxXQUFXLFNBQVMsU0FBUyxDQUFDO0FBQ2hELFdBQVEsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUssR0FBRTtBQUN2QyxVQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sU0FBUyxTQUFTLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQUEsRUFDL0Q7QUFDQSxTQUFPO0FBQ1g7QUFWZ0I7QUFXVCxTQUFTLGdCQUFnQixPQUFPO0FBQ25DLFNBQU8sTUFBTSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDOUU7QUFGZ0I7QUFJVCxJQUFNLFFBQU4sTUFBWTtBQUFBLEVBM21CbkIsT0EybUJtQjtBQUFBO0FBQUE7QUFBQSxFQUNmLGVBQWUsT0FBTTtBQUFBLEVBQUM7QUFDMUI7OztBQzNtQkEsSUFBTSxjQUFjLHdCQUFDLE1BQU0sUUFBTTtBQUM3QixPQUFLLE9BQU87QUFDWixTQUFPLGVBQWUsTUFBTSxRQUFRO0FBQUEsSUFDaEMsT0FBTyxLQUFLO0FBQUEsSUFDWixZQUFZO0FBQUEsRUFDaEIsQ0FBQztBQUNELFNBQU8sZUFBZSxNQUFNLFVBQVU7QUFBQSxJQUNsQyxPQUFPO0FBQUEsSUFDUCxZQUFZO0FBQUEsRUFDaEIsQ0FBQztBQUNELE9BQUssVUFBVSxLQUFLLFVBQVUsS0FBVSx1QkFBdUIsQ0FBQztBQUNoRSxTQUFPLGVBQWUsTUFBTSxZQUFZO0FBQUEsSUFDcEMsT0FBTyw2QkFBSSxLQUFLLFNBQVQ7QUFBQSxJQUNQLFlBQVk7QUFBQSxFQUNoQixDQUFDO0FBQ0wsR0Fmb0I7QUFnQmIsSUFBTSxZQUFZLGFBQWEsYUFBYSxXQUFXO0FBQ3ZELElBQU0sZ0JBQWdCLGFBQWEsYUFBYSxhQUFhO0FBQUEsRUFDaEUsUUFBUTtBQUNaLENBQUM7QUFDTSxTQUFTLGFBQWEsT0FBTyxTQUFTLENBQUNFLFdBQVFBLE9BQU0sU0FBUztBQUNqRSxRQUFNLGNBQWMsQ0FBQztBQUNyQixRQUFNLGFBQWEsQ0FBQztBQUNwQixhQUFXLE9BQU8sTUFBTSxRQUFPO0FBQzNCLFFBQUksSUFBSSxLQUFLLFNBQVMsR0FBRztBQUNyQixrQkFBWSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN4RCxrQkFBWSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLEdBQUcsQ0FBQztBQUFBLElBQzdDLE9BQU87QUFDSCxpQkFBVyxLQUFLLE9BQU8sR0FBRyxDQUFDO0FBQUEsSUFDL0I7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUNKO0FBZmdCO0FBZ0JULFNBQVMsWUFBWSxPQUFPLFNBQVM7QUFDeEMsUUFBTSxTQUFTLFdBQVcsU0FBU0EsUUFBTztBQUN0QyxXQUFPQSxPQUFNO0FBQUEsRUFDakI7QUFDQSxRQUFNLGNBQWM7QUFBQSxJQUNoQixTQUFTLENBQUM7QUFBQSxFQUNkO0FBQ0EsUUFBTSxlQUFlLHdCQUFDQyxXQUFRO0FBQzFCLGVBQVdELFVBQVNDLE9BQU0sUUFBTztBQUM3QixVQUFJRCxPQUFNLFNBQVMsbUJBQW1CQSxPQUFNLE9BQU8sUUFBUTtBQUN2RCxRQUFBQSxPQUFNLE9BQU8sSUFBSSxDQUFDLFdBQVMsYUFBYTtBQUFBLFVBQ2hDO0FBQUEsUUFDSixDQUFDLENBQUM7QUFBQSxNQUNWLFdBQVdBLE9BQU0sU0FBUyxlQUFlO0FBQ3JDLHFCQUFhO0FBQUEsVUFDVCxRQUFRQSxPQUFNO0FBQUEsUUFDbEIsQ0FBQztBQUFBLE1BQ0wsV0FBV0EsT0FBTSxTQUFTLG1CQUFtQjtBQUN6QyxxQkFBYTtBQUFBLFVBQ1QsUUFBUUEsT0FBTTtBQUFBLFFBQ2xCLENBQUM7QUFBQSxNQUNMLFdBQVdBLE9BQU0sS0FBSyxXQUFXLEdBQUc7QUFDaEMsb0JBQVksUUFBUSxLQUFLLE9BQU9BLE1BQUssQ0FBQztBQUFBLE1BQzFDLE9BQU87QUFDSCxZQUFJLE9BQU87QUFDWCxZQUFJLElBQUk7QUFDUixlQUFNLElBQUlBLE9BQU0sS0FBSyxRQUFPO0FBQ3hCLGdCQUFNLEtBQUtBLE9BQU0sS0FBSyxDQUFDO0FBQ3ZCLGdCQUFNLFdBQVcsTUFBTUEsT0FBTSxLQUFLLFNBQVM7QUFDM0MsY0FBSSxDQUFDLFVBQVU7QUFDWCxpQkFBSyxFQUFFLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxjQUNuQixTQUFTLENBQUM7QUFBQSxZQUNkO0FBQUEsVUFDSixPQUFPO0FBQ0gsaUJBQUssRUFBRSxJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsY0FDbkIsU0FBUyxDQUFDO0FBQUEsWUFDZDtBQUNBLGlCQUFLLEVBQUUsRUFBRSxRQUFRLEtBQUssT0FBT0EsTUFBSyxDQUFDO0FBQUEsVUFDdkM7QUFDQSxpQkFBTyxLQUFLLEVBQUU7QUFDZDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0osR0FyQ3FCO0FBc0NyQixlQUFhLEtBQUs7QUFDbEIsU0FBTztBQUNYO0FBL0NnQjs7O0FDbkNULElBQU0sU0FBUyx3QkFBQyxTQUFPLENBQUMsUUFBUSxPQUFPLE1BQU0sWUFBVTtBQUN0RCxRQUFNLE1BQU0sT0FBTyxPQUFPLE9BQU8sTUFBTTtBQUFBLElBQ25DLE9BQU87QUFBQSxFQUNYLENBQUMsSUFBSTtBQUFBLElBQ0QsT0FBTztBQUFBLEVBQ1g7QUFDQSxRQUFNLFNBQVMsT0FBTyxLQUFLLElBQUk7QUFBQSxJQUMzQjtBQUFBLElBQ0EsUUFBUSxDQUFDO0FBQUEsRUFDYixHQUFHLEdBQUc7QUFDTixNQUFJLGtCQUFrQixTQUFTO0FBQzNCLFVBQU0sSUFBUyxlQUFlO0FBQUEsRUFDbEM7QUFDQSxNQUFJLE9BQU8sT0FBTyxRQUFRO0FBQ3RCLFVBQU0sSUFBSSxLQUFLLFNBQVMsT0FBTyxNQUFNLE9BQU8sT0FBTyxJQUFJLENBQUMsUUFBVyxjQUFjLEtBQUssS0FBVSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzFHLElBQUssa0JBQWtCLEdBQUcsU0FBUyxNQUFNO0FBQ3pDLFVBQU07QUFBQSxFQUNWO0FBQ0EsU0FBTyxPQUFPO0FBQ2xCLEdBbkJrQjtBQXFCZixJQUFNLGNBQWMsd0JBQUMsU0FBTyxPQUFPLFFBQVEsT0FBTyxNQUFNLFdBQVM7QUFDaEUsUUFBTSxNQUFNLE9BQU8sT0FBTyxPQUFPLE1BQU07QUFBQSxJQUNuQyxPQUFPO0FBQUEsRUFDWCxDQUFDLElBQUk7QUFBQSxJQUNELE9BQU87QUFBQSxFQUNYO0FBQ0EsTUFBSSxTQUFTLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDekI7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLEVBQ2IsR0FBRyxHQUFHO0FBQ04sTUFBSSxrQkFBa0IsUUFBUyxVQUFTLE1BQU07QUFDOUMsTUFBSSxPQUFPLE9BQU8sUUFBUTtBQUN0QixVQUFNLElBQUksS0FBSyxRQUFRLE9BQU8sTUFBTSxPQUFPLE9BQU8sSUFBSSxDQUFDLFFBQVcsY0FBYyxLQUFLLEtBQVUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN6RyxJQUFLLGtCQUFrQixHQUFHLFFBQVEsTUFBTTtBQUN4QyxVQUFNO0FBQUEsRUFDVjtBQUNBLFNBQU8sT0FBTztBQUNsQixHQWpCdUI7QUFtQnBCLElBQU0sYUFBYSx3QkFBQyxTQUFPLENBQUMsUUFBUSxPQUFPLFNBQU87QUFDakQsUUFBTSxNQUFNLE9BQU87QUFBQSxJQUNmLEdBQUc7QUFBQSxJQUNILE9BQU87QUFBQSxFQUNYLElBQUk7QUFBQSxJQUNBLE9BQU87QUFBQSxFQUNYO0FBQ0EsUUFBTSxTQUFTLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLEVBQ2IsR0FBRyxHQUFHO0FBQ04sTUFBSSxrQkFBa0IsU0FBUztBQUMzQixVQUFNLElBQVMsZUFBZTtBQUFBLEVBQ2xDO0FBQ0EsU0FBTyxPQUFPLE9BQU8sU0FBUztBQUFBLElBQzFCLFNBQVM7QUFBQSxJQUNULE9BQU8sS0FBSyxRQUFlLFdBQVcsT0FBTyxPQUFPLElBQUksQ0FBQyxRQUFXLGNBQWMsS0FBSyxLQUFVLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUMvRyxJQUFJO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxNQUFNLE9BQU87QUFBQSxFQUNqQjtBQUNKLEdBckJzQjtBQXNCbkIsSUFBTSxZQUEyQiwyQkFBa0IsYUFBYTtBQUNoRSxJQUFNLGtCQUFrQix3QkFBQyxTQUFPLE9BQU8sUUFBUSxPQUFPLFNBQU87QUFDNUQsUUFBTSxNQUFNLE9BQU8sT0FBTyxPQUFPLE1BQU07QUFBQSxJQUNuQyxPQUFPO0FBQUEsRUFDWCxDQUFDLElBQUk7QUFBQSxJQUNELE9BQU87QUFBQSxFQUNYO0FBQ0EsTUFBSSxTQUFTLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDekI7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLEVBQ2IsR0FBRyxHQUFHO0FBQ04sTUFBSSxrQkFBa0IsUUFBUyxVQUFTLE1BQU07QUFDOUMsU0FBTyxPQUFPLE9BQU8sU0FBUztBQUFBLElBQzFCLFNBQVM7QUFBQSxJQUNULE9BQU8sSUFBSSxLQUFLLE9BQU8sT0FBTyxJQUFJLENBQUMsUUFBVyxjQUFjLEtBQUssS0FBVSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFDekYsSUFBSTtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsTUFBTSxPQUFPO0FBQUEsRUFDakI7QUFDSixHQWxCMkI7QUFtQnhCLElBQU0saUJBQWdDLGdDQUF1QixhQUFhO0FBQzFFLElBQU0sVUFBVSx3QkFBQyxTQUFPLENBQUMsUUFBUSxPQUFPLFNBQU87QUFDOUMsUUFBTSxNQUFNLE9BQU8sT0FBTyxPQUFPLE1BQU07QUFBQSxJQUNuQyxXQUFXO0FBQUEsRUFDZixDQUFDLElBQUk7QUFBQSxJQUNELFdBQVc7QUFBQSxFQUNmO0FBQ0EsU0FBTyxPQUFPLElBQUksRUFBRSxRQUFRLE9BQU8sR0FBRztBQUMxQyxHQVBtQjtBQVNoQixJQUFNLFVBQVUsd0JBQUMsU0FBTyxDQUFDLFFBQVEsT0FBTyxTQUFPO0FBQzlDLFNBQU8sT0FBTyxJQUFJLEVBQUUsUUFBUSxPQUFPLElBQUk7QUFDM0MsR0FGbUI7QUFJaEIsSUFBTSxlQUFlLHdCQUFDLFNBQU8sT0FBTyxRQUFRLE9BQU8sU0FBTztBQUN6RCxRQUFNLE1BQU0sT0FBTyxPQUFPLE9BQU8sTUFBTTtBQUFBLElBQ25DLFdBQVc7QUFBQSxFQUNmLENBQUMsSUFBSTtBQUFBLElBQ0QsV0FBVztBQUFBLEVBQ2Y7QUFDQSxTQUFPLFlBQVksSUFBSSxFQUFFLFFBQVEsT0FBTyxHQUFHO0FBQy9DLEdBUHdCO0FBU3JCLElBQU0sZUFBZSx3QkFBQyxTQUFPLE9BQU8sUUFBUSxPQUFPLFNBQU87QUFDekQsU0FBTyxZQUFZLElBQUksRUFBRSxRQUFRLE9BQU8sSUFBSTtBQUNoRCxHQUZ3QjtBQUlyQixJQUFNLGNBQWMsd0JBQUMsU0FBTyxDQUFDLFFBQVEsT0FBTyxTQUFPO0FBQ2xELFFBQU0sTUFBTSxPQUFPLE9BQU8sT0FBTyxNQUFNO0FBQUEsSUFDbkMsV0FBVztBQUFBLEVBQ2YsQ0FBQyxJQUFJO0FBQUEsSUFDRCxXQUFXO0FBQUEsRUFDZjtBQUNBLFNBQU8sV0FBVyxJQUFJLEVBQUUsUUFBUSxPQUFPLEdBQUc7QUFDOUMsR0FQdUI7QUFTcEIsSUFBTSxjQUFjLHdCQUFDLFNBQU8sQ0FBQyxRQUFRLE9BQU8sU0FBTztBQUNsRCxTQUFPLFdBQVcsSUFBSSxFQUFFLFFBQVEsT0FBTyxJQUFJO0FBQy9DLEdBRnVCO0FBSXBCLElBQU0sbUJBQW1CLHdCQUFDLFNBQU8sT0FBTyxRQUFRLE9BQU8sU0FBTztBQUM3RCxRQUFNLE1BQU0sT0FBTyxPQUFPLE9BQU8sTUFBTTtBQUFBLElBQ25DLFdBQVc7QUFBQSxFQUNmLENBQUMsSUFBSTtBQUFBLElBQ0QsV0FBVztBQUFBLEVBQ2Y7QUFDQSxTQUFPLGdCQUFnQixJQUFJLEVBQUUsUUFBUSxPQUFPLEdBQUc7QUFDbkQsR0FQNEI7QUFTekIsSUFBTSxtQkFBbUIsd0JBQUMsU0FBTyxPQUFPLFFBQVEsT0FBTyxTQUFPO0FBQzdELFNBQU8sZ0JBQWdCLElBQUksRUFBRSxRQUFRLE9BQU8sSUFBSTtBQUNwRCxHQUY0Qjs7O0FDdEl6QixJQUFNLE9BQU87QUFDYixJQUFNLFFBQVE7QUFDZCxJQUFNLE9BQU87QUFDYixJQUFNLE1BQU07QUFDWixJQUFNLFFBQVE7QUFDZCxJQUFNLFNBQVM7QUFDcUgsSUFBTSxXQUFXO0FBRWpGLElBQU0sT0FBTztBQUc4QixJQUFNLE9BQU8sd0JBQUNFLGFBQVU7QUFDMUksTUFBSSxDQUFDQSxTQUFTLFFBQU87QUFDckIsU0FBTyxJQUFJLE9BQU8sbUNBQW1DQSxRQUFPLHlEQUF5RDtBQUN6SCxHQUhtSTtBQU8xRixJQUFNLFFBQVE7QUFPdkQsSUFBTSxTQUFTO0FBQ1IsU0FBUyxRQUFRO0FBQ3BCLFNBQU8sSUFBSSxPQUFPLFFBQVEsR0FBRztBQUNqQztBQUZnQjtBQUdULElBQU0sT0FBTztBQUNiLElBQU0sT0FBTztBQUNiLElBQU0sU0FBUztBQUNmLElBQU0sU0FBUztBQUVmLElBQU0sU0FBUztBQUNmLElBQU0sWUFBWTtBQUdsQixJQUFNLFdBQVc7QUFHakIsSUFBTSxPQUFPO0FBRXBCLElBQU0sYUFBYTtBQUNaLElBQU0sT0FBcUIsb0JBQUksT0FBTyxJQUFJLFVBQVUsR0FBRztBQUM5RCxTQUFTLFdBQVcsTUFBTTtBQUN0QixRQUFNLE9BQU87QUFDYixRQUFNLFFBQVEsT0FBTyxLQUFLLGNBQWMsV0FBVyxLQUFLLGNBQWMsS0FBSyxHQUFHLElBQUksS0FBSyxLQUFLLGNBQWMsSUFBSSxHQUFHLElBQUksY0FBYyxHQUFHLElBQUksbUJBQW1CLEtBQUssU0FBUyxNQUFNLEdBQUcsSUFBSTtBQUN4TCxTQUFPO0FBQ1g7QUFKUztBQUtGLFNBQVMsS0FBSyxNQUFNO0FBQ3ZCLFNBQU8sSUFBSSxPQUFPLElBQUksV0FBVyxJQUFJLENBQUMsR0FBRztBQUM3QztBQUZnQjtBQUlULFNBQVMsU0FBUyxNQUFNO0FBQzNCLFFBQU1DLFFBQU8sV0FBVztBQUFBLElBQ3BCLFdBQVcsS0FBSztBQUFBLEVBQ3BCLENBQUM7QUFDRCxRQUFNLE9BQU87QUFBQSxJQUNUO0FBQUEsRUFDSjtBQUNBLE1BQUksS0FBSyxNQUFPLE1BQUssS0FBSyxFQUFFO0FBRTVCLE1BQUksS0FBSyxPQUFRLE1BQUssS0FBSyxtQ0FBbUM7QUFDOUQsUUFBTSxZQUFZLEdBQUdBLEtBQUksTUFBTSxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQzdDLFNBQU8sSUFBSSxPQUFPLElBQUksVUFBVSxPQUFPLFNBQVMsSUFBSTtBQUN4RDtBQVpnQjtBQWFULElBQU0sU0FBUyx3QkFBQyxXQUFTO0FBQzVCLFFBQU0sUUFBUSxTQUFTLFlBQVksUUFBUSxXQUFXLENBQUMsSUFBSSxRQUFRLFdBQVcsRUFBRSxNQUFNO0FBQ3RGLFNBQU8sSUFBSSxPQUFPLElBQUksS0FBSyxHQUFHO0FBQ2xDLEdBSHNCO0FBT2YsSUFBTSxVQUFVO0FBTWhCLElBQU0sWUFBWTtBQUVsQixJQUFNLFlBQVk7OztBQzlFbEIsSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFDL0UsTUFBSTtBQUNKLE9BQUssU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUMzQixPQUFLLEtBQUssTUFBTTtBQUNoQixHQUFDLEtBQUssS0FBSyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDakQsQ0FBQztBQW1TTSxJQUFNLHFCQUFtQyxnQkFBSyxhQUFhLHNCQUFzQixDQUFDLE1BQU0sUUFBTTtBQUNqRyxNQUFJO0FBQ0osWUFBVSxLQUFLLE1BQU0sR0FBRztBQUN4QixHQUFDLEtBQUssS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFVO0FBQy9DLFVBQU0sTUFBTSxRQUFRO0FBQ3BCLFdBQU8sQ0FBTSxRQUFRLEdBQUcsS0FBSyxJQUFJLFdBQVc7QUFBQSxFQUNoRDtBQUNBLE9BQUssS0FBSyxTQUFTLEtBQUssQ0FBQ0MsVUFBTztBQUM1QixVQUFNLE9BQU9BLE1BQUssS0FBSyxJQUFJLFdBQVcsT0FBTztBQUM3QyxRQUFJLElBQUksVUFBVSxLQUFNLENBQUFBLE1BQUssS0FBSyxJQUFJLFVBQVUsSUFBSTtBQUFBLEVBQ3hELENBQUM7QUFDRCxPQUFLLEtBQUssUUFBUSxDQUFDLFlBQVU7QUFDekIsVUFBTSxRQUFRLFFBQVE7QUFDdEIsVUFBTSxTQUFTLE1BQU07QUFDckIsUUFBSSxVQUFVLElBQUksUUFBUztBQUMzQixVQUFNLFNBQWMsb0JBQW9CLEtBQUs7QUFDN0MsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BQ0EsTUFBTTtBQUFBLE1BQ04sU0FBUyxJQUFJO0FBQUEsTUFDYixXQUFXO0FBQUEsTUFDWDtBQUFBLE1BQ0E7QUFBQSxNQUNBLFVBQVUsQ0FBQyxJQUFJO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0w7QUFDSixDQUFDO0FBQ00sSUFBTSxxQkFBbUMsZ0JBQUssYUFBYSxzQkFBc0IsQ0FBQyxNQUFNLFFBQU07QUFDakcsTUFBSTtBQUNKLFlBQVUsS0FBSyxNQUFNLEdBQUc7QUFDeEIsR0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBVTtBQUMvQyxVQUFNLE1BQU0sUUFBUTtBQUNwQixXQUFPLENBQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxXQUFXO0FBQUEsRUFDaEQ7QUFDQSxPQUFLLEtBQUssU0FBUyxLQUFLLENBQUNBLFVBQU87QUFDNUIsVUFBTSxPQUFPQSxNQUFLLEtBQUssSUFBSSxXQUFXLE9BQU87QUFDN0MsUUFBSSxJQUFJLFVBQVUsS0FBTSxDQUFBQSxNQUFLLEtBQUssSUFBSSxVQUFVLElBQUk7QUFBQSxFQUN4RCxDQUFDO0FBQ0QsT0FBSyxLQUFLLFFBQVEsQ0FBQyxZQUFVO0FBQ3pCLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFVBQU0sU0FBUyxNQUFNO0FBQ3JCLFFBQUksVUFBVSxJQUFJLFFBQVM7QUFDM0IsVUFBTSxTQUFjLG9CQUFvQixLQUFLO0FBQzdDLFlBQVEsT0FBTyxLQUFLO0FBQUEsTUFDaEI7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLFNBQVMsSUFBSTtBQUFBLE1BQ2IsV0FBVztBQUFBLE1BQ1g7QUFBQSxNQUNBO0FBQUEsTUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNMO0FBQ0osQ0FBQztBQUNNLElBQU0sd0JBQXNDLGdCQUFLLGFBQWEseUJBQXlCLENBQUMsTUFBTSxRQUFNO0FBQ3ZHLE1BQUk7QUFDSixZQUFVLEtBQUssTUFBTSxHQUFHO0FBQ3hCLEdBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVU7QUFDL0MsVUFBTSxNQUFNLFFBQVE7QUFDcEIsV0FBTyxDQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksV0FBVztBQUFBLEVBQ2hEO0FBQ0EsT0FBSyxLQUFLLFNBQVMsS0FBSyxDQUFDQSxVQUFPO0FBQzVCLFVBQU0sTUFBTUEsTUFBSyxLQUFLO0FBQ3RCLFFBQUksVUFBVSxJQUFJO0FBQ2xCLFFBQUksVUFBVSxJQUFJO0FBQ2xCLFFBQUksU0FBUyxJQUFJO0FBQUEsRUFDckIsQ0FBQztBQUNELE9BQUssS0FBSyxRQUFRLENBQUMsWUFBVTtBQUN6QixVQUFNLFFBQVEsUUFBUTtBQUN0QixVQUFNLFNBQVMsTUFBTTtBQUNyQixRQUFJLFdBQVcsSUFBSSxPQUFRO0FBQzNCLFVBQU0sU0FBYyxvQkFBb0IsS0FBSztBQUM3QyxVQUFNLFNBQVMsU0FBUyxJQUFJO0FBQzVCLFlBQVEsT0FBTyxLQUFLO0FBQUEsTUFDaEI7QUFBQSxNQUNBLEdBQUcsU0FBUztBQUFBLFFBQ1IsTUFBTTtBQUFBLFFBQ04sU0FBUyxJQUFJO0FBQUEsTUFDakIsSUFBSTtBQUFBLFFBQ0EsTUFBTTtBQUFBLFFBQ04sU0FBUyxJQUFJO0FBQUEsTUFDakI7QUFBQSxNQUNBLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxNQUNQLE9BQU8sUUFBUTtBQUFBLE1BQ2Y7QUFBQSxNQUNBLFVBQVUsQ0FBQyxJQUFJO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0w7QUFDSixDQUFDO0FBQ00sSUFBTSx3QkFBc0MsZ0JBQUssYUFBYSx5QkFBeUIsQ0FBQyxNQUFNLFFBQU07QUFDdkcsTUFBSSxJQUFJO0FBQ1IsWUFBVSxLQUFLLE1BQU0sR0FBRztBQUN4QixPQUFLLEtBQUssU0FBUyxLQUFLLENBQUNBLFVBQU87QUFDNUIsVUFBTSxNQUFNQSxNQUFLLEtBQUs7QUFDdEIsUUFBSSxTQUFTLElBQUk7QUFDakIsUUFBSSxJQUFJLFNBQVM7QUFDYixVQUFJLGFBQWEsSUFBSSxXQUFXLG9CQUFJLElBQUk7QUFDeEMsVUFBSSxTQUFTLElBQUksSUFBSSxPQUFPO0FBQUEsSUFDaEM7QUFBQSxFQUNKLENBQUM7QUFDRCxNQUFJLElBQUksUUFBUyxFQUFDLEtBQUssS0FBSyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBVTtBQUM5RCxRQUFJLFFBQVEsWUFBWTtBQUN4QixRQUFJLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSyxFQUFHO0FBQ3JDLFlBQVEsT0FBTyxLQUFLO0FBQUEsTUFDaEIsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLE1BQ04sUUFBUSxJQUFJO0FBQUEsTUFDWixPQUFPLFFBQVE7QUFBQSxNQUNmLEdBQUcsSUFBSSxVQUFVO0FBQUEsUUFDYixTQUFTLElBQUksUUFBUSxTQUFTO0FBQUEsTUFDbEMsSUFBSSxDQUFDO0FBQUEsTUFDTDtBQUFBLE1BQ0EsVUFBVSxDQUFDLElBQUk7QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDTDtBQUFBLE1BQ0ssRUFBQyxLQUFLLEtBQUssTUFBTSxVQUFVLEdBQUcsUUFBUSxNQUFJO0FBQUEsRUFBQztBQUNwRCxDQUFDO0FBQ00sSUFBTSxpQkFBK0IsZ0JBQUssYUFBYSxrQkFBa0IsQ0FBQyxNQUFNLFFBQU07QUFDekYsd0JBQXNCLEtBQUssTUFBTSxHQUFHO0FBQ3BDLE9BQUssS0FBSyxRQUFRLENBQUMsWUFBVTtBQUN6QixRQUFJLFFBQVEsWUFBWTtBQUN4QixRQUFJLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSyxFQUFHO0FBQ3JDLFlBQVEsT0FBTyxLQUFLO0FBQUEsTUFDaEIsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsT0FBTyxRQUFRO0FBQUEsTUFDZixTQUFTLElBQUksUUFBUSxTQUFTO0FBQUEsTUFDOUI7QUFBQSxNQUNBLFVBQVUsQ0FBQyxJQUFJO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0w7QUFDSixDQUFDO0FBQ00sSUFBTSxxQkFBbUMsZ0JBQUssYUFBYSxzQkFBc0IsQ0FBQyxNQUFNLFFBQU07QUFDakcsTUFBSSxZQUFZLElBQUksVUFBa0I7QUFDdEMsd0JBQXNCLEtBQUssTUFBTSxHQUFHO0FBQ3hDLENBQUM7QUFDTSxJQUFNLHFCQUFtQyxnQkFBSyxhQUFhLHNCQUFzQixDQUFDLE1BQU0sUUFBTTtBQUNqRyxNQUFJLFlBQVksSUFBSSxVQUFrQjtBQUN0Qyx3QkFBc0IsS0FBSyxNQUFNLEdBQUc7QUFDeEMsQ0FBQztBQUNNLElBQU0sb0JBQWtDLGdCQUFLLGFBQWEscUJBQXFCLENBQUMsTUFBTSxRQUFNO0FBQy9GLFlBQVUsS0FBSyxNQUFNLEdBQUc7QUFDeEIsUUFBTSxlQUFvQixZQUFZLElBQUksUUFBUTtBQUNsRCxRQUFNLFVBQVUsSUFBSSxPQUFPLE9BQU8sSUFBSSxhQUFhLFdBQVcsTUFBTSxJQUFJLFFBQVEsSUFBSSxZQUFZLEtBQUssWUFBWTtBQUNqSCxNQUFJLFVBQVU7QUFDZCxPQUFLLEtBQUssU0FBUyxLQUFLLENBQUNBLFVBQU87QUFDNUIsVUFBTSxNQUFNQSxNQUFLLEtBQUs7QUFDdEIsUUFBSSxhQUFhLElBQUksV0FBVyxvQkFBSSxJQUFJO0FBQ3hDLFFBQUksU0FBUyxJQUFJLE9BQU87QUFBQSxFQUM1QixDQUFDO0FBQ0QsT0FBSyxLQUFLLFFBQVEsQ0FBQyxZQUFVO0FBQ3pCLFFBQUksUUFBUSxNQUFNLFNBQVMsSUFBSSxVQUFVLElBQUksUUFBUSxFQUFHO0FBQ3hELFlBQVEsT0FBTyxLQUFLO0FBQUEsTUFDaEIsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVSxJQUFJO0FBQUEsTUFDZCxPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsTUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNMO0FBQ0osQ0FBQztBQUNNLElBQU0sc0JBQW9DLGdCQUFLLGFBQWEsdUJBQXVCLENBQUMsTUFBTSxRQUFNO0FBQ25HLFlBQVUsS0FBSyxNQUFNLEdBQUc7QUFDeEIsUUFBTSxVQUFVLElBQUksT0FBTyxJQUFTLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSTtBQUMvRCxNQUFJLFlBQVksSUFBSSxVQUFVO0FBQzlCLE9BQUssS0FBSyxTQUFTLEtBQUssQ0FBQ0EsVUFBTztBQUM1QixVQUFNLE1BQU1BLE1BQUssS0FBSztBQUN0QixRQUFJLGFBQWEsSUFBSSxXQUFXLG9CQUFJLElBQUk7QUFDeEMsUUFBSSxTQUFTLElBQUksT0FBTztBQUFBLEVBQzVCLENBQUM7QUFDRCxPQUFLLEtBQUssUUFBUSxDQUFDLFlBQVU7QUFDekIsUUFBSSxRQUFRLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBRztBQUMxQyxZQUFRLE9BQU8sS0FBSztBQUFBLE1BQ2hCLFFBQVE7QUFBQSxNQUNSLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFFBQVEsSUFBSTtBQUFBLE1BQ1osT0FBTyxRQUFRO0FBQUEsTUFDZjtBQUFBLE1BQ0EsVUFBVSxDQUFDLElBQUk7QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDTDtBQUNKLENBQUM7QUFDTSxJQUFNLG9CQUFrQyxnQkFBSyxhQUFhLHFCQUFxQixDQUFDLE1BQU0sUUFBTTtBQUMvRixZQUFVLEtBQUssTUFBTSxHQUFHO0FBQ3hCLFFBQU0sVUFBVSxJQUFJLE9BQU8sS0FBVSxZQUFZLElBQUksTUFBTSxDQUFDLEdBQUc7QUFDL0QsTUFBSSxZQUFZLElBQUksVUFBVTtBQUM5QixPQUFLLEtBQUssU0FBUyxLQUFLLENBQUNBLFVBQU87QUFDNUIsVUFBTSxNQUFNQSxNQUFLLEtBQUs7QUFDdEIsUUFBSSxhQUFhLElBQUksV0FBVyxvQkFBSSxJQUFJO0FBQ3hDLFFBQUksU0FBUyxJQUFJLE9BQU87QUFBQSxFQUM1QixDQUFDO0FBQ0QsT0FBSyxLQUFLLFFBQVEsQ0FBQyxZQUFVO0FBQ3pCLFFBQUksUUFBUSxNQUFNLFNBQVMsSUFBSSxNQUFNLEVBQUc7QUFDeEMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixRQUFRO0FBQUEsTUFDUixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixRQUFRLElBQUk7QUFBQSxNQUNaLE9BQU8sUUFBUTtBQUFBLE1BQ2Y7QUFBQSxNQUNBLFVBQVUsQ0FBQyxJQUFJO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0w7QUFDSixDQUFDO0FBd0NNLElBQU0scUJBQW1DLGdCQUFLLGFBQWEsc0JBQXNCLENBQUMsTUFBTSxRQUFNO0FBQ2pHLFlBQVUsS0FBSyxNQUFNLEdBQUc7QUFDeEIsT0FBSyxLQUFLLFFBQVEsQ0FBQyxZQUFVO0FBQ3pCLFlBQVEsUUFBUSxJQUFJLEdBQUcsUUFBUSxLQUFLO0FBQUEsRUFDeEM7QUFDSixDQUFDOzs7QUN6aUJNLElBQU0sTUFBTixNQUFVO0FBQUEsRUFBakIsT0FBaUI7QUFBQTtBQUFBO0FBQUEsRUFDYixZQUFZLE9BQU8sQ0FBQyxHQUFFO0FBQ2xCLFNBQUssVUFBVSxDQUFDO0FBQ2hCLFNBQUssU0FBUztBQUNkLFFBQUksS0FBTSxNQUFLLE9BQU87QUFBQSxFQUMxQjtBQUFBLEVBQ0EsU0FBUyxJQUFJO0FBQ1QsU0FBSyxVQUFVO0FBQ2YsT0FBRyxJQUFJO0FBQ1AsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUNBLE1BQU0sS0FBSztBQUNQLFFBQUksT0FBTyxRQUFRLFlBQVk7QUFDM0IsVUFBSSxNQUFNO0FBQUEsUUFDTixXQUFXO0FBQUEsTUFDZixDQUFDO0FBQ0QsVUFBSSxNQUFNO0FBQUEsUUFDTixXQUFXO0FBQUEsTUFDZixDQUFDO0FBQ0Q7QUFBQSxJQUNKO0FBQ0EsVUFBTSxVQUFVO0FBQ2hCLFVBQU0sUUFBUSxRQUFRLE1BQU0sSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFJLENBQUM7QUFDL0MsVUFBTSxZQUFZLEtBQUssSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQztBQUM3RSxVQUFNLFdBQVcsTUFBTSxJQUFJLENBQUMsTUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQUksSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQztBQUM1RixlQUFXLFFBQVEsVUFBUztBQUN4QixXQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsSUFDMUI7QUFBQSxFQUNKO0FBQUEsRUFDQSxVQUFVO0FBQ04sVUFBTSxJQUFJO0FBQ1YsVUFBTSxPQUFPLE1BQU07QUFDbkIsVUFBTSxVQUFVLE1BQU0sV0FBVztBQUFBLE1BQzdCO0FBQUEsSUFDSjtBQUNBLFVBQU0sUUFBUTtBQUFBLE1BQ1YsR0FBRyxRQUFRLElBQUksQ0FBQyxNQUFJLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDaEM7QUFFQSxXQUFPLElBQUksRUFBRSxHQUFHLE1BQU0sTUFBTSxLQUFLLElBQUksQ0FBQztBQUFBLEVBQzFDO0FBQ0o7OztBQ3pDTyxJQUFNLFVBQVU7QUFBQSxFQUNuQixPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQ1g7OztBQ0dPLElBQU0sV0FBeUIsZ0JBQUssYUFBYSxZQUFZLENBQUMsTUFBTSxRQUFNO0FBQzdFLE1BQUk7QUFDSixXQUFTLE9BQU8sQ0FBQztBQUNqQixPQUFLLEtBQUssTUFBTTtBQUNoQixPQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssT0FBTyxDQUFDO0FBQ2xDLE9BQUssS0FBSyxVQUFVO0FBQ3BCLFFBQU0sU0FBUztBQUFBLElBQ1gsR0FBRyxLQUFLLEtBQUssSUFBSSxVQUFVLENBQUM7QUFBQSxFQUNoQztBQUVBLE1BQUksS0FBSyxLQUFLLE9BQU8sSUFBSSxXQUFXLEdBQUc7QUFDbkMsV0FBTyxRQUFRLElBQUk7QUFBQSxFQUN2QjtBQUNBLGFBQVcsTUFBTSxRQUFPO0FBQ3BCLGVBQVcsTUFBTSxHQUFHLEtBQUssVUFBUztBQUM5QixTQUFHLElBQUk7QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNBLE1BQUksT0FBTyxXQUFXLEdBQUc7QUFHckIsS0FBQyxLQUFLLEtBQUssTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQzdDLFNBQUssS0FBSyxVQUFVLEtBQUssTUFBSTtBQUN6QixXQUFLLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQSxJQUM5QixDQUFDO0FBQUEsRUFDTCxPQUFPO0FBQ0gsVUFBTSxZQUFZLHdCQUFDLFNBQVNDLFNBQVEsUUFBTTtBQUN0QyxVQUFJLFlBQWlCLFFBQVEsT0FBTztBQUNwQyxVQUFJO0FBQ0osaUJBQVcsTUFBTUEsU0FBTztBQUNwQixZQUFJLEdBQUcsS0FBSyxJQUFJLE1BQU07QUFDbEIsZ0JBQU0sWUFBWSxHQUFHLEtBQUssSUFBSSxLQUFLLE9BQU87QUFDMUMsY0FBSSxDQUFDLFVBQVc7QUFBQSxRQUNwQixXQUFXLFdBQVc7QUFDbEI7QUFBQSxRQUNKO0FBQ0EsY0FBTSxVQUFVLFFBQVEsT0FBTztBQUMvQixjQUFNLElBQUksR0FBRyxLQUFLLE1BQU0sT0FBTztBQUMvQixZQUFJLGFBQWEsV0FBVyxLQUFLLFVBQVUsT0FBTztBQUM5QyxnQkFBTSxJQUFTLGVBQWU7QUFBQSxRQUNsQztBQUNBLFlBQUksZUFBZSxhQUFhLFNBQVM7QUFDckMseUJBQWUsZUFBZSxRQUFRLFFBQVEsR0FBRyxLQUFLLFlBQVU7QUFDNUQsa0JBQU07QUFDTixrQkFBTSxVQUFVLFFBQVEsT0FBTztBQUMvQixnQkFBSSxZQUFZLFFBQVM7QUFDekIsZ0JBQUksQ0FBQyxVQUFXLGFBQWlCLFFBQVEsU0FBUyxPQUFPO0FBQUEsVUFDN0QsQ0FBQztBQUFBLFFBQ0wsT0FBTztBQUNILGdCQUFNLFVBQVUsUUFBUSxPQUFPO0FBQy9CLGNBQUksWUFBWSxRQUFTO0FBQ3pCLGNBQUksQ0FBQyxVQUFXLGFBQWlCLFFBQVEsU0FBUyxPQUFPO0FBQUEsUUFDN0Q7QUFBQSxNQUNKO0FBQ0EsVUFBSSxhQUFhO0FBQ2IsZUFBTyxZQUFZLEtBQUssTUFBSTtBQUN4QixpQkFBTztBQUFBLFFBQ1gsQ0FBQztBQUFBLE1BQ0w7QUFDQSxhQUFPO0FBQUEsSUFDWCxHQWxDa0I7QUE2Q2xCLFVBQU0scUJBQXFCLHdCQUFDLFFBQVEsU0FBUyxRQUFNO0FBRS9DLFVBQVMsUUFBUSxNQUFNLEdBQUc7QUFDdEIsZUFBTyxVQUFVO0FBQ2pCLGVBQU87QUFBQSxNQUNYO0FBRUEsWUFBTSxjQUFjLFVBQVUsU0FBUyxRQUFRLEdBQUc7QUFDbEQsVUFBSSx1QkFBdUIsU0FBUztBQUNoQyxZQUFJLElBQUksVUFBVSxNQUFPLE9BQU0sSUFBUyxlQUFlO0FBQ3ZELGVBQU8sWUFBWSxLQUFLLENBQUNDLGlCQUFjLEtBQUssS0FBSyxNQUFNQSxjQUFhLEdBQUcsQ0FBQztBQUFBLE1BQzVFO0FBQ0EsYUFBTyxLQUFLLEtBQUssTUFBTSxhQUFhLEdBQUc7QUFBQSxJQUMzQyxHQWIyQjtBQWMzQixTQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsUUFBTTtBQUM1QixVQUFJLElBQUksWUFBWTtBQUNoQixlQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsR0FBRztBQUFBLE1BQ3ZDO0FBQ0EsVUFBSSxJQUFJLGNBQWMsWUFBWTtBQUc5QixjQUFNLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQSxVQUMzQixPQUFPLFFBQVE7QUFBQSxVQUNmLFFBQVEsQ0FBQztBQUFBLFFBQ2IsR0FBRztBQUFBLFVBQ0MsR0FBRztBQUFBLFVBQ0gsWUFBWTtBQUFBLFFBQ2hCLENBQUM7QUFDRCxZQUFJLGtCQUFrQixTQUFTO0FBQzNCLGlCQUFPLE9BQU8sS0FBSyxDQUFDQyxZQUFTO0FBQ3pCLG1CQUFPLG1CQUFtQkEsU0FBUSxTQUFTLEdBQUc7QUFBQSxVQUNsRCxDQUFDO0FBQUEsUUFDTDtBQUNBLGVBQU8sbUJBQW1CLFFBQVEsU0FBUyxHQUFHO0FBQUEsTUFDbEQ7QUFFQSxZQUFNLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxHQUFHO0FBQzNDLFVBQUksa0JBQWtCLFNBQVM7QUFDM0IsWUFBSSxJQUFJLFVBQVUsTUFBTyxPQUFNLElBQVMsZUFBZTtBQUN2RCxlQUFPLE9BQU8sS0FBSyxDQUFDQyxZQUFTLFVBQVVBLFNBQVEsUUFBUSxHQUFHLENBQUM7QUFBQSxNQUMvRDtBQUNBLGFBQU8sVUFBVSxRQUFRLFFBQVEsR0FBRztBQUFBLElBQ3hDO0FBQUEsRUFDSjtBQUNBLE9BQUssV0FBVyxJQUFJO0FBQUEsSUFDaEIsVUFBVSx3QkFBQyxVQUFRO0FBQ2YsVUFBSTtBQUNBLGNBQU0sSUFBSSxVQUFVLE1BQU0sS0FBSztBQUMvQixlQUFPLEVBQUUsVUFBVTtBQUFBLFVBQ2YsT0FBTyxFQUFFO0FBQUEsUUFDYixJQUFJO0FBQUEsVUFDQSxRQUFRLEVBQUUsT0FBTztBQUFBLFFBQ3JCO0FBQUEsTUFDSixTQUFTLEdBQUc7QUFDUixlQUFPLGVBQWUsTUFBTSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQUksRUFBRSxVQUFVO0FBQUEsVUFDakQsT0FBTyxFQUFFO0FBQUEsUUFDYixJQUFJO0FBQUEsVUFDQSxRQUFRLEVBQUUsT0FBTztBQUFBLFFBQ3JCLENBQUM7QUFBQSxNQUNUO0FBQUEsSUFDSixHQWZVO0FBQUEsSUFnQlYsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLEVBQ2I7QUFDSixDQUFDO0FBRU0sSUFBTSxhQUEyQixnQkFBSyxhQUFhLGNBQWMsQ0FBQyxNQUFNLFFBQU07QUFDakYsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUN2QixPQUFLLEtBQUssVUFBVTtBQUFBLElBQ2hCLEdBQUcsTUFBTSxLQUFLLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDcEMsRUFBRSxJQUFJLEtBQWEsT0FBTyxLQUFLLEtBQUssR0FBRztBQUN2QyxPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsTUFBSTtBQUM1QixRQUFJLElBQUksT0FBUSxLQUFJO0FBQ2hCLGNBQVEsUUFBUSxPQUFPLFFBQVEsS0FBSztBQUFBLElBQ3hDLFNBQVNDLElBQUc7QUFBQSxJQUFDO0FBQ2IsUUFBSSxPQUFPLFFBQVEsVUFBVSxTQUFVLFFBQU87QUFDOUMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTixPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFDSixDQUFDO0FBQ00sSUFBTSxtQkFBaUMsZ0JBQUssYUFBYSxvQkFBb0IsQ0FBQyxNQUFNLFFBQU07QUFFN0YsRUFBTyxzQkFBc0IsS0FBSyxNQUFNLEdBQUc7QUFDM0MsYUFBVyxLQUFLLE1BQU0sR0FBRztBQUM3QixDQUFDO0FBQ00sSUFBTSxXQUF5QixnQkFBSyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQU07QUFDN0UsTUFBSSxZQUFZLElBQUksVUFBa0I7QUFDdEMsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQ25DLENBQUM7QUFDTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUM3RSxNQUFJLElBQUksU0FBUztBQUNiLFVBQU0sYUFBYTtBQUFBLE1BQ2YsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLElBQ1I7QUFDQSxVQUFNLElBQUksV0FBVyxJQUFJLE9BQU87QUFDaEMsUUFBSSxNQUFNLE9BQVcsT0FBTSxJQUFJLE1BQU0sMEJBQTBCLElBQUksT0FBTyxHQUFHO0FBQzdFLFFBQUksWUFBWSxJQUFJLFVBQWtCLEtBQUssQ0FBQztBQUFBLEVBQ2hELE1BQU8sS0FBSSxZQUFZLElBQUksVUFBa0IsS0FBSztBQUNsRCxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDbkMsQ0FBQztBQUNNLElBQU0sWUFBMEIsZ0JBQUssYUFBYSxhQUFhLENBQUMsTUFBTSxRQUFNO0FBQy9FLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUNuQyxDQUFDO0FBQ00sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFDM0UsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQy9CLE9BQUssS0FBSyxRQUFRLENBQUMsWUFBVTtBQUN6QixRQUFJO0FBRUEsWUFBTSxVQUFVLFFBQVEsTUFBTSxLQUFLO0FBRW5DLFlBQU0sTUFBTSxJQUFJLElBQUksT0FBTztBQUMzQixVQUFJLElBQUksVUFBVTtBQUNkLFlBQUksU0FBUyxZQUFZO0FBQ3pCLFlBQUksQ0FBQyxJQUFJLFNBQVMsS0FBSyxJQUFJLFFBQVEsR0FBRztBQUNsQyxrQkFBUSxPQUFPLEtBQUs7QUFBQSxZQUNoQixNQUFNO0FBQUEsWUFDTixRQUFRO0FBQUEsWUFDUixNQUFNO0FBQUEsWUFDTixTQUFpQixTQUFTO0FBQUEsWUFDMUIsT0FBTyxRQUFRO0FBQUEsWUFDZjtBQUFBLFlBQ0EsVUFBVSxDQUFDLElBQUk7QUFBQSxVQUNuQixDQUFDO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFDQSxVQUFJLElBQUksVUFBVTtBQUNkLFlBQUksU0FBUyxZQUFZO0FBQ3pCLFlBQUksQ0FBQyxJQUFJLFNBQVMsS0FBSyxJQUFJLFNBQVMsU0FBUyxHQUFHLElBQUksSUFBSSxTQUFTLE1BQU0sR0FBRyxFQUFFLElBQUksSUFBSSxRQUFRLEdBQUc7QUFDM0Ysa0JBQVEsT0FBTyxLQUFLO0FBQUEsWUFDaEIsTUFBTTtBQUFBLFlBQ04sUUFBUTtBQUFBLFlBQ1IsTUFBTTtBQUFBLFlBQ04sU0FBUyxJQUFJLFNBQVM7QUFBQSxZQUN0QixPQUFPLFFBQVE7QUFBQSxZQUNmO0FBQUEsWUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLFVBQ25CLENBQUM7QUFBQSxRQUNMO0FBQUEsTUFDSjtBQUVBLFVBQUksSUFBSSxXQUFXO0FBRWYsZ0JBQVEsUUFBUSxJQUFJO0FBQUEsTUFDeEIsT0FBTztBQUVILGdCQUFRLFFBQVE7QUFBQSxNQUNwQjtBQUNBO0FBQUEsSUFDSixTQUFTLEdBQUc7QUFDUixjQUFRLE9BQU8sS0FBSztBQUFBLFFBQ2hCLE1BQU07QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLE9BQU8sUUFBUTtBQUFBLFFBQ2Y7QUFBQSxRQUNBLFVBQVUsQ0FBQyxJQUFJO0FBQUEsTUFDbkIsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0osQ0FBQztBQUNNLElBQU0sWUFBMEIsZ0JBQUssYUFBYSxhQUFhLENBQUMsTUFBTSxRQUFNO0FBQy9FLE1BQUksWUFBWSxJQUFJLFVBQWtCLE1BQU07QUFDNUMsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQ25DLENBQUM7QUFDTSxJQUFNLGFBQTJCLGdCQUFLLGFBQWEsY0FBYyxDQUFDLE1BQU0sUUFBTTtBQUNqRixNQUFJLFlBQVksSUFBSSxVQUFrQjtBQUN0QyxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDbkMsQ0FBQztBQUNNLElBQU0sV0FBeUIsZ0JBQUssYUFBYSxZQUFZLENBQUMsTUFBTSxRQUFNO0FBQzdFLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUNuQyxDQUFDO0FBQ00sSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFDL0UsTUFBSSxZQUFZLElBQUksVUFBa0I7QUFDdEMsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQ25DLENBQUM7QUFDTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUM3RSxNQUFJLFlBQVksSUFBSSxVQUFrQjtBQUN0QyxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDbkMsQ0FBQztBQUNNLElBQU0sVUFBd0IsZ0JBQUssYUFBYSxXQUFXLENBQUMsTUFBTSxRQUFNO0FBQzNFLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUNuQyxDQUFDO0FBQ00sSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFDL0UsTUFBSSxZQUFZLElBQUksVUFBa0I7QUFDdEMsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQ25DLENBQUM7QUFDTSxJQUFNLGtCQUFnQyxnQkFBSyxhQUFhLG1CQUFtQixDQUFDLE1BQU0sUUFBTTtBQUMzRixNQUFJLFlBQVksSUFBSSxVQUFrQixTQUFTLEdBQUc7QUFDbEQsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQ25DLENBQUM7QUFDTSxJQUFNLGNBQTRCLGdCQUFLLGFBQWEsZUFBZSxDQUFDLE1BQU0sUUFBTTtBQUNuRixNQUFJLFlBQVksSUFBSSxVQUFrQjtBQUN0QyxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDbkMsQ0FBQztBQUNNLElBQU0sY0FBNEIsZ0JBQUssYUFBYSxlQUFlLENBQUMsTUFBTSxRQUFNO0FBQ25GLE1BQUksWUFBWSxJQUFJLFVBQWtCLEtBQUssR0FBRztBQUM5QyxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDbkMsQ0FBQztBQUNNLElBQU0sa0JBQWdDLGdCQUFLLGFBQWEsbUJBQW1CLENBQUMsTUFBTSxRQUFNO0FBQzNGLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUNuQyxDQUFDO0FBQ00sSUFBTSxXQUF5QixnQkFBSyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQU07QUFDN0UsTUFBSSxZQUFZLElBQUksVUFBa0I7QUFDdEMsbUJBQWlCLEtBQUssTUFBTSxHQUFHO0FBQy9CLE9BQUssS0FBSyxTQUFTLEtBQUssQ0FBQ0MsVUFBTztBQUM1QixVQUFNLE1BQU1BLE1BQUssS0FBSztBQUN0QixRQUFJLFNBQVM7QUFBQSxFQUNqQixDQUFDO0FBQ0wsQ0FBQztBQUNNLElBQU0sV0FBeUIsZ0JBQUssYUFBYSxZQUFZLENBQUMsTUFBTSxRQUFNO0FBQzdFLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUMvQixPQUFLLEtBQUssU0FBUyxLQUFLLENBQUNBLFVBQU87QUFDNUIsVUFBTSxNQUFNQSxNQUFLLEtBQUs7QUFDdEIsUUFBSSxTQUFTO0FBQUEsRUFDakIsQ0FBQztBQUNELE9BQUssS0FBSyxRQUFRLENBQUMsWUFBVTtBQUN6QixRQUFJO0FBRUEsVUFBSSxJQUFJLFdBQVcsUUFBUSxLQUFLLEdBQUc7QUFBQSxJQUV2QyxRQUFTO0FBQ0wsY0FBUSxPQUFPLEtBQUs7QUFBQSxRQUNoQixNQUFNO0FBQUEsUUFDTixRQUFRO0FBQUEsUUFDUixPQUFPLFFBQVE7QUFBQSxRQUNmO0FBQUEsUUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLE1BQ25CLENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSjtBQUNKLENBQUM7QUFDTSxJQUFNLGFBQTJCLGdCQUFLLGFBQWEsY0FBYyxDQUFDLE1BQU0sUUFBTTtBQUNqRixNQUFJLFlBQVksSUFBSSxVQUFrQjtBQUN0QyxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDbkMsQ0FBQztBQUNNLElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBQ2pGLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUMvQixPQUFLLEtBQUssUUFBUSxDQUFDLFlBQVU7QUFDekIsVUFBTSxRQUFRLFFBQVEsTUFBTSxNQUFNLEdBQUc7QUFDckMsUUFBSTtBQUNBLFVBQUksTUFBTSxXQUFXLEVBQUcsT0FBTSxJQUFJLE1BQU07QUFDeEMsWUFBTSxDQUFDLFNBQVMsTUFBTSxJQUFJO0FBQzFCLFVBQUksQ0FBQyxPQUFRLE9BQU0sSUFBSSxNQUFNO0FBQzdCLFlBQU0sWUFBWSxPQUFPLE1BQU07QUFDL0IsVUFBSSxHQUFHLFNBQVMsT0FBTyxPQUFRLE9BQU0sSUFBSSxNQUFNO0FBQy9DLFVBQUksWUFBWSxLQUFLLFlBQVksSUFBSyxPQUFNLElBQUksTUFBTTtBQUV0RCxVQUFJLElBQUksV0FBVyxPQUFPLEdBQUc7QUFBQSxJQUNqQyxRQUFTO0FBQ0wsY0FBUSxPQUFPLEtBQUs7QUFBQSxRQUNoQixNQUFNO0FBQUEsUUFDTixRQUFRO0FBQUEsUUFDUixPQUFPLFFBQVE7QUFBQSxRQUNmO0FBQUEsUUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLE1BQ25CLENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSjtBQUNKLENBQUM7QUFFTSxTQUFTLGNBQWMsTUFBTTtBQUNoQyxNQUFJLFNBQVMsR0FBSSxRQUFPO0FBQ3hCLE1BQUksS0FBSyxTQUFTLE1BQU0sRUFBRyxRQUFPO0FBQ2xDLE1BQUk7QUFFQSxTQUFLLElBQUk7QUFDVCxXQUFPO0FBQUEsRUFDWCxRQUFTO0FBQ0wsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQVZnQjtBQVdULElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBQ2pGLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUMvQixPQUFLLEtBQUssU0FBUyxLQUFLLENBQUNBLFVBQU87QUFDNUIsSUFBQUEsTUFBSyxLQUFLLElBQUksa0JBQWtCO0FBQUEsRUFDcEMsQ0FBQztBQUNELE9BQUssS0FBSyxRQUFRLENBQUMsWUFBVTtBQUN6QixRQUFJLGNBQWMsUUFBUSxLQUFLLEVBQUc7QUFDbEMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsTUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNMO0FBQ0osQ0FBQztBQUVNLFNBQVMsaUJBQWlCLE1BQU07QUFDbkMsTUFBSSxDQUFTLFVBQVUsS0FBSyxJQUFJLEVBQUcsUUFBTztBQUMxQyxRQUFNQyxVQUFTLEtBQUssUUFBUSxTQUFTLENBQUMsTUFBSSxNQUFNLE1BQU0sTUFBTSxHQUFHO0FBQy9ELFFBQU0sU0FBU0EsUUFBTyxPQUFPLEtBQUssS0FBS0EsUUFBTyxTQUFTLENBQUMsSUFBSSxHQUFHLEdBQUc7QUFDbEUsU0FBTyxjQUFjLE1BQU07QUFDL0I7QUFMZ0I7QUFNVCxJQUFNLGdCQUE4QixnQkFBSyxhQUFhLGlCQUFpQixDQUFDLE1BQU0sUUFBTTtBQUN2RixNQUFJLFlBQVksSUFBSSxVQUFrQjtBQUN0QyxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDL0IsT0FBSyxLQUFLLFNBQVMsS0FBSyxDQUFDRCxVQUFPO0FBQzVCLElBQUFBLE1BQUssS0FBSyxJQUFJLGtCQUFrQjtBQUFBLEVBQ3BDLENBQUM7QUFDRCxPQUFLLEtBQUssUUFBUSxDQUFDLFlBQVU7QUFDekIsUUFBSSxpQkFBaUIsUUFBUSxLQUFLLEVBQUc7QUFDckMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsTUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNMO0FBQ0osQ0FBQztBQUNNLElBQU0sV0FBeUIsZ0JBQUssYUFBYSxZQUFZLENBQUMsTUFBTSxRQUFNO0FBQzdFLE1BQUksWUFBWSxJQUFJLFVBQWtCO0FBQ3RDLG1CQUFpQixLQUFLLE1BQU0sR0FBRztBQUNuQyxDQUFDO0FBRU0sU0FBUyxXQUFXLE9BQU8sWUFBWSxNQUFNO0FBQ2hELE1BQUk7QUFDQSxVQUFNLGNBQWMsTUFBTSxNQUFNLEdBQUc7QUFDbkMsUUFBSSxZQUFZLFdBQVcsRUFBRyxRQUFPO0FBQ3JDLFVBQU0sQ0FBQyxNQUFNLElBQUk7QUFDakIsUUFBSSxDQUFDLE9BQVEsUUFBTztBQUVwQixVQUFNLGVBQWUsS0FBSyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQzVDLFFBQUksU0FBUyxnQkFBZ0IsY0FBYyxRQUFRLE1BQU8sUUFBTztBQUNqRSxRQUFJLENBQUMsYUFBYSxJQUFLLFFBQU87QUFDOUIsUUFBSSxjQUFjLEVBQUUsU0FBUyxpQkFBaUIsYUFBYSxRQUFRLFdBQVksUUFBTztBQUN0RixXQUFPO0FBQUEsRUFDWCxRQUFTO0FBQ0wsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQWZnQjtBQWdCVCxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUMzRSxtQkFBaUIsS0FBSyxNQUFNLEdBQUc7QUFDL0IsT0FBSyxLQUFLLFFBQVEsQ0FBQyxZQUFVO0FBQ3pCLFFBQUksV0FBVyxRQUFRLE9BQU8sSUFBSSxHQUFHLEVBQUc7QUFDeEMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsTUFDQSxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNMO0FBQ0osQ0FBQztBQTBDTSxJQUFNLGNBQTRCLGdCQUFLLGFBQWEsZUFBZSxDQUFDLE1BQU0sUUFBTTtBQUNuRixXQUFTLEtBQUssTUFBTSxHQUFHO0FBQ3ZCLE9BQUssS0FBSyxVQUFrQjtBQUM1QixPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsU0FBTztBQUMvQixRQUFJLElBQUksT0FBUSxLQUFJO0FBQ2hCLGNBQVEsUUFBUSxRQUFRLFFBQVEsS0FBSztBQUFBLElBQ3pDLFNBQVMsR0FBRztBQUFBLElBQUM7QUFDYixVQUFNLFFBQVEsUUFBUTtBQUN0QixRQUFJLE9BQU8sVUFBVSxVQUFXLFFBQU87QUFDdkMsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDWDtBQUNKLENBQUM7QUE4RU0sSUFBTSxjQUE0QixnQkFBSyxhQUFhLGVBQWUsQ0FBQyxNQUFNLFFBQU07QUFDbkYsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUN2QixPQUFLLEtBQUssUUFBUSxDQUFDLFlBQVU7QUFDakMsQ0FBQztBQUNNLElBQU0sWUFBMEIsZ0JBQUssYUFBYSxhQUFhLENBQUMsTUFBTSxRQUFNO0FBQy9FLFdBQVMsS0FBSyxNQUFNLEdBQUc7QUFDdkIsT0FBSyxLQUFLLFFBQVEsQ0FBQyxTQUFTLFNBQU87QUFDL0IsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTixPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFDSixDQUFDO0FBdUNELFNBQVMsa0JBQWtCLFFBQVEsT0FBTyxPQUFPO0FBQzdDLE1BQUksT0FBTyxPQUFPLFFBQVE7QUFDdEIsVUFBTSxPQUFPLEtBQUssR0FBUSxhQUFhLE9BQU8sT0FBTyxNQUFNLENBQUM7QUFBQSxFQUNoRTtBQUNBLFFBQU0sTUFBTSxLQUFLLElBQUksT0FBTztBQUNoQztBQUxTO0FBTUYsSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFDL0UsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUN2QixPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsUUFBTTtBQUM5QixVQUFNLFFBQVEsUUFBUTtBQUN0QixRQUFJLENBQUMsTUFBTSxRQUFRLEtBQUssR0FBRztBQUN2QixjQUFRLE9BQU8sS0FBSztBQUFBLFFBQ2hCLFVBQVU7QUFBQSxRQUNWLE1BQU07QUFBQSxRQUNOO0FBQUEsUUFDQTtBQUFBLE1BQ0osQ0FBQztBQUNELGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxRQUFRLE1BQU0sTUFBTSxNQUFNO0FBQ2xDLFVBQU0sUUFBUSxDQUFDO0FBQ2YsYUFBUSxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSTtBQUNqQyxZQUFNLE9BQU8sTUFBTSxDQUFDO0FBQ3BCLFlBQU0sU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO0FBQUEsUUFDaEMsT0FBTztBQUFBLFFBQ1AsUUFBUSxDQUFDO0FBQUEsTUFDYixHQUFHLEdBQUc7QUFDTixVQUFJLGtCQUFrQixTQUFTO0FBQzNCLGNBQU0sS0FBSyxPQUFPLEtBQUssQ0FBQ0UsWUFBUyxrQkFBa0JBLFNBQVEsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUFBLE1BQzNFLE9BQU87QUFDSCwwQkFBa0IsUUFBUSxTQUFTLENBQUM7QUFBQSxNQUN4QztBQUFBLElBQ0o7QUFDQSxRQUFJLE1BQU0sUUFBUTtBQUNkLGFBQU8sUUFBUSxJQUFJLEtBQUssRUFBRSxLQUFLLE1BQUksT0FBTztBQUFBLElBQzlDO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSixDQUFDO0FBQ0QsU0FBUyxxQkFBcUIsUUFBUSxPQUFPLEtBQUssT0FBTztBQUNyRCxNQUFJLE9BQU8sT0FBTyxRQUFRO0FBQ3RCLFVBQU0sT0FBTyxLQUFLLEdBQVEsYUFBYSxLQUFLLE9BQU8sTUFBTSxDQUFDO0FBQUEsRUFDOUQ7QUFDQSxNQUFJLE9BQU8sVUFBVSxRQUFXO0FBQzVCLFFBQUksT0FBTyxPQUFPO0FBQ2QsWUFBTSxNQUFNLEdBQUcsSUFBSTtBQUFBLElBQ3ZCO0FBQUEsRUFDSixPQUFPO0FBQ0gsVUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPO0FBQUEsRUFDOUI7QUFDSjtBQVhTO0FBWVQsU0FBUyxhQUFhLEtBQUs7QUFDdkIsUUFBTSxPQUFPLE9BQU8sS0FBSyxJQUFJLEtBQUs7QUFDbEMsYUFBVyxLQUFLLE1BQUs7QUFDakIsUUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsTUFBTSxRQUFRLElBQUksVUFBVSxHQUFHO0FBQ2hELFlBQU0sSUFBSSxNQUFNLDJCQUEyQixDQUFDLDBCQUEwQjtBQUFBLElBQzFFO0FBQUEsRUFDSjtBQUNBLFFBQU0sUUFBYSxhQUFhLElBQUksS0FBSztBQUN6QyxTQUFPO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSDtBQUFBLElBQ0EsUUFBUSxJQUFJLElBQUksSUFBSTtBQUFBLElBQ3BCLFNBQVMsS0FBSztBQUFBLElBQ2QsY0FBYyxJQUFJLElBQUksS0FBSztBQUFBLEVBQy9CO0FBQ0o7QUFmUztBQWdCVCxTQUFTLGVBQWUsT0FBTyxPQUFPLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFDM0QsUUFBTSxlQUFlLENBQUM7QUFFdEIsUUFBTSxTQUFTLElBQUk7QUFDbkIsUUFBTSxZQUFZLElBQUksU0FBUztBQUMvQixRQUFNLElBQUksVUFBVSxJQUFJO0FBQ3hCLGFBQVcsT0FBTyxPQUFPLEtBQUssS0FBSyxHQUFFO0FBQ2pDLFFBQUksT0FBTyxJQUFJLEdBQUcsRUFBRztBQUNyQixRQUFJLE1BQU0sU0FBUztBQUNmLG1CQUFhLEtBQUssR0FBRztBQUNyQjtBQUFBLElBQ0o7QUFDQSxVQUFNLElBQUksVUFBVSxJQUFJO0FBQUEsTUFDcEIsT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUNoQixRQUFRLENBQUM7QUFBQSxJQUNiLEdBQUcsR0FBRztBQUNOLFFBQUksYUFBYSxTQUFTO0FBQ3RCLFlBQU0sS0FBSyxFQUFFLEtBQUssQ0FBQ0MsT0FBSSxxQkFBcUJBLElBQUcsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsSUFDeEUsT0FBTztBQUNILDJCQUFxQixHQUFHLFNBQVMsS0FBSyxLQUFLO0FBQUEsSUFDL0M7QUFBQSxFQUNKO0FBQ0EsTUFBSSxhQUFhLFFBQVE7QUFDckIsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBQ0EsTUFBSSxDQUFDLE1BQU0sT0FBUSxRQUFPO0FBQzFCLFNBQU8sUUFBUSxJQUFJLEtBQUssRUFBRSxLQUFLLE1BQUk7QUFDL0IsV0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNMO0FBbENTO0FBbUNGLElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBRWpGLFdBQVMsS0FBSyxNQUFNLEdBQUc7QUFFdkIsUUFBTSxPQUFPLE9BQU8seUJBQXlCLEtBQUssT0FBTztBQUN6RCxNQUFJLENBQUMsTUFBTSxLQUFLO0FBQ1osVUFBTSxLQUFLLElBQUk7QUFDZixXQUFPLGVBQWUsS0FBSyxTQUFTO0FBQUEsTUFDaEMsS0FBSyw2QkFBSTtBQUNMLGNBQU0sUUFBUTtBQUFBLFVBQ1YsR0FBRztBQUFBLFFBQ1A7QUFDQSxlQUFPLGVBQWUsS0FBSyxTQUFTO0FBQUEsVUFDaEMsT0FBTztBQUFBLFFBQ1gsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNYLEdBUks7QUFBQSxJQVNULENBQUM7QUFBQSxFQUNMO0FBQ0EsUUFBTSxjQUFtQixPQUFPLE1BQUksYUFBYSxHQUFHLENBQUM7QUFDckQsRUFBSyxXQUFXLEtBQUssTUFBTSxjQUFjLE1BQUk7QUFDekMsVUFBTSxRQUFRLElBQUk7QUFDbEIsVUFBTSxhQUFhLENBQUM7QUFDcEIsZUFBVSxPQUFPLE9BQU07QUFDbkIsWUFBTSxRQUFRLE1BQU0sR0FBRyxFQUFFO0FBQ3pCLFVBQUksTUFBTSxRQUFRO0FBQ2QsbUJBQVcsR0FBRyxNQUFNLFdBQVcsR0FBRyxJQUFJLG9CQUFJLElBQUk7QUFDOUMsbUJBQVcsS0FBSyxNQUFNLE9BQU8sWUFBVyxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQUEsTUFDdEQ7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNELFFBQU1DLFlBQWdCO0FBQ3RCLFFBQU0sV0FBVyxJQUFJO0FBQ3JCLE1BQUk7QUFDSixPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsUUFBTTtBQUM5QixjQUFVLFFBQVEsWUFBWTtBQUM5QixVQUFNLFFBQVEsUUFBUTtBQUN0QixRQUFJLENBQUNBLFVBQVMsS0FBSyxHQUFHO0FBQ2xCLGNBQVEsT0FBTyxLQUFLO0FBQUEsUUFDaEIsVUFBVTtBQUFBLFFBQ1YsTUFBTTtBQUFBLFFBQ047QUFBQSxRQUNBO0FBQUEsTUFDSixDQUFDO0FBQ0QsYUFBTztBQUFBLElBQ1g7QUFDQSxZQUFRLFFBQVEsQ0FBQztBQUNqQixVQUFNLFFBQVEsQ0FBQztBQUNmLFVBQU0sUUFBUSxNQUFNO0FBQ3BCLGVBQVcsT0FBTyxNQUFNLE1BQUs7QUFDekIsWUFBTSxLQUFLLE1BQU0sR0FBRztBQUNwQixZQUFNLElBQUksR0FBRyxLQUFLLElBQUk7QUFBQSxRQUNsQixPQUFPLE1BQU0sR0FBRztBQUFBLFFBQ2hCLFFBQVEsQ0FBQztBQUFBLE1BQ2IsR0FBRyxHQUFHO0FBQ04sVUFBSSxhQUFhLFNBQVM7QUFDdEIsY0FBTSxLQUFLLEVBQUUsS0FBSyxDQUFDRCxPQUFJLHFCQUFxQkEsSUFBRyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN4RSxPQUFPO0FBQ0gsNkJBQXFCLEdBQUcsU0FBUyxLQUFLLEtBQUs7QUFBQSxNQUMvQztBQUFBLElBQ0o7QUFDQSxRQUFJLENBQUMsVUFBVTtBQUNYLGFBQU8sTUFBTSxTQUFTLFFBQVEsSUFBSSxLQUFLLEVBQUUsS0FBSyxNQUFJLE9BQU8sSUFBSTtBQUFBLElBQ2pFO0FBQ0EsV0FBTyxlQUFlLE9BQU8sT0FBTyxTQUFTLEtBQUssWUFBWSxPQUFPLElBQUk7QUFBQSxFQUM3RTtBQUNKLENBQUM7QUFDTSxJQUFNLGdCQUE4QixnQkFBSyxhQUFhLGlCQUFpQixDQUFDLE1BQU0sUUFBTTtBQUV2RixhQUFXLEtBQUssTUFBTSxHQUFHO0FBQ3pCLFFBQU0sYUFBYSxLQUFLLEtBQUs7QUFDN0IsUUFBTSxjQUFtQixPQUFPLE1BQUksYUFBYSxHQUFHLENBQUM7QUFDckQsUUFBTSxtQkFBbUIsd0JBQUMsVUFBUTtBQUM5QixVQUFNLE1BQU0sSUFBSSxJQUFJO0FBQUEsTUFDaEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0osQ0FBQztBQUNELFVBQU0sYUFBYSxZQUFZO0FBQy9CLFVBQU0sV0FBVyx3QkFBQyxRQUFNO0FBQ3BCLFlBQU0sSUFBUyxJQUFJLEdBQUc7QUFDdEIsYUFBTyxTQUFTLENBQUMsNkJBQTZCLENBQUM7QUFBQSxJQUNuRCxHQUhpQjtBQUlqQixRQUFJLE1BQU0sOEJBQThCO0FBQ3hDLFVBQU0sTUFBTSx1QkFBTyxPQUFPLElBQUk7QUFDOUIsUUFBSSxVQUFVO0FBQ2QsZUFBVyxPQUFPLFdBQVcsTUFBSztBQUM5QixVQUFJLEdBQUcsSUFBSSxPQUFPLFNBQVM7QUFBQSxJQUMvQjtBQUVBLFFBQUksTUFBTSx1QkFBdUI7QUFDakMsZUFBVyxPQUFPLFdBQVcsTUFBSztBQUM5QixZQUFNLEtBQUssSUFBSSxHQUFHO0FBQ2xCLFlBQU0sSUFBUyxJQUFJLEdBQUc7QUFDdEIsVUFBSSxNQUFNLFNBQVMsRUFBRSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUc7QUFDM0MsVUFBSSxNQUFNO0FBQUEsY0FDUixFQUFFO0FBQUEsbURBQ21DLEVBQUU7QUFBQTtBQUFBLGdDQUVyQixDQUFDLHFCQUFxQixDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUt6QyxFQUFFO0FBQUEsZ0JBQ0EsQ0FBQztBQUFBLHdCQUNPLENBQUM7QUFBQTtBQUFBO0FBQUEsc0JBR0gsQ0FBQyxPQUFPLEVBQUU7QUFBQTtBQUFBO0FBQUEsT0FHekI7QUFBQSxJQUNDO0FBQ0EsUUFBSSxNQUFNLDRCQUE0QjtBQUN0QyxRQUFJLE1BQU0saUJBQWlCO0FBQzNCLFVBQU0sS0FBSyxJQUFJLFFBQVE7QUFDdkIsV0FBTyxDQUFDLFNBQVMsUUFBTSxHQUFHLE9BQU8sU0FBUyxHQUFHO0FBQUEsRUFDakQsR0E5Q3lCO0FBK0N6QixNQUFJO0FBQ0osUUFBTUMsWUFBZ0I7QUFDdEIsUUFBTSxNQUFNLENBQU0sYUFBYTtBQUMvQixRQUFNQyxjQUFrQjtBQUN4QixRQUFNLGNBQWMsT0FBT0EsWUFBVztBQUN0QyxRQUFNLFdBQVcsSUFBSTtBQUNyQixNQUFJO0FBQ0osT0FBSyxLQUFLLFFBQVEsQ0FBQyxTQUFTLFFBQU07QUFDOUIsY0FBVSxRQUFRLFlBQVk7QUFDOUIsVUFBTSxRQUFRLFFBQVE7QUFDdEIsUUFBSSxDQUFDRCxVQUFTLEtBQUssR0FBRztBQUNsQixjQUFRLE9BQU8sS0FBSztBQUFBLFFBQ2hCLFVBQVU7QUFBQSxRQUNWLE1BQU07QUFBQSxRQUNOO0FBQUEsUUFDQTtBQUFBLE1BQ0osQ0FBQztBQUNELGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxPQUFPLGVBQWUsS0FBSyxVQUFVLFNBQVMsSUFBSSxZQUFZLE1BQU07QUFFcEUsVUFBSSxDQUFDLFNBQVUsWUFBVyxpQkFBaUIsSUFBSSxLQUFLO0FBQ3BELGdCQUFVLFNBQVMsU0FBUyxHQUFHO0FBQy9CLFVBQUksQ0FBQyxTQUFVLFFBQU87QUFDdEIsYUFBTyxlQUFlLENBQUMsR0FBRyxPQUFPLFNBQVMsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUM5RDtBQUNBLFdBQU8sV0FBVyxTQUFTLEdBQUc7QUFBQSxFQUNsQztBQUNKLENBQUM7QUFDRCxTQUFTLG1CQUFtQixTQUFTLE9BQU8sTUFBTSxLQUFLO0FBQ25ELGFBQVcsVUFBVSxTQUFRO0FBQ3pCLFFBQUksT0FBTyxPQUFPLFdBQVcsR0FBRztBQUM1QixZQUFNLFFBQVEsT0FBTztBQUNyQixhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDQSxRQUFNLGFBQWEsUUFBUSxPQUFPLENBQUMsTUFBSSxDQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZELE1BQUksV0FBVyxXQUFXLEdBQUc7QUFDekIsVUFBTSxRQUFRLFdBQVcsQ0FBQyxFQUFFO0FBQzVCLFdBQU8sV0FBVyxDQUFDO0FBQUEsRUFDdkI7QUFDQSxRQUFNLE9BQU8sS0FBSztBQUFBLElBQ2QsTUFBTTtBQUFBLElBQ04sT0FBTyxNQUFNO0FBQUEsSUFDYjtBQUFBLElBQ0EsUUFBUSxRQUFRLElBQUksQ0FBQyxXQUFTLE9BQU8sT0FBTyxJQUFJLENBQUMsUUFBVyxjQUFjLEtBQUssS0FBVSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFDdkcsQ0FBQztBQUNELFNBQU87QUFDWDtBQW5CUztBQW9CRixJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUMvRSxXQUFTLEtBQUssTUFBTSxHQUFHO0FBQ3ZCLEVBQUssV0FBVyxLQUFLLE1BQU0sU0FBUyxNQUFJLElBQUksUUFBUSxLQUFLLENBQUMsTUFBSSxFQUFFLEtBQUssVUFBVSxVQUFVLElBQUksYUFBYSxNQUFTO0FBQ25ILEVBQUssV0FBVyxLQUFLLE1BQU0sVUFBVSxNQUFJLElBQUksUUFBUSxLQUFLLENBQUMsTUFBSSxFQUFFLEtBQUssV0FBVyxVQUFVLElBQUksYUFBYSxNQUFTO0FBQ3JILEVBQUssV0FBVyxLQUFLLE1BQU0sVUFBVSxNQUFJO0FBQ3JDLFFBQUksSUFBSSxRQUFRLE1BQU0sQ0FBQyxNQUFJLEVBQUUsS0FBSyxNQUFNLEdBQUc7QUFDdkMsYUFBTyxJQUFJLElBQUksSUFBSSxRQUFRLFFBQVEsQ0FBQyxXQUFTLE1BQU0sS0FBSyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxJQUNoRjtBQUNBLFdBQU87QUFBQSxFQUNYLENBQUM7QUFDRCxFQUFLLFdBQVcsS0FBSyxNQUFNLFdBQVcsTUFBSTtBQUN0QyxRQUFJLElBQUksUUFBUSxNQUFNLENBQUMsTUFBSSxFQUFFLEtBQUssT0FBTyxHQUFHO0FBQ3hDLFlBQU0sV0FBVyxJQUFJLFFBQVEsSUFBSSxDQUFDLE1BQUksRUFBRSxLQUFLLE9BQU87QUFDcEQsYUFBTyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFTLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxJQUFJO0FBQUEsSUFDckY7QUFDQSxXQUFPO0FBQUEsRUFDWCxDQUFDO0FBQ0QsUUFBTSxTQUFTLElBQUksUUFBUSxXQUFXO0FBQ3RDLFFBQU0sUUFBUSxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUs7QUFDbEMsT0FBSyxLQUFLLFFBQVEsQ0FBQyxTQUFTLFFBQU07QUFDOUIsUUFBSSxRQUFRO0FBQ1IsYUFBTyxNQUFNLFNBQVMsR0FBRztBQUFBLElBQzdCO0FBQ0EsUUFBSSxRQUFRO0FBQ1osVUFBTSxVQUFVLENBQUM7QUFDakIsZUFBVyxVQUFVLElBQUksU0FBUTtBQUM3QixZQUFNLFNBQVMsT0FBTyxLQUFLLElBQUk7QUFBQSxRQUMzQixPQUFPLFFBQVE7QUFBQSxRQUNmLFFBQVEsQ0FBQztBQUFBLE1BQ2IsR0FBRyxHQUFHO0FBQ04sVUFBSSxrQkFBa0IsU0FBUztBQUMzQixnQkFBUSxLQUFLLE1BQU07QUFDbkIsZ0JBQVE7QUFBQSxNQUNaLE9BQU87QUFDSCxZQUFJLE9BQU8sT0FBTyxXQUFXLEVBQUcsUUFBTztBQUN2QyxnQkFBUSxLQUFLLE1BQU07QUFBQSxNQUN2QjtBQUFBLElBQ0o7QUFDQSxRQUFJLENBQUMsTUFBTyxRQUFPLG1CQUFtQixTQUFTLFNBQVMsTUFBTSxHQUFHO0FBQ2pFLFdBQU8sUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLENBQUNFLGFBQVU7QUFDeEMsYUFBTyxtQkFBbUJBLFVBQVMsU0FBUyxNQUFNLEdBQUc7QUFBQSxJQUN6RCxDQUFDO0FBQUEsRUFDTDtBQUNKLENBQUM7QUFrRU0sSUFBTSxtQkFBaUMsZ0JBQUssYUFBYSxvQkFBb0IsQ0FBQyxNQUFNLFFBQU07QUFDN0YsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUN2QixPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsUUFBTTtBQUM5QixVQUFNLFFBQVEsUUFBUTtBQUN0QixVQUFNLE9BQU8sSUFBSSxLQUFLLEtBQUssSUFBSTtBQUFBLE1BQzNCLE9BQU87QUFBQSxNQUNQLFFBQVEsQ0FBQztBQUFBLElBQ2IsR0FBRyxHQUFHO0FBQ04sVUFBTSxRQUFRLElBQUksTUFBTSxLQUFLLElBQUk7QUFBQSxNQUM3QixPQUFPO0FBQUEsTUFDUCxRQUFRLENBQUM7QUFBQSxJQUNiLEdBQUcsR0FBRztBQUNOLFVBQU0sUUFBUSxnQkFBZ0IsV0FBVyxpQkFBaUI7QUFDMUQsUUFBSSxPQUFPO0FBQ1AsYUFBTyxRQUFRLElBQUk7QUFBQSxRQUNmO0FBQUEsUUFDQTtBQUFBLE1BQ0osQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDQyxPQUFNQyxNQUFLLE1BQUk7QUFDckIsZUFBTywwQkFBMEIsU0FBU0QsT0FBTUMsTUFBSztBQUFBLE1BQ3pELENBQUM7QUFBQSxJQUNMO0FBQ0EsV0FBTywwQkFBMEIsU0FBUyxNQUFNLEtBQUs7QUFBQSxFQUN6RDtBQUNKLENBQUM7QUFDRCxTQUFTLFlBQVksR0FBRyxHQUFHO0FBR3ZCLE1BQUksTUFBTSxHQUFHO0FBQ1QsV0FBTztBQUFBLE1BQ0gsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLElBQ1Y7QUFBQSxFQUNKO0FBQ0EsTUFBSSxhQUFhLFFBQVEsYUFBYSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUc7QUFDckQsV0FBTztBQUFBLE1BQ0gsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLElBQ1Y7QUFBQSxFQUNKO0FBQ0EsTUFBUyxjQUFjLENBQUMsS0FBVSxjQUFjLENBQUMsR0FBRztBQUNoRCxVQUFNLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDM0IsVUFBTSxhQUFhLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQU0sTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFO0FBQ3pFLFVBQU0sU0FBUztBQUFBLE1BQ1gsR0FBRztBQUFBLE1BQ0gsR0FBRztBQUFBLElBQ1A7QUFDQSxlQUFXLE9BQU8sWUFBVztBQUN6QixZQUFNLGNBQWMsWUFBWSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUM5QyxVQUFJLENBQUMsWUFBWSxPQUFPO0FBQ3BCLGVBQU87QUFBQSxVQUNILE9BQU87QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFlBQ1o7QUFBQSxZQUNBLEdBQUcsWUFBWTtBQUFBLFVBQ25CO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxhQUFPLEdBQUcsSUFBSSxZQUFZO0FBQUEsSUFDOUI7QUFDQSxXQUFPO0FBQUEsTUFDSCxPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDVjtBQUFBLEVBQ0o7QUFDQSxNQUFJLE1BQU0sUUFBUSxDQUFDLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRztBQUN0QyxRQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVE7QUFDdkIsYUFBTztBQUFBLFFBQ0gsT0FBTztBQUFBLFFBQ1AsZ0JBQWdCLENBQUM7QUFBQSxNQUNyQjtBQUFBLElBQ0o7QUFDQSxVQUFNLFdBQVcsQ0FBQztBQUNsQixhQUFRLFFBQVEsR0FBRyxRQUFRLEVBQUUsUUFBUSxTQUFRO0FBQ3pDLFlBQU0sUUFBUSxFQUFFLEtBQUs7QUFDckIsWUFBTSxRQUFRLEVBQUUsS0FBSztBQUNyQixZQUFNLGNBQWMsWUFBWSxPQUFPLEtBQUs7QUFDNUMsVUFBSSxDQUFDLFlBQVksT0FBTztBQUNwQixlQUFPO0FBQUEsVUFDSCxPQUFPO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxZQUNaO0FBQUEsWUFDQSxHQUFHLFlBQVk7QUFBQSxVQUNuQjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsZUFBUyxLQUFLLFlBQVksSUFBSTtBQUFBLElBQ2xDO0FBQ0EsV0FBTztBQUFBLE1BQ0gsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLElBQ1Y7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUFBLElBQ0gsT0FBTztBQUFBLElBQ1AsZ0JBQWdCLENBQUM7QUFBQSxFQUNyQjtBQUNKO0FBeEVTO0FBeUVULFNBQVMsMEJBQTBCLFFBQVEsTUFBTSxPQUFPO0FBQ3BELE1BQUksS0FBSyxPQUFPLFFBQVE7QUFDcEIsV0FBTyxPQUFPLEtBQUssR0FBRyxLQUFLLE1BQU07QUFBQSxFQUNyQztBQUNBLE1BQUksTUFBTSxPQUFPLFFBQVE7QUFDckIsV0FBTyxPQUFPLEtBQUssR0FBRyxNQUFNLE1BQU07QUFBQSxFQUN0QztBQUNBLE1BQVMsUUFBUSxNQUFNLEVBQUcsUUFBTztBQUNqQyxRQUFNLFNBQVMsWUFBWSxLQUFLLE9BQU8sTUFBTSxLQUFLO0FBQ2xELE1BQUksQ0FBQyxPQUFPLE9BQU87QUFDZixVQUFNLElBQUksTUFBTSx3Q0FBNkMsS0FBSyxVQUFVLE9BQU8sY0FBYyxDQUFDLEVBQUU7QUFBQSxFQUN4RztBQUNBLFNBQU8sUUFBUSxPQUFPO0FBQ3RCLFNBQU87QUFDWDtBQWRTO0FBNFNGLElBQU0sV0FBeUIsZ0JBQUssYUFBYSxZQUFZLENBQUMsTUFBTSxRQUFNO0FBQzdFLFdBQVMsS0FBSyxNQUFNLEdBQUc7QUFDdkIsUUFBTSxTQUFjLGNBQWMsSUFBSSxPQUFPO0FBQzdDLFFBQU0sWUFBWSxJQUFJLElBQUksTUFBTTtBQUNoQyxPQUFLLEtBQUssU0FBUztBQUNuQixPQUFLLEtBQUssVUFBVSxJQUFJLE9BQU8sS0FBSyxPQUFPLE9BQU8sQ0FBQyxNQUFTLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQUksT0FBTyxNQUFNLFdBQWdCLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsSUFBSTtBQUM5SyxPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsU0FBTztBQUMvQixVQUFNLFFBQVEsUUFBUTtBQUN0QixRQUFJLFVBQVUsSUFBSSxLQUFLLEdBQUc7QUFDdEIsYUFBTztBQUFBLElBQ1g7QUFDQSxZQUFRLE9BQU8sS0FBSztBQUFBLE1BQ2hCLE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDWDtBQUNKLENBQUM7QUFxQ00sSUFBTSxnQkFBOEIsZ0JBQUssYUFBYSxpQkFBaUIsQ0FBQyxNQUFNLFFBQU07QUFDdkYsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUN2QixPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsUUFBTTtBQUM5QixRQUFJLElBQUksY0FBYyxZQUFZO0FBQzlCLFlBQU0sSUFBUyxnQkFBZ0IsS0FBSyxZQUFZLElBQUk7QUFBQSxJQUN4RDtBQUNBLFVBQU0sT0FBTyxJQUFJLFVBQVUsUUFBUSxPQUFPLE9BQU87QUFDakQsUUFBSSxJQUFJLE9BQU87QUFDWCxZQUFNLFNBQVMsZ0JBQWdCLFVBQVUsT0FBTyxRQUFRLFFBQVEsSUFBSTtBQUNwRSxhQUFPLE9BQU8sS0FBSyxDQUFDQyxZQUFTO0FBQ3pCLGdCQUFRLFFBQVFBO0FBQ2hCLGVBQU87QUFBQSxNQUNYLENBQUM7QUFBQSxJQUNMO0FBQ0EsUUFBSSxnQkFBZ0IsU0FBUztBQUN6QixZQUFNLElBQVMsZUFBZTtBQUFBLElBQ2xDO0FBQ0EsWUFBUSxRQUFRO0FBQ2hCLFdBQU87QUFBQSxFQUNYO0FBQ0osQ0FBQztBQUNELFNBQVMscUJBQXFCLFFBQVEsT0FBTztBQUN6QyxNQUFJLE9BQU8sT0FBTyxVQUFVLFVBQVUsUUFBVztBQUM3QyxXQUFPO0FBQUEsTUFDSCxRQUFRLENBQUM7QUFBQSxNQUNULE9BQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQVJTO0FBU0YsSUFBTSxlQUE2QixnQkFBSyxhQUFhLGdCQUFnQixDQUFDLE1BQU0sUUFBTTtBQUNyRixXQUFTLEtBQUssTUFBTSxHQUFHO0FBQ3ZCLE9BQUssS0FBSyxRQUFRO0FBQ2xCLE9BQUssS0FBSyxTQUFTO0FBQ25CLEVBQUssV0FBVyxLQUFLLE1BQU0sVUFBVSxNQUFJO0FBQ3JDLFdBQU8sSUFBSSxVQUFVLEtBQUssU0FBUyxvQkFBSSxJQUFJO0FBQUEsTUFDdkMsR0FBRyxJQUFJLFVBQVUsS0FBSztBQUFBLE1BQ3RCO0FBQUEsSUFDSixDQUFDLElBQUk7QUFBQSxFQUNULENBQUM7QUFDRCxFQUFLLFdBQVcsS0FBSyxNQUFNLFdBQVcsTUFBSTtBQUN0QyxVQUFNLFVBQVUsSUFBSSxVQUFVLEtBQUs7QUFDbkMsV0FBTyxVQUFVLElBQUksT0FBTyxLQUFVLFdBQVcsUUFBUSxNQUFNLENBQUMsS0FBSyxJQUFJO0FBQUEsRUFDN0UsQ0FBQztBQUNELE9BQUssS0FBSyxRQUFRLENBQUMsU0FBUyxRQUFNO0FBQzlCLFFBQUksSUFBSSxVQUFVLEtBQUssVUFBVSxZQUFZO0FBQ3pDLFlBQU0sU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJLFNBQVMsR0FBRztBQUNsRCxVQUFJLGtCQUFrQixRQUFTLFFBQU8sT0FBTyxLQUFLLENBQUMsTUFBSSxxQkFBcUIsR0FBRyxRQUFRLEtBQUssQ0FBQztBQUM3RixhQUFPLHFCQUFxQixRQUFRLFFBQVEsS0FBSztBQUFBLElBQ3JEO0FBQ0EsUUFBSSxRQUFRLFVBQVUsUUFBVztBQUM3QixhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU8sSUFBSSxVQUFVLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFBQSxFQUM5QztBQUNKLENBQUM7QUFDTSxJQUFNLGVBQTZCLGdCQUFLLGFBQWEsZ0JBQWdCLENBQUMsTUFBTSxRQUFNO0FBQ3JGLFdBQVMsS0FBSyxNQUFNLEdBQUc7QUFDdkIsRUFBSyxXQUFXLEtBQUssTUFBTSxTQUFTLE1BQUksSUFBSSxVQUFVLEtBQUssS0FBSztBQUNoRSxFQUFLLFdBQVcsS0FBSyxNQUFNLFVBQVUsTUFBSSxJQUFJLFVBQVUsS0FBSyxNQUFNO0FBQ2xFLEVBQUssV0FBVyxLQUFLLE1BQU0sV0FBVyxNQUFJO0FBQ3RDLFVBQU0sVUFBVSxJQUFJLFVBQVUsS0FBSztBQUNuQyxXQUFPLFVBQVUsSUFBSSxPQUFPLEtBQVUsV0FBVyxRQUFRLE1BQU0sQ0FBQyxTQUFTLElBQUk7QUFBQSxFQUNqRixDQUFDO0FBQ0QsRUFBSyxXQUFXLEtBQUssTUFBTSxVQUFVLE1BQUk7QUFDckMsV0FBTyxJQUFJLFVBQVUsS0FBSyxTQUFTLG9CQUFJLElBQUk7QUFBQSxNQUN2QyxHQUFHLElBQUksVUFBVSxLQUFLO0FBQUEsTUFDdEI7QUFBQSxJQUNKLENBQUMsSUFBSTtBQUFBLEVBQ1QsQ0FBQztBQUNELE9BQUssS0FBSyxRQUFRLENBQUMsU0FBUyxRQUFNO0FBRTlCLFFBQUksUUFBUSxVQUFVLEtBQU0sUUFBTztBQUNuQyxXQUFPLElBQUksVUFBVSxLQUFLLElBQUksU0FBUyxHQUFHO0FBQUEsRUFDOUM7QUFDSixDQUFDO0FBQ00sSUFBTSxjQUE0QixnQkFBSyxhQUFhLGVBQWUsQ0FBQyxNQUFNLFFBQU07QUFDbkYsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUV2QixPQUFLLEtBQUssUUFBUTtBQUNsQixFQUFLLFdBQVcsS0FBSyxNQUFNLFVBQVUsTUFBSSxJQUFJLFVBQVUsS0FBSyxNQUFNO0FBQ2xFLE9BQUssS0FBSyxRQUFRLENBQUMsU0FBUyxRQUFNO0FBQzlCLFFBQUksSUFBSSxjQUFjLFlBQVk7QUFDOUIsYUFBTyxJQUFJLFVBQVUsS0FBSyxJQUFJLFNBQVMsR0FBRztBQUFBLElBQzlDO0FBRUEsUUFBSSxRQUFRLFVBQVUsUUFBVztBQUM3QixjQUFRLFFBQVEsSUFBSTtBQUcyWixhQUFPO0FBQUEsSUFDMWI7QUFFQSxVQUFNLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDbEQsUUFBSSxrQkFBa0IsU0FBUztBQUMzQixhQUFPLE9BQU8sS0FBSyxDQUFDQyxZQUFTLG9CQUFvQkEsU0FBUSxHQUFHLENBQUM7QUFBQSxJQUNqRTtBQUNBLFdBQU8sb0JBQW9CLFFBQVEsR0FBRztBQUFBLEVBQzFDO0FBQ0osQ0FBQztBQUNELFNBQVMsb0JBQW9CLFNBQVMsS0FBSztBQUN2QyxNQUFJLFFBQVEsVUFBVSxRQUFXO0FBQzdCLFlBQVEsUUFBUSxJQUFJO0FBQUEsRUFDeEI7QUFDQSxTQUFPO0FBQ1g7QUFMUztBQU1GLElBQU0sZUFBNkIsZ0JBQUssYUFBYSxnQkFBZ0IsQ0FBQyxNQUFNLFFBQU07QUFDckYsV0FBUyxLQUFLLE1BQU0sR0FBRztBQUN2QixPQUFLLEtBQUssUUFBUTtBQUNsQixFQUFLLFdBQVcsS0FBSyxNQUFNLFVBQVUsTUFBSSxJQUFJLFVBQVUsS0FBSyxNQUFNO0FBQ2xFLE9BQUssS0FBSyxRQUFRLENBQUMsU0FBUyxRQUFNO0FBQzlCLFFBQUksSUFBSSxjQUFjLFlBQVk7QUFDOUIsYUFBTyxJQUFJLFVBQVUsS0FBSyxJQUFJLFNBQVMsR0FBRztBQUFBLElBQzlDO0FBRUEsUUFBSSxRQUFRLFVBQVUsUUFBVztBQUM3QixjQUFRLFFBQVEsSUFBSTtBQUFBLElBQ3hCO0FBQ0EsV0FBTyxJQUFJLFVBQVUsS0FBSyxJQUFJLFNBQVMsR0FBRztBQUFBLEVBQzlDO0FBQ0osQ0FBQztBQUNNLElBQU0sa0JBQWdDLGdCQUFLLGFBQWEsbUJBQW1CLENBQUMsTUFBTSxRQUFNO0FBQzNGLFdBQVMsS0FBSyxNQUFNLEdBQUc7QUFDdkIsRUFBSyxXQUFXLEtBQUssTUFBTSxVQUFVLE1BQUk7QUFDckMsVUFBTSxJQUFJLElBQUksVUFBVSxLQUFLO0FBQzdCLFdBQU8sSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNmLEdBQUc7QUFBQSxJQUNQLEVBQUUsT0FBTyxDQUFDLE1BQUksTUFBTSxNQUFTLENBQUMsSUFBSTtBQUFBLEVBQ3RDLENBQUM7QUFDRCxPQUFLLEtBQUssUUFBUSxDQUFDLFNBQVMsUUFBTTtBQUM5QixVQUFNLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDbEQsUUFBSSxrQkFBa0IsU0FBUztBQUMzQixhQUFPLE9BQU8sS0FBSyxDQUFDQSxZQUFTLHdCQUF3QkEsU0FBUSxJQUFJLENBQUM7QUFBQSxJQUN0RTtBQUNBLFdBQU8sd0JBQXdCLFFBQVEsSUFBSTtBQUFBLEVBQy9DO0FBQ0osQ0FBQztBQUNELFNBQVMsd0JBQXdCLFNBQVMsTUFBTTtBQUM1QyxNQUFJLENBQUMsUUFBUSxPQUFPLFVBQVUsUUFBUSxVQUFVLFFBQVc7QUFDdkQsWUFBUSxPQUFPLEtBQUs7QUFBQSxNQUNoQixNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixPQUFPLFFBQVE7QUFBQSxNQUNmO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUNBLFNBQU87QUFDWDtBQVZTO0FBNEJGLElBQU0sWUFBMEIsZ0JBQUssYUFBYSxhQUFhLENBQUMsTUFBTSxRQUFNO0FBQy9FLFdBQVMsS0FBSyxNQUFNLEdBQUc7QUFDdkIsRUFBSyxXQUFXLEtBQUssTUFBTSxTQUFTLE1BQUksSUFBSSxVQUFVLEtBQUssS0FBSztBQUNoRSxFQUFLLFdBQVcsS0FBSyxNQUFNLFVBQVUsTUFBSSxJQUFJLFVBQVUsS0FBSyxNQUFNO0FBQ2xFLEVBQUssV0FBVyxLQUFLLE1BQU0sVUFBVSxNQUFJLElBQUksVUFBVSxLQUFLLE1BQU07QUFDbEUsT0FBSyxLQUFLLFFBQVEsQ0FBQyxTQUFTLFFBQU07QUFDOUIsUUFBSSxJQUFJLGNBQWMsWUFBWTtBQUM5QixhQUFPLElBQUksVUFBVSxLQUFLLElBQUksU0FBUyxHQUFHO0FBQUEsSUFDOUM7QUFFQSxVQUFNLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDbEQsUUFBSSxrQkFBa0IsU0FBUztBQUMzQixhQUFPLE9BQU8sS0FBSyxDQUFDQyxZQUFTO0FBQ3pCLGdCQUFRLFFBQVFBLFFBQU87QUFDdkIsWUFBSUEsUUFBTyxPQUFPLFFBQVE7QUFDdEIsa0JBQVEsUUFBUSxJQUFJLFdBQVc7QUFBQSxZQUMzQixHQUFHO0FBQUEsWUFDSCxPQUFPO0FBQUEsY0FDSCxRQUFRQSxRQUFPLE9BQU8sSUFBSSxDQUFDLFFBQVcsY0FBYyxLQUFLLEtBQVUsT0FBTyxDQUFDLENBQUM7QUFBQSxZQUNoRjtBQUFBLFlBQ0EsT0FBTyxRQUFRO0FBQUEsVUFDbkIsQ0FBQztBQUNELGtCQUFRLFNBQVMsQ0FBQztBQUFBLFFBQ3RCO0FBQ0EsZUFBTztBQUFBLE1BQ1gsQ0FBQztBQUFBLElBQ0w7QUFDQSxZQUFRLFFBQVEsT0FBTztBQUN2QixRQUFJLE9BQU8sT0FBTyxRQUFRO0FBQ3RCLGNBQVEsUUFBUSxJQUFJLFdBQVc7QUFBQSxRQUMzQixHQUFHO0FBQUEsUUFDSCxPQUFPO0FBQUEsVUFDSCxRQUFRLE9BQU8sT0FBTyxJQUFJLENBQUMsUUFBVyxjQUFjLEtBQUssS0FBVSxPQUFPLENBQUMsQ0FBQztBQUFBLFFBQ2hGO0FBQUEsUUFDQSxPQUFPLFFBQVE7QUFBQSxNQUNuQixDQUFDO0FBQ0QsY0FBUSxTQUFTLENBQUM7QUFBQSxJQUN0QjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0osQ0FBQztBQWdCTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUM3RSxXQUFTLEtBQUssTUFBTSxHQUFHO0FBQ3ZCLEVBQUssV0FBVyxLQUFLLE1BQU0sVUFBVSxNQUFJLElBQUksR0FBRyxLQUFLLE1BQU07QUFDM0QsRUFBSyxXQUFXLEtBQUssTUFBTSxTQUFTLE1BQUksSUFBSSxHQUFHLEtBQUssS0FBSztBQUN6RCxFQUFLLFdBQVcsS0FBSyxNQUFNLFVBQVUsTUFBSSxJQUFJLElBQUksS0FBSyxNQUFNO0FBQzVELEVBQUssV0FBVyxLQUFLLE1BQU0sY0FBYyxNQUFJLElBQUksR0FBRyxLQUFLLFVBQVU7QUFDbkUsT0FBSyxLQUFLLFFBQVEsQ0FBQyxTQUFTLFFBQU07QUFDOUIsUUFBSSxJQUFJLGNBQWMsWUFBWTtBQUM5QixZQUFNLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDM0MsVUFBSSxpQkFBaUIsU0FBUztBQUMxQixlQUFPLE1BQU0sS0FBSyxDQUFDQyxXQUFRLGlCQUFpQkEsUUFBTyxJQUFJLElBQUksR0FBRyxDQUFDO0FBQUEsTUFDbkU7QUFDQSxhQUFPLGlCQUFpQixPQUFPLElBQUksSUFBSSxHQUFHO0FBQUEsSUFDOUM7QUFDQSxVQUFNLE9BQU8sSUFBSSxHQUFHLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDekMsUUFBSSxnQkFBZ0IsU0FBUztBQUN6QixhQUFPLEtBQUssS0FBSyxDQUFDQyxVQUFPLGlCQUFpQkEsT0FBTSxJQUFJLEtBQUssR0FBRyxDQUFDO0FBQUEsSUFDakU7QUFDQSxXQUFPLGlCQUFpQixNQUFNLElBQUksS0FBSyxHQUFHO0FBQUEsRUFDOUM7QUFDSixDQUFDO0FBQ0QsU0FBUyxpQkFBaUIsTUFBTSxNQUFNLEtBQUs7QUFDdkMsTUFBSSxLQUFLLE9BQU8sUUFBUTtBQUVwQixTQUFLLFVBQVU7QUFDZixXQUFPO0FBQUEsRUFDWDtBQUNBLFNBQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxJQUNqQixPQUFPLEtBQUs7QUFBQSxJQUNaLFFBQVEsS0FBSztBQUFBLEVBQ2pCLEdBQUcsR0FBRztBQUNWO0FBVlM7QUFrRUYsSUFBTSxlQUE2QixnQkFBSyxhQUFhLGdCQUFnQixDQUFDLE1BQU0sUUFBTTtBQUNyRixXQUFTLEtBQUssTUFBTSxHQUFHO0FBQ3ZCLEVBQUssV0FBVyxLQUFLLE1BQU0sY0FBYyxNQUFJLElBQUksVUFBVSxLQUFLLFVBQVU7QUFDMUUsRUFBSyxXQUFXLEtBQUssTUFBTSxVQUFVLE1BQUksSUFBSSxVQUFVLEtBQUssTUFBTTtBQUNsRSxFQUFLLFdBQVcsS0FBSyxNQUFNLFNBQVMsTUFBSSxJQUFJLFVBQVUsS0FBSyxLQUFLO0FBQ2hFLEVBQUssV0FBVyxLQUFLLE1BQU0sVUFBVSxNQUFJLElBQUksVUFBVSxLQUFLLE1BQU07QUFDbEUsT0FBSyxLQUFLLFFBQVEsQ0FBQyxTQUFTLFFBQU07QUFDOUIsUUFBSSxJQUFJLGNBQWMsWUFBWTtBQUM5QixhQUFPLElBQUksVUFBVSxLQUFLLElBQUksU0FBUyxHQUFHO0FBQUEsSUFDOUM7QUFDQSxVQUFNLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDbEQsUUFBSSxrQkFBa0IsU0FBUztBQUMzQixhQUFPLE9BQU8sS0FBSyxvQkFBb0I7QUFBQSxJQUMzQztBQUNBLFdBQU8scUJBQXFCLE1BQU07QUFBQSxFQUN0QztBQUNKLENBQUM7QUFDRCxTQUFTLHFCQUFxQixTQUFTO0FBQ25DLFVBQVEsUUFBUSxPQUFPLE9BQU8sUUFBUSxLQUFLO0FBQzNDLFNBQU87QUFDWDtBQUhTO0FBOEpGLElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBQ2pGLEVBQU8sVUFBVSxLQUFLLE1BQU0sR0FBRztBQUMvQixXQUFTLEtBQUssTUFBTSxHQUFHO0FBQ3ZCLE9BQUssS0FBSyxRQUFRLENBQUMsU0FBUyxNQUFJO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0EsT0FBSyxLQUFLLFFBQVEsQ0FBQyxZQUFVO0FBQ3pCLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFVBQU0sSUFBSSxJQUFJLEdBQUcsS0FBSztBQUN0QixRQUFJLGFBQWEsU0FBUztBQUN0QixhQUFPLEVBQUUsS0FBSyxDQUFDQyxPQUFJLG1CQUFtQkEsSUFBRyxTQUFTLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDbEU7QUFDQSx1QkFBbUIsR0FBRyxTQUFTLE9BQU8sSUFBSTtBQUMxQztBQUFBLEVBQ0o7QUFDSixDQUFDO0FBQ0QsU0FBUyxtQkFBbUIsUUFBUSxTQUFTLE9BQU8sTUFBTTtBQUN0RCxNQUFJLENBQUMsUUFBUTtBQUNULFVBQU0sT0FBTztBQUFBLE1BQ1QsTUFBTTtBQUFBLE1BQ047QUFBQSxNQUNBO0FBQUEsTUFDQSxNQUFNO0FBQUEsUUFDRixHQUFHLEtBQUssS0FBSyxJQUFJLFFBQVEsQ0FBQztBQUFBLE1BQzlCO0FBQUEsTUFDQSxVQUFVLENBQUMsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUM3QjtBQUNBLFFBQUksS0FBSyxLQUFLLElBQUksT0FBUSxNQUFLLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFDdEQsWUFBUSxPQUFPLEtBQVUsTUFBTSxJQUFJLENBQUM7QUFBQSxFQUN4QztBQUNKO0FBZFM7OztBQzM2REYsSUFBTSxVQUFVLE9BQU8sV0FBVztBQUNsQyxJQUFNLFNBQVMsT0FBTyxVQUFVO0FBQ2hDLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBRjFCLE9BRTBCO0FBQUE7QUFBQTtBQUFBLEVBQ3RCLGNBQWE7QUFDVCxTQUFLLE9BQU8sb0JBQUksUUFBUTtBQUN4QixTQUFLLFNBQVMsb0JBQUksSUFBSTtBQUFBLEVBQzFCO0FBQUEsRUFDQSxJQUFJLFdBQVcsT0FBTztBQUNsQixVQUFNLE9BQU8sTUFBTSxDQUFDO0FBQ3BCLFNBQUssS0FBSyxJQUFJLFFBQVEsSUFBSTtBQUMxQixRQUFJLFFBQVEsT0FBTyxTQUFTLFlBQVksUUFBUSxNQUFNO0FBQ2xELFVBQUksS0FBSyxPQUFPLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDMUIsY0FBTSxJQUFJLE1BQU0sTUFBTSxLQUFLLEVBQUUsaUNBQWlDO0FBQUEsTUFDbEU7QUFDQSxXQUFLLE9BQU8sSUFBSSxLQUFLLElBQUksTUFBTTtBQUFBLElBQ25DO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLFFBQVE7QUFDSixTQUFLLE9BQU8sb0JBQUksUUFBUTtBQUN4QixTQUFLLFNBQVMsb0JBQUksSUFBSTtBQUN0QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsT0FBTyxRQUFRO0FBQ1gsVUFBTSxPQUFPLEtBQUssS0FBSyxJQUFJLE1BQU07QUFDakMsUUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLFFBQVEsTUFBTTtBQUNsRCxXQUFLLE9BQU8sT0FBTyxLQUFLLEVBQUU7QUFBQSxJQUM5QjtBQUNBLFNBQUssS0FBSyxPQUFPLE1BQU07QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLElBQUksUUFBUTtBQUdSLFVBQU0sSUFBSSxPQUFPLEtBQUs7QUFDdEIsUUFBSSxHQUFHO0FBQ0gsWUFBTSxLQUFLO0FBQUEsUUFDUCxHQUFHLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztBQUFBLE1BQ3ZCO0FBQ0EsYUFBTyxHQUFHO0FBQ1YsWUFBTSxJQUFJO0FBQUEsUUFDTixHQUFHO0FBQUEsUUFDSCxHQUFHLEtBQUssS0FBSyxJQUFJLE1BQU07QUFBQSxNQUMzQjtBQUNBLGFBQU8sT0FBTyxLQUFLLENBQUMsRUFBRSxTQUFTLElBQUk7QUFBQSxJQUN2QztBQUNBLFdBQU8sS0FBSyxLQUFLLElBQUksTUFBTTtBQUFBLEVBQy9CO0FBQUEsRUFDQSxJQUFJLFFBQVE7QUFDUixXQUFPLEtBQUssS0FBSyxJQUFJLE1BQU07QUFBQSxFQUMvQjtBQUNKO0FBRU8sU0FBUyxXQUFXO0FBQ3ZCLFNBQU8sSUFBSSxhQUFhO0FBQzVCO0FBRmdCO0FBR1QsSUFBTSxpQkFBK0IseUJBQVM7OztBQ3JEOUMsU0FBUyxRQUFRQyxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBTGdCO0FBYVQsU0FBUyxPQUFPQyxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVGdCO0FBVVQsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVGdCO0FBVVQsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVGdCO0FBVVQsU0FBUyxLQUFLQSxRQUFPLFFBQVE7QUFDaEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBU0MsUUFBT0QsUUFBTyxRQUFRO0FBQ2xDLFNBQU8sSUFBSUEsT0FBTTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLElBQ1IsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDTDtBQVJnQixPQUFBQyxTQUFBO0FBU1QsU0FBUyxRQUFRRCxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxPQUFPQSxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxLQUFLQSxRQUFPLFFBQVE7QUFDaEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxPQUFPQSxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxNQUFNQSxRQUFPLFFBQVE7QUFDakMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxRQUFRQSxRQUFPLFFBQVE7QUFDbkMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FB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O0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBZU0sSUFBTSxTQUF1QixnQkFBSyxhQUFhLFVBQVUsQ0FBQyxNQUFNLFFBQU07QUFFekUsRUFBSyxRQUFRLEtBQUssTUFBTSxHQUFHO0FBQzNCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBV00sSUFBTSxXQUF5QixnQkFBSyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQU07QUFFN0UsRUFBSyxVQUFVLEtBQUssTUFBTSxHQUFHO0FBQzdCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFFL0UsRUFBSyxXQUFXLEtBQUssTUFBTSxHQUFHO0FBQzlCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzVCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxXQUF5QixnQkFBSyxhQUFhLFlBQVksQ0FBQyxNQUFNLFFBQU07QUFFN0UsRUFBSyxVQUFVLEtBQUssTUFBTSxHQUFHO0FBQzdCLGtCQUFnQixLQUFLLE1BQU0sR0FBRztBQUNsQyxDQUFDO0FBSU0sSUFBTSxVQUF3QixnQkFBSyxhQUFhLFdBQVcsQ0FBQyxNQUFNLFFBQU07QUFFM0UsRUFBSyxTQUFTLEtBQUssTUFBTSxHQUFHO0FB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QUFJLFdBQVcsR0FBRyxLQUFLLEdBQUc7QUFDdEIsc0JBQWdCO0FBQUEsSUFDcEI7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUNKO0FBZHNCO0FBZXRCLCtCQUErQixhQUFhO0FBQzVDLFdBQVcsb0JBQW9CLElBQUksOEVBQThFLDhCQUE4QjtBQUMvSSxJQUFJLCtCQUErQixXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHNFQUFzRTtBQUNySixJQUFJLGdCQUFnQixXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHVEQUF1RDsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgInBhcnNlIiwgIm1zIiwgImluaXRpYWxpemVyIiwgImFycmF5IiwgIm9iamVjdCIsICJDbGFzcyIsICJjb25maWciLCAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJpc3N1ZSIsICJlcnJvciIsICJ2ZXJzaW9uIiwgInRpbWUiLCAiaW5zdCIsICJjaGVja3MiLCAiY2hlY2tSZXN1bHQiLCAiY2FuYXJ5IiwgInJlc3VsdCIsICJfIiwgImluc3QiLCAiYmFzZTY0IiwgInJlc3VsdCIsICJyIiwgImlzT2JqZWN0IiwgImFsbG93c0V2YWwiLCAicmVzdWx0cyIsICJsZWZ0IiwgInJpZ2h0IiwgIm91dHB1dCIsICJyZXN1bHQiLCAicmVzdWx0IiwgInJpZ2h0IiwgImxlZnQiLCAiciIsICJDbGFzcyIsICJDbGFzcyIsICJfZW1vamkiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiaXNzdWUiLCAiZGF0ZXRpbWUiLCAiZGF0ZSIsICJ0aW1lIiwgImR1cmF0aW9uIiwgImluaXRpYWxpemVyIiwgImlzc3VlIiwgImlzc3VlcyIsICJwYXJzZSIsICJwYXJzZUFzeW5jIiwgInNhZmVQYXJzZSIsICJzYWZlUGFyc2VBc3luYyIsICJkZWYiLCAicGFyc2UiLCAic2FmZVBhcnNlIiwgInBhcnNlQXN5bmMiLCAic2FmZVBhcnNlQXN5bmMiLCAiX2Vtb2ppIiwgImRhdGV0aW1lIiwgImRhdGUiLCAidGltZSIsICJkdXJhdGlvbiIsICJzdHJpbmciLCAiYm9vbGVhbiIsICJpc3N1ZSIsICJvdXRwdXQiLCAic3RyaW5nIiwgImJvb2xlYW4iXQp9Cg==
|
|
51992
|
+
__name(addition, "addition");
|
|
51993
|
+
addition.workflowId = "workflow//workflows/addition.ts//addition";
|
|
51994
|
+
globalThis.__private_workflows.set("workflow//workflows/addition.ts//addition", addition);
|
|
51995
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJ3b3JrZmxvd3Mvbm9vcC50cyIsICJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzIiwgIi4uL3V0aWxzL3NyYy90aW1lLnRzIiwgIi4uL2Vycm9ycy9zcmMvaW5kZXgudHMiLCAiLi4vY29yZS9zcmMvc3ltYm9scy50cyIsICIuLi9jb3JlL3NyYy93b3JrZmxvdy9jcmVhdGUtaG9vay50cyIsICIuLi9jb3JlL3NyYy93b3JrZmxvdy9kZWZpbmUtaG9vay50cyIsICIuLi9jb3JlL3NyYy93b3JrZmxvdy93cml0YWJsZS1zdHJlYW0udHMiLCAiLi4vd29ya2Zsb3cvc3JjL3N0ZGxpYi50cyIsICJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvY29yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvdXRpbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvZXJyb3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvcmVnZXhlcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NvcmUvY2hlY2tzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9kb2MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jb3JlL3ZlcnNpb25zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9zY2hlbWFzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9yZWdpc3RyaWVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY29yZS9hcGkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3pvZEA0LjEuMTEvbm9kZV9tb2R1bGVzL3pvZC92NC9jbGFzc2ljL2lzby5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvZXJyb3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RANC4xLjExL25vZGVfbW9kdWxlcy96b2QvdjQvY2xhc3NpYy9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vem9kQDQuMS4xMS9ub2RlX21vZHVsZXMvem9kL3Y0L2NsYXNzaWMvc2NoZW1hcy5qcyIsICJ3b3JrZmxvd3MvaG9va3MudHMiLCAid29ya2Zsb3dzL2FkZGl0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEhlbHBlcnMuXG4gKi8gdmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICsgSlNPTi5zdHJpbmdpZnkodmFsKSk7XG59O1xuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICAgIH1cbiAgICByZXR1cm4gbXMgKyAnbXMnO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBtcyArICcgbXMnO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqLyBmdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9ub29wLnRzXCI6e1wiYnJva2VuV2ZcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vd29ya2Zsb3dzL25vb3AudHMvL2Jyb2tlbldmXCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9ub29wLnRzXCI6e1wibm9vcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL25vb3AudHMvL25vb3BcIn19fX0qLztcbmV4cG9ydCB2YXIgbm9vcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9ub29wLnRzLy9ub29wXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJyb2tlbldmKCkge1xuICAgIGNvbnN0IG51bWJlcnMgPSBbXTtcbiAgICB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspe1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChub29wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnYXdhaXQgNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgMTU7IGkrKyl7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vb3AoMTAwICsgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdhd2FpdCAxNScpO1xuICAgICAgICBudW1iZXJzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ2RvbmUuJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyc1xuICAgIH07XG59XG5icm9rZW5XZi53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL25vb3AudHMvL2Jyb2tlbldmXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ub29wLnRzLy9icm9rZW5XZlwiLCBicm9rZW5XZik7XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvbnVsbC1ieXRlLnRzXCI6e1wibnVsbEJ5dGVXb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly93b3JrZmxvd3MvbnVsbC1ieXRlLnRzLy9udWxsQnl0ZVdvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9udWxsLWJ5dGUudHNcIjp7XCJudWxsQnl0ZVN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlU3RlcFwifX19fSovO1xudmFyIG51bGxCeXRlU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlU3RlcFwiKTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBudWxsQnl0ZVdvcmtmbG93KCkge1xuICAgIGNvbnN0IGEgPSBhd2FpdCBudWxsQnl0ZVN0ZXAoKTtcbiAgICByZXR1cm4gYTtcbn1cbm51bGxCeXRlV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvL3dvcmtmbG93cy9udWxsLWJ5dGUudHMvL251bGxCeXRlV29ya2Zsb3dcIjtcbmdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQoXCJ3b3JrZmxvdy8vd29ya2Zsb3dzL251bGwtYnl0ZS50cy8vbnVsbEJ5dGVXb3JrZmxvd1wiLCBudWxsQnl0ZVdvcmtmbG93KTtcbiIsICJpbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcblxuLyoqXG4gKiBQYXJzZXMgYSBkdXJhdGlvbiBwYXJhbWV0ZXIgKHN0cmluZywgbnVtYmVyLCBvciBEYXRlKSBhbmQgcmV0dXJucyBhIERhdGUgb2JqZWN0XG4gKiByZXByZXNlbnRpbmcgd2hlbiB0aGUgZHVyYXRpb24gc2hvdWxkIGVsYXBzZS5cbiAqXG4gKiAtIEZvciBzdHJpbmdzOiBQYXJzZXMgZHVyYXRpb24gc3RyaW5ncyBsaWtlIFwiMXNcIiwgXCI1bVwiLCBcIjFoXCIsIGV0Yy4gdXNpbmcgdGhlIGBtc2AgbGlicmFyeVxuICogLSBGb3IgbnVtYmVyczogVHJlYXRzIGFzIG1pbGxpc2Vjb25kcyBmcm9tIG5vd1xuICogLSBGb3IgRGF0ZSBvYmplY3RzOiBSZXR1cm5zIHRoZSBkYXRlIGRpcmVjdGx5IChoYW5kbGVzIGJvdGggRGF0ZSBpbnN0YW5jZXMgYW5kIGRhdGUtbGlrZSBvYmplY3RzIGZyb20gZGVzZXJpYWxpemF0aW9uKVxuICpcbiAqIEBwYXJhbSBwYXJhbSAtIFRoZSBkdXJhdGlvbiBwYXJhbWV0ZXIgKFN0cmluZ1ZhbHVlLCBEYXRlLCBvciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQSBEYXRlIG9iamVjdCByZXByZXNlbnRpbmcgd2hlbiB0aGUgZHVyYXRpb24gc2hvdWxkIGVsYXBzZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZCBvciBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUR1cmF0aW9uVG9EYXRlKHBhcmFtOiBTdHJpbmdWYWx1ZSB8IERhdGUgfCBudW1iZXIpOiBEYXRlIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gbXMocGFyYW0pO1xuICAgIGlmICh0eXBlb2YgZHVyYXRpb25NcyAhPT0gJ251bWJlcicgfHwgZHVyYXRpb25NcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZHVyYXRpb246IFwiJHtwYXJhbX1cIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgKyBkdXJhdGlvbk1zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHBhcmFtIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKHBhcmFtKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBkdXJhdGlvbjogJHtwYXJhbX0uIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgcGFyYW0pO1xuICB9IGVsc2UgaWYgKFxuICAgIHBhcmFtIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIChwYXJhbSAmJlxuICAgICAgdHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIChwYXJhbSBhcyBhbnkpLmdldFRpbWUgPT09ICdmdW5jdGlvbicpXG4gICkge1xuICAgIC8vIEhhbmRsZSBib3RoIERhdGUgaW5zdGFuY2VzIGFuZCBkYXRlLWxpa2Ugb2JqZWN0cyAoZnJvbSBkZXNlcmlhbGl6YXRpb24pXG4gICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgRGF0ZSA/IHBhcmFtIDogbmV3IERhdGUoKHBhcmFtIGFzIGFueSkuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBkdXJhdGlvbiBwYXJhbWV0ZXIuIEV4cGVjdGVkIGEgZHVyYXRpb24gc3RyaW5nLCBudW1iZXIgKG1pbGxpc2Vjb25kcyksIG9yIERhdGUgb2JqZWN0LmBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcGFyc2VEdXJhdGlvblRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuXG5jb25zdCBCQVNFX1VSTCA9ICdodHRwczovL3VzZXdvcmtmbG93LmRldi9lcnInO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhbiBFcnJvciB3aXRob3V0IHJlbHlpbmcgb24gTm9kZS5qcyB1dGlsaXRpZXMuXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgZXJyb3IgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIFZNIGNvbnRleHRzIHdoZXJlXG4gKiBOb2RlLmpzIGltcG9ydHMgYXJlIG5vdCBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7IG5hbWU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICduYW1lJyBpbiB2YWx1ZSAmJlxuICAgICdtZXNzYWdlJyBpbiB2YWx1ZVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQWxsIHRoZSBzbHVncyBvZiB0aGUgZXJyb3JzIHVzZWQgZm9yIGRvY3VtZW50YXRpb24gbGlua3MuXG4gKi9cbmV4cG9ydCBjb25zdCBFUlJPUl9TTFVHUyA9IHtcbiAgTk9ERV9KU19NT0RVTEVfSU5fV09SS0ZMT1c6ICdub2RlLWpzLW1vZHVsZS1pbi13b3JrZmxvdycsXG4gIFNUQVJUX0lOVkFMSURfV09SS0ZMT1dfRlVOQ1RJT046ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyxcbiAgU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcsXG4gIFdFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUU6ICd3ZWJob29rLWludmFsaWQtcmVzcG9uZC13aXRoLXZhbHVlJyxcbiAgV0VCSE9PS19SRVNQT05TRV9OT1RfU0VOVDogJ3dlYmhvb2stcmVzcG9uc2Utbm90LXNlbnQnLFxuICBGRVRDSF9JTl9XT1JLRkxPV19GVU5DVElPTjogJ2ZldGNoLWluLXdvcmtmbG93JyxcbiAgVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1c6ICd0aW1lb3V0LWluLXdvcmtmbG93JyxcbiAgSE9PS19DT05GTElDVDogJ2hvb2stY29uZmxpY3QnLFxufSBhcyBjb25zdDtcblxudHlwZSBFcnJvclNsdWcgPSAodHlwZW9mIEVSUk9SX1NMVUdTKVtrZXlvZiB0eXBlb2YgRVJST1JfU0xVR1NdO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3dFcnJvck9wdGlvbnMgZXh0ZW5kcyBFcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNsdWcgb2YgdGhlIGVycm9yLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGxpbmsgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24uXG4gICAqL1xuICBzbHVnPzogRXJyb3JTbHVnO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgV29ya2Zsb3ctcmVsYXRlZCBlcnJvcnMuXG4gKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gYnkgdGhlIFdvcmtmbG93IERldktpdCB3aGVuIGludGVybmFsIG9wZXJhdGlvbnMgZmFpbC5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgY2xhc3Mgd2l0aCBgaW5zdGFuY2VvZmAgdG8gY2F0Y2ggYW55IFdvcmtmbG93IERldktpdCBlcnJvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGdldFJ1bihydW5JZCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3JrZmxvd0Vycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignV29ya2Zsb3cgRGV2S2l0IGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBXb3JrZmxvd0Vycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IG1zZ0RvY3MgPSBvcHRpb25zPy5zbHVnXG4gICAgICA/IGAke21lc3NhZ2V9XFxuXFxuTGVhcm4gbW9yZTogJHtCQVNFX1VSTH0vJHtvcHRpb25zLnNsdWd9YFxuICAgICAgOiBtZXNzYWdlO1xuICAgIHN1cGVyKG1zZ0RvY3MsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuICAgIHRoaXMuY2F1c2UgPSBvcHRpb25zPy5jYXVzZTtcblxuICAgIGlmIChvcHRpb25zPy5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aGlzLnN0YWNrID0gYCR7dGhpcy5zdGFja31cXG5DYXVzZWQgYnk6ICR7b3B0aW9ucy5jYXVzZS5zdGFja31gO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93RXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFdvcmtmbG93IEFQSSByZXF1ZXN0IGZhaWxzLlxuICpcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gSFRUUCByZXF1ZXN0cyB0byB0aGUgV29ya2Zsb3cgYmFja2VuZCBmYWlsLFxuICogdHlwaWNhbGx5IGR1ZSB0byBuZXR3b3JrIGlzc3VlcywgaW52YWxpZCByZXF1ZXN0cywgb3Igc2VydmVyIGVycm9ycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHN0YXJ0V29ya2Zsb3coJ215V29ya2Zsb3cnLCBpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3JrZmxvd0FQSUVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihgQVBJIGVycm9yICgke2Vycm9yLnN0YXR1c30pOmAsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93QVBJRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHtcbiAgc3RhdHVzPzogbnVtYmVyO1xuICBjb2RlPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHN0YXR1cz86IG51bWJlcjsgdXJsPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucz8uY2F1c2UsXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93QVBJRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gb3B0aW9ucz8uc3RhdHVzO1xuICAgIHRoaXMuY29kZSA9IG9wdGlvbnM/LmNvZGU7XG4gICAgdGhpcy51cmwgPSBvcHRpb25zPy51cmw7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd0FQSUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93QVBJRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSB3b3JrZmxvdyBydW4gZmFpbHMgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHRoZSB3b3JrZmxvdyBlbmNvdW50ZXJlZCBhIGZhdGFsIGVycm9yXG4gKiBhbmQgY2Fubm90IGNvbnRpbnVlLiBUaGUgYGNhdXNlYCBwcm9wZXJ0eSBjb250YWlucyB0aGUgdW5kZXJseWluZ1xuICogZXJyb3Igd2l0aCBpdHMgbWVzc2FnZSwgc3RhY2sgdHJhY2UsIGFuZCBvcHRpb25hbCBlcnJvciBjb2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGNvbnN0IHJ1biA9IGF3YWl0IGdldFJ1bihydW5JZCk7XG4gKiBpZiAocnVuLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAqICAgLy8gV29ya2Zsb3dSdW5GYWlsZWRFcnJvciB3aWxsIGJlIHRocm93blxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bkZhaWxlZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGRlY2xhcmUgY2F1c2U6IEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH07XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgZXJyb3I6IFN0cnVjdHVyZWRFcnJvcikge1xuICAgIC8vIENyZWF0ZSBhIHByb3BlciBFcnJvciBpbnN0YW5jZSBmcm9tIHRoZSBTdHJ1Y3R1cmVkRXJyb3IgdG8gc2V0IGFzIGNhdXNlXG4gICAgLy8gTk9URTogY3VzdG9tIGVycm9yIHR5cGVzIGRvIG5vdCBnZXQgc2VyaWFsaXplZC9kZXNlcmlhbGl6ZWQuIEV2ZXJ5dGhpbmcgaXMgYW4gRXJyb3JcbiAgICBjb25zdCBjYXVzZUVycm9yID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgY2F1c2VFcnJvci5zdGFjayA9IGVycm9yLnN0YWNrO1xuICAgIH1cbiAgICBpZiAoZXJyb3IuY29kZSkge1xuICAgICAgKGNhdXNlRXJyb3IgYXMgYW55KS5jb2RlID0gZXJyb3IuY29kZTtcbiAgICB9XG5cbiAgICBzdXBlcihgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gLCB7XG4gICAgICBjYXVzZTogY2F1c2VFcnJvcixcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5GYWlsZWRFcnJvcic7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya2Zsb3dSdW5GYWlsZWRFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdXb3JrZmxvd1J1bkZhaWxlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gZ2V0IHJlc3VsdHMgZnJvbSBhbiBpbmNvbXBsZXRlIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSB0cnkgdG8gYWNjZXNzIHRoZSByZXN1bHQgb2YgYSB3b3JrZmxvd1xuICogdGhhdCBpcyBzdGlsbCBydW5uaW5nIG9yIGhhc24ndCBjb21wbGV0ZWQgeWV0LlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5Ob3RDb21wbGV0ZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBydW5JZDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBzdGF0dXM6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBub3QgY29tcGxldGVkYCwge30pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bk5vdENvbXBsZXRlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93UnVuTm90Q29tcGxldGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIFdvcmtmbG93IHJ1bnRpbWUgZW5jb3VudGVycyBhbiBpbnRlcm5hbCBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGluZGljYXRlcyBhbiBpc3N1ZSB3aXRoIHdvcmtmbG93IGV4ZWN1dGlvbiwgc3VjaCBhc1xuICogc2VyaWFsaXphdGlvbiBmYWlsdXJlcywgc3RhcnRpbmcgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbiwgb3JcbiAqIG90aGVyIHJ1bnRpbWUgcHJvYmxlbXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1J1bnRpbWVFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBXb3JrZmxvd0Vycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVudGltZUVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVudGltZUVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1dvcmtmbG93UnVudGltZUVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7XG4gIHJ1bklkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIG5vdCBmb3VuZGAsIHt9KTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICBydW5JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBjYW5jZWxsZWRgLCB7fSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3InO1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtmbG93UnVuQ2FuY2VsbGVkRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnV29ya2Zsb3dSdW5DYW5jZWxsZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIG9wZXJhdGUgb24gYSB3b3JrZmxvdyBydW4gdGhhdCByZXF1aXJlcyBhIG5ld2VyIFdvcmxkIHZlcnNpb24uXG4gKlxuICogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiBhIHJ1biB3YXMgY3JlYXRlZCB3aXRoIGEgbmV3ZXIgc3BlYyB2ZXJzaW9uIHRoYW4gdGhlXG4gKiBjdXJyZW50IFdvcmxkIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzLiBVc2VycyBzaG91bGQgdXBncmFkZSB0aGVpciBAd29ya2Zsb3cgcGFja2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5Ob3RTdXBwb3J0ZWRFcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige1xuICByZWFkb25seSBydW5TcGVjVmVyc2lvbjogbnVtYmVyO1xuICByZWFkb25seSB3b3JsZFNwZWNWZXJzaW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocnVuU3BlY1ZlcnNpb246IG51bWJlciwgd29ybGRTcGVjVmVyc2lvbjogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUnVuIHJlcXVpcmVzIHNwZWMgdmVyc2lvbiAke3J1blNwZWNWZXJzaW9ufSwgYnV0IHdvcmxkIHN1cHBvcnRzIHZlcnNpb24gJHt3b3JsZFNwZWNWZXJzaW9ufS4gYCArXG4gICAgICAgIGBQbGVhc2UgdXBncmFkZSAnd29ya2Zsb3cnIHBhY2thZ2UuYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bk5vdFN1cHBvcnRlZEVycm9yJztcbiAgICB0aGlzLnJ1blNwZWNWZXJzaW9uID0gcnVuU3BlY1ZlcnNpb247XG4gICAgdGhpcy53b3JsZFNwZWNWZXJzaW9uID0gd29ybGRTcGVjVmVyc2lvbjtcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bk5vdFN1cHBvcnRlZEVycm9yIHtcbiAgICByZXR1cm4gaXNFcnJvcih2YWx1ZSkgJiYgdmFsdWUubmFtZSA9PT0gJ1J1bk5vdFN1cHBvcnRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEEgZmF0YWwgZXJyb3IgaXMgYW4gZXJyb3IgdGhhdCBjYW5ub3QgYmUgcmV0cmllZC5cbiAqIEl0IHdpbGwgY2F1c2UgdGhlIHN0ZXAgdG8gZmFpbCBhbmQgdGhlIGVycm9yIHdpbGxcbiAqIGJlIGJ1YmJsZWQgdXAgdG8gdGhlIHdvcmtmbG93IGxvZ2ljLlxuICovXG5leHBvcnQgY2xhc3MgRmF0YWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZmF0YWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZhdGFsRXJyb3Ige1xuICAgIHJldHVybiBpc0Vycm9yKHZhbHVlKSAmJiB2YWx1ZS5uYW1lID09PSAnRmF0YWxFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeWFibGVFcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgdGhlIHN0ZXAuXG4gICAqIENhbiBhbHNvIGJlIGEgZHVyYXRpb24gc3RyaW5nIChlLmcuLCBcIjVzXCIsIFwiMm1cIikgb3IgYSBEYXRlIG9iamVjdC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgc3RlcCB3aWxsIGJlIHJldHJpZWQgYWZ0ZXIgMSBzZWNvbmQgKDEwMDAgbWlsbGlzZWNvbmRzKS5cbiAgICovXG4gIHJldHJ5QWZ0ZXI/OiBudW1iZXIgfCBTdHJpbmdWYWx1ZSB8IERhdGU7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhhdCBjYW4gaGFwcGVuIGR1cmluZyBhIHN0ZXAgZXhlY3V0aW9uLCBhbGxvd2luZ1xuICogZm9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgY2xhc3MgUmV0cnlhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgRGF0ZSB3aGVuIHRoZSBzdGVwIHNob3VsZCBiZSByZXRyaWVkLlxuICAgKi9cbiAgcmV0cnlBZnRlcjogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJ5YWJsZUVycm9yT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcblxuICAgIGlmIChvcHRpb25zLnJldHJ5QWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXRyeUFmdGVyID0gcGFyc2VEdXJhdGlvblRvRGF0ZShvcHRpb25zLnJldHJ5QWZ0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIDEgc2Vjb25kICgxMDAwIG1pbGxpc2Vjb25kcylcbiAgICAgIHRoaXMucmV0cnlBZnRlciA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZXRyeWFibGVFcnJvciB7XG4gICAgcmV0dXJuIGlzRXJyb3IodmFsdWUpICYmIHZhbHVlLm5hbWUgPT09ICdSZXRyeWFibGVFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSA9XG4gICdZb3VyIGN1cnJlbnQgdmVyY2VsIGFjY291bnQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVXNlIGB2ZXJjZWwgbG9naW5gIG9yIGB2ZXJjZWwgc3dpdGNoYCB0byBlbnN1cmUgeW91IGFyZSBsaW5rZWQgdG8gdGhlIHJpZ2h0IGFjY291bnQuIFlvdSBtaWdodCBuZWVkIHRvIHJ1biBgdmVyY2VsIGVudiBwdWxsYCB0byB1c2UgdGhlIGxhdGVzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuJztcbiIsICJleHBvcnQgY29uc3QgV09SS0ZMT1dfVVNFX1NURVAgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NSRUFURV9IT09LID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQ1JFQVRFX0hPT0snKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19TTEVFUCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NMRUVQJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0NPTlRFWFQnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19HRVRfU1RSRUFNX0lEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCcpO1xuZXhwb3J0IGNvbnN0IFNUQUJMRV9VTElEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RBQkxFX1VMSUQnKTtcbmV4cG9ydCBjb25zdCBTVFJFQU1fTkFNRV9TWU1CT0wgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9UWVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyk7XG5leHBvcnQgY29uc3QgQk9EWV9JTklUX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0JPRFlfSU5JVCcpO1xuZXhwb3J0IGNvbnN0IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgPSBTeW1ib2wuZm9yKFxuICAnV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSdcbik7XG5cbi8qKlxuICogU3ltYm9sIHVzZWQgdG8gc3RvcmUgdGhlIGNsYXNzIHJlZ2lzdHJ5IG9uIGdsb2JhbFRoaXMgaW4gd29ya2Zsb3cgbW9kZS5cbiAqIFRoaXMgYWxsb3dzIHRoZSBkZXNlcmlhbGl6ZXIgdG8gZmluZCBjbGFzc2VzIGJ5IGNsYXNzSWQgaW4gdGhlIFZNIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjb25zdCBXT1JLRkxPV19DTEFTU19SRUdJU1RSWSA9IFN5bWJvbC5mb3IoJ3dvcmtmbG93LWNsYXNzLXJlZ2lzdHJ5Jyk7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBIb29rLFxuICBIb29rT3B0aW9ucyxcbiAgUmVxdWVzdFdpdGhSZXNwb25zZSxcbiAgV2ViaG9vayxcbiAgV2ViaG9va09wdGlvbnMsXG59IGZyb20gJy4uL2NyZWF0ZS1ob29rLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX0NSRUFURV9IT09LIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG9vazxUID0gYW55PihvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFQ+IHtcbiAgLy8gSW5zaWRlIHRoZSB3b3JrZmxvdyBWTSwgdGhlIGhvb2sgZnVuY3Rpb24gaXMgc3RvcmVkIGluIHRoZSBnbG9iYWxUaGlzIG9iamVjdCBiZWhpbmQgYSBzeW1ib2xcbiAgY29uc3QgY3JlYXRlSG9va0ZuID0gKGdsb2JhbFRoaXMgYXMgYW55KVtcbiAgICBXT1JLRkxPV19DUkVBVEVfSE9PS1xuICBdIGFzIHR5cGVvZiBjcmVhdGVIb29rPFQ+O1xuICBpZiAoIWNyZWF0ZUhvb2tGbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdgY3JlYXRlSG9vaygpYCBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgd29ya2Zsb3cgZnVuY3Rpb24nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlSG9va0ZuKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhcbiAgb3B0aW9uczogV2ViaG9va09wdGlvbnMgJiB7IHJlc3BvbmRXaXRoOiAnbWFudWFsJyB9XG4pOiBXZWJob29rPFJlcXVlc3RXaXRoUmVzcG9uc2U+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2sob3B0aW9ucz86IFdlYmhvb2tPcHRpb25zKTogV2ViaG9vazxSZXF1ZXN0PjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKFxuICBvcHRpb25zPzogV2ViaG9va09wdGlvbnNcbik6IFdlYmhvb2s8UmVxdWVzdD4gfCBXZWJob29rPFJlcXVlc3RXaXRoUmVzcG9uc2U+IHtcbiAgY29uc3QgeyByZXNwb25kV2l0aCwgLi4ucmVzdCB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IG1ldGFkYXRhOiBQaWNrPFdlYmhvb2tPcHRpb25zLCAncmVzcG9uZFdpdGgnPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiByZXNwb25kV2l0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtZXRhZGF0YSA9IHsgcmVzcG9uZFdpdGggfTtcbiAgfVxuXG4gIGNvbnN0IGhvb2sgPSBjcmVhdGVIb29rKHsgLi4ucmVzdCwgbWV0YWRhdGEgfSkgYXNcbiAgICB8IFdlYmhvb2s8UmVxdWVzdD5cbiAgICB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5cbiAgY29uc3QgeyB1cmwgfSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgaG9vay51cmwgPSBgJHt1cmx9Ly53ZWxsLWtub3duL3dvcmtmbG93L3YxL3dlYmhvb2svJHtlbmNvZGVVUklDb21wb25lbnQoaG9vay50b2tlbil9YDtcblxuICByZXR1cm4gaG9vaztcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEhvb2sgYXMgSG9va0VudGl0eSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgY3JlYXRlSG9vayB9IGZyb20gJy4vY3JlYXRlLWhvb2suanMnO1xuXG4vKipcbiAqIE5PVEU6IFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBkZWZpbmVIb29rKClgIHRoYXQgaXMgdXNlZCBpbiB3b3JrZmxvdyBjb250ZXh0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUhvb2s8VElucHV0LCBUT3V0cHV0ID0gVElucHV0PigpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUT3V0cHV0PiB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9vazxUT3V0cHV0PihvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgcmVzdW1lKF90b2tlbjogc3RyaW5nLCBfcGF5bG9hZDogVElucHV0KTogUHJvbWlzZTxIb29rRW50aXR5IHwgbnVsbD4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYGRlZmluZUhvb2soKS5yZXN1bWUoKWAgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gZXh0ZXJuYWwgY29udGV4dHMgKGUuZy4gQVBJIHJvdXRlcykuJ1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMgfSBmcm9tICcuLi9zdGVwL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBTVFJFQU1fTkFNRV9TWU1CT0wsIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRhYmxlPFcgPSBhbnk+KFxuICBvcHRpb25zOiBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyA9IHt9XG4pOiBXcml0YWJsZVN0cmVhbTxXPiB7XG4gIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBvcHRpb25zO1xuICBjb25zdCBuYW1lID0gKGdsb2JhbFRoaXMgYXMgYW55KVtXT1JLRkxPV19HRVRfU1RSRUFNX0lEXShuYW1lc3BhY2UpO1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICB2YWx1ZTogbmFtZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbn1cbiIsICIvKipcbiAqIFRoaXMgaXMgdGhlIFwic3RhbmRhcmQgbGlicmFyeVwiIG9mIHN0ZXBzIHRoYXQgd2UgbWFrZSBhdmFpbGFibGUgdG8gYWxsIHdvcmtmbG93IHVzZXJzLlxuICogVGhlIGNhbiBiZSBpbXBvcnRlZCBsaWtlIHNvOiBgaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICd3b3JrZmxvdydgLiBhbmQgdXNlZCBpbiB3b3JrZmxvdy5cbiAqIFRoZSBuZWVkIHRvIGJlIGV4cG9ydGVkIGRpcmVjdGx5IGluIHRoaXMgcGFja2FnZSBhbmQgY2Fubm90IGxpdmUgaW4gYGNvcmVgIHRvIHByZXZlbnRcbiAqIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBwb3N0LWNvbXBpbGF0aW9uLlxuICovXG5cbi8qKlxuICogQSBob2lzdGVkIGBmZXRjaCgpYCBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGFzIGEgXCJzdGVwXCIgZnVuY3Rpb24sXG4gKiBmb3IgdXNlIHdpdGhpbiB3b3JrZmxvdyBmdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoPikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaCguLi5hcmdzKTtcbn1cbiIsICJpbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSAnd29ya2Zsb3cnO1xuLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJ3b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50c1wiOntcInJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzXCI6e1wic3RlcFRoYXRGYWlsc1wiOntcInN0ZXBJZFwiOlwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0RmFpbHNcIn0sXCJzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yXCI6e1wic3RlcElkXCI6XCJzdGVwLy93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vc3RlcFRoYXRUaHJvd3NSZXRyeWFibGVFcnJvclwifX19fSovO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdygpIHtcbiAgICBjb25zdCByZXRyeWFibGVSZXN1bHQgPSBhd2FpdCBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yKCk7XG4gICAgbGV0IGdvdEZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdGVwVGhhdEZhaWxzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICAgICAgICBnb3RGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZXRyeWFibGVSZXN1bHQsXG4gICAgICAgIGdvdEZhdGFsRXJyb3JcbiAgICB9O1xufVxucmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly93b3JrZmxvd3MvcmV0cmlhYmxlLWFuZC1mYXRhbC50cy8vcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93XCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9yZXRyeWFibGVBbmRGYXRhbEVycm9yV29ya2Zsb3dcIiwgcmV0cnlhYmxlQW5kRmF0YWxFcnJvcldvcmtmbG93KTtcbnZhciBzdGVwVGhhdFRocm93c1JldHJ5YWJsZUVycm9yID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMvL3N0ZXBUaGF0VGhyb3dzUmV0cnlhYmxlRXJyb3JcIik7XG52YXIgc3RlcFRoYXRGYWlscyA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9yZXRyaWFibGUtYW5kLWZhdGFsLnRzLy9zdGVwVGhhdEZhaWxzXCIpO1xuIiwgIi8qKiBBIHNwZWNpYWwgY29uc3RhbnQgd2l0aCB0eXBlIGBuZXZlcmAgKi8gZXhwb3J0IGNvbnN0IE5FVkVSID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc3RhdHVzOiBcImFib3J0ZWRcIlxufSk7XG5leHBvcnQgLypAX19OT19TSURFX0VGRkVDVFNfXyovIGZ1bmN0aW9uICRjb25zdHJ1Y3RvcihuYW1lLCBpbml0aWFsaXplciwgcGFyYW1zKSB7XG4gICAgZnVuY3Rpb24gaW5pdChpbnN0LCBkZWYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdCwgXCJfem9kXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0Ll96b2QgPz8ge30sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS50cmFpdHMgPz8gKF9hLnRyYWl0cyA9IG5ldyBTZXQoKSk7XG4gICAgICAgIGluc3QuX3pvZC50cmFpdHMuYWRkKG5hbWUpO1xuICAgICAgICBpbml0aWFsaXplcihpbnN0LCBkZWYpO1xuICAgICAgICAvLyBzdXBwb3J0IHByb3RvdHlwZSBtb2RpZmljYXRpb25zXG4gICAgICAgIGZvcihjb25zdCBrIGluIF8ucHJvdG90eXBlKXtcbiAgICAgICAgICAgIGlmICghKGsgaW4gaW5zdCkpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBrLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IF8ucHJvdG90eXBlW2tdLmJpbmQoaW5zdClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGluc3QuX3pvZC5jb25zdHIgPSBfO1xuICAgICAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIH1cbiAgICAvLyBkb2Vzbid0IHdvcmsgaWYgUGFyZW50IGhhcyBhIGNvbnN0cnVjdG9yIHdpdGggYXJndW1lbnRzXG4gICAgY29uc3QgUGFyZW50ID0gcGFyYW1zPy5QYXJlbnQgPz8gT2JqZWN0O1xuICAgIGNsYXNzIERlZmluaXRpb24gZXh0ZW5kcyBQYXJlbnQge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVmaW5pdGlvbiwgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBfKGRlZikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGluc3QgPSBwYXJhbXM/LlBhcmVudCA/IG5ldyBEZWZpbml0aW9uKCkgOiB0aGlzO1xuICAgICAgICBpbml0KGluc3QsIGRlZik7XG4gICAgICAgIChfYSA9IGluc3QuX3pvZCkuZGVmZXJyZWQgPz8gKF9hLmRlZmVycmVkID0gW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGluc3QuX3pvZC5kZWZlcnJlZCl7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJpbml0XCIsIHtcbiAgICAgICAgdmFsdWU6IGluaXRcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgICAgIHZhbHVlOiAoaW5zdCk9PntcbiAgICAgICAgICAgIGlmIChwYXJhbXM/LlBhcmVudCAmJiBpbnN0IGluc3RhbmNlb2YgcGFyYW1zLlBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaW5zdD8uX3pvZD8udHJhaXRzPy5oYXMobmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXywgXCJuYW1lXCIsIHtcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbn1cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFVUSUxJVElFUyAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGNvbnN0ICRicmFuZCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmV4cG9ydCBjbGFzcyAkWm9kQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcihgRW5jb3VudGVyZWQgUHJvbWlzZSBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2UuIFVzZSAucGFyc2VBc3luYygpIGluc3RlYWQuYCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzICRab2RFbmNvZGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKXtcbiAgICAgICAgc3VwZXIoYEVuY291bnRlcmVkIHVuaWRpcmVjdGlvbmFsIHRyYW5zZm9ybSBkdXJpbmcgZW5jb2RlOiAke25hbWV9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRW5jb2RlRXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgZ2xvYmFsQ29uZmlnID0ge307XG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKG5ld0NvbmZpZykge1xuICAgIGlmIChuZXdDb25maWcpIE9iamVjdC5hc3NpZ24oZ2xvYmFsQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iLCAiLy8gZnVuY3Rpb25zXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsKSB7XG4gICAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RFcXVhbCh2YWwpIHtcbiAgICByZXR1cm4gdmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHt9XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoXykge31cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKGVudHJpZXMpIHtcbiAgICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnRyaWVzKS5maWx0ZXIoKHYpPT50eXBlb2YgdiA9PT0gXCJudW1iZXJcIik7XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmVudHJpZXMoZW50cmllcykuZmlsdGVyKChbaywgX10pPT5udW1lcmljVmFsdWVzLmluZGV4T2YoK2spID09PSAtMSkubWFwKChbXywgdl0pPT52KTtcbiAgICByZXR1cm4gdmFsdWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5WYWx1ZXMoYXJyYXksIHNlcGFyYXRvciA9IFwifFwiKSB7XG4gICAgcmV0dXJuIGFycmF5Lm1hcCgodmFsKT0+c3RyaW5naWZ5UHJpbWl0aXZlKHZhbCkpLmpvaW4oc2VwYXJhdG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBqc29uU3RyaW5naWZ5UmVwbGFjZXIoXywgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkKGdldHRlcikge1xuICAgIGNvbnN0IHNldCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCB2YWx1ZSAoKSB7XG4gICAgICAgICAgICBpZiAoIXNldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyKCk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwidmFsdWVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhY2hlZCB2YWx1ZSBhbHJlYWR5IHNldFwiKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbGlzaChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuUmVnZXgoc291cmNlKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzb3VyY2Uuc3RhcnRzV2l0aChcIl5cIikgPyAxIDogMDtcbiAgICBjb25zdCBlbmQgPSBzb3VyY2UuZW5kc1dpdGgoXCIkXCIpID8gc291cmNlLmxlbmd0aCAtIDEgOiBzb3VyY2UubGVuZ3RoO1xuICAgIHJldHVybiBzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkge1xuICAgIGNvbnN0IHZhbERlY0NvdW50ID0gKHZhbC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3Qgc3RlcFN0cmluZyA9IHN0ZXAudG9TdHJpbmcoKTtcbiAgICBsZXQgc3RlcERlY0NvdW50ID0gKHN0ZXBTdHJpbmcuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBpZiAoc3RlcERlY0NvdW50ID09PSAwICYmIC9cXGQ/ZS1cXGQ/Ly50ZXN0KHN0ZXBTdHJpbmcpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3RlcFN0cmluZy5tYXRjaCgvXFxkP2UtKFxcZD8pLyk7XG4gICAgICAgIGlmIChtYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzdGVwRGVjQ291bnQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRlY0NvdW50ID0gdmFsRGVjQ291bnQgPiBzdGVwRGVjQ291bnQgPyB2YWxEZWNDb3VudCA6IHN0ZXBEZWNDb3VudDtcbiAgICBjb25zdCB2YWxJbnQgPSBOdW1iZXIucGFyc2VJbnQodmFsLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICBjb25zdCBzdGVwSW50ID0gTnVtYmVyLnBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiB2YWxJbnQgJSBzdGVwSW50IC8gMTAgKiogZGVjQ291bnQ7XG59XG5jb25zdCBFVkFMVUFUSU5HID0gU3ltYm9sKFwiZXZhbHVhdGluZ1wiKTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVMYXp5KG9iamVjdCwga2V5LCBnZXR0ZXIpIHtcbiAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IEVWQUxVQVRJTkcpIHtcbiAgICAgICAgICAgICAgICAvLyBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQsIHJldHVybiB1bmRlZmluZWQgdG8gYnJlYWsgdGhlIGN5Y2xlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBFVkFMVUFUSU5HO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0dGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCAodikge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyBvYmplY3Rba2V5XSA9IHY7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdENsb25lKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25Qcm9wKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wLCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWZzKC4uLmRlZnMpIHtcbiAgICBjb25zdCBtZXJnZWREZXNjcmlwdG9ycyA9IHt9O1xuICAgIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpe1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGRlZik7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkRGVzY3JpcHRvcnMsIGRlc2NyaXB0b3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCBtZXJnZWREZXNjcmlwdG9ycyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xvbmVEZWYoc2NoZW1hKSB7XG4gICAgcmV0dXJuIG1lcmdlRGVmcyhzY2hlbWEuX3pvZC5kZWYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRBdFBhdGgob2JqLCBwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gb2JqO1xuICAgIHJldHVybiBwYXRoLnJlZHVjZSgoYWNjLCBrZXkpPT5hY2M/LltrZXldLCBvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VBbGxPYmplY3QocHJvbWlzZXNPYmopIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvbWlzZXNPYmopO1xuICAgIGNvbnN0IHByb21pc2VzID0ga2V5cy5tYXAoKGtleSk9PnByb21pc2VzT2JqW2tleV0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigocmVzdWx0cyk9PntcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPYmogPSB7fTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgcmVzb2x2ZWRPYmpba2V5c1tpXV0gPSByZXN1bHRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZE9iajtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoID0gMTApIHtcbiAgICBjb25zdCBjaGFycyA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspe1xuICAgICAgICBzdHIgKz0gY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKV07XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5leHBvcnQgZnVuY3Rpb24gZXNjKHN0cikge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdHIpO1xufVxuZXhwb3J0IGNvbnN0IGNhcHR1cmVTdGFja1RyYWNlID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgOiAoLi4uX2FyZ3MpPT57fTtcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG5leHBvcnQgY29uc3QgYWxsb3dzRXZhbCA9IGNhY2hlZCgoKT0+e1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3I/LnVzZXJBZ2VudD8uaW5jbHVkZXMoXCJDbG91ZGZsYXJlXCIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgRiA9IEZ1bmN0aW9uO1xuICAgICAgICBuZXcgRihcIlwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSk7XG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvKSB7XG4gICAgaWYgKGlzT2JqZWN0KG8pID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIG1vZGlmaWVkIGNvbnN0cnVjdG9yXG4gICAgY29uc3QgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gICAgaWYgKGN0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgLy8gbW9kaWZpZWQgcHJvdG90eXBlXG4gICAgY29uc3QgcHJvdCA9IGN0b3IucHJvdG90eXBlO1xuICAgIGlmIChpc09iamVjdChwcm90KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAvLyBjdG9yIGRvZXNuJ3QgaGF2ZSBzdGF0aWMgYGlzUHJvdG90eXBlT2ZgXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90LCBcImlzUHJvdG90eXBlT2ZcIikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0Nsb25lKG8pIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvKSkgcmV0dXJuIHtcbiAgICAgICAgLi4ub1xuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBbXG4gICAgICAgIC4uLm9cbiAgICBdO1xuICAgIHJldHVybiBvO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bUtleXMoZGF0YSkge1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlDb3VudDtcbn1cbmV4cG9ydCBjb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpPT57XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCh0KXtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGEpID8gXCJuYW5cIiA6IFwibnVtYmVyXCI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN5bWJvbFwiO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmIGRhdGEuY2F0Y2ggJiYgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInByb21pc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJtYXBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZXRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImZpbGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZTogJHt0fWApO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgcHJvcGVydHlLZXlUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcInN5bWJvbFwiXG5dKTtcbmV4cG9ydCBjb25zdCBwcmltaXRpdmVUeXBlcyA9IG5ldyBTZXQoW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImJpZ2ludFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJ1bmRlZmluZWRcIlxuXSk7XG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnZXgoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG59XG4vLyB6b2Qtc3BlY2lmaWMgdXRpbHNcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShpbnN0LCBkZWYsIHBhcmFtcykge1xuICAgIGNvbnN0IGNsID0gbmV3IGluc3QuX3pvZC5jb25zdHIoZGVmID8/IGluc3QuX3pvZC5kZWYpO1xuICAgIGlmICghZGVmIHx8IHBhcmFtcz8ucGFyZW50KSBjbC5fem9kLnBhcmVudCA9IGluc3Q7XG4gICAgcmV0dXJuIGNsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSB7XG4gICAgY29uc3QgcGFyYW1zID0gX3BhcmFtcztcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHt9O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiKSByZXR1cm4ge1xuICAgICAgICBlcnJvcjogKCk9PnBhcmFtc1xuICAgIH07XG4gICAgaWYgKHBhcmFtcz8ubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwYXJhbXM/LmVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGJvdGggYG1lc3NhZ2VgIGFuZCBgZXJyb3JgIHBhcmFtc1wiKTtcbiAgICAgICAgcGFyYW1zLmVycm9yID0gcGFyYW1zLm1lc3NhZ2U7XG4gICAgfVxuICAgIGRlbGV0ZSBwYXJhbXMubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5lcnJvciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBlcnJvcjogKCk9PnBhcmFtcy5lcnJvclxuICAgIH07XG4gICAgcmV0dXJuIHBhcmFtcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc3BhcmVudFByb3h5KGdldHRlcikge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICBnZXQgKF8sIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IChfLCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHRhcmdldCA/PyAodGFyZ2V0ID0gZ2V0dGVyKCkpO1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWxldGVQcm9wZXJ0eSAoXywgcHJvcCkge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBvd25LZXlzIChfKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChfLCBwcm9wKSB7XG4gICAgICAgICAgICB0YXJnZXQgPz8gKHRhcmdldCA9IGdldHRlcigpKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBkZWZpbmVQcm9wZXJ0eSAoXywgcHJvcCwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdGFyZ2V0ID8/ICh0YXJnZXQgPSBnZXR0ZXIoKSk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5UHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkgKyBcIm5cIjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxLZXlzKHNoYXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNoYXBlKS5maWx0ZXIoKGspPT57XG4gICAgICAgIHJldHVybiBzaGFwZVtrXS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIgJiYgc2hhcGVba10uX3pvZC5vcHRvdXQgPT09IFwib3B0aW9uYWxcIjtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBOVU1CRVJfRk9STUFUX1JBTkdFUyA9IHtcbiAgICBzYWZlaW50OiBbXG4gICAgICAgIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgIF0sXG4gICAgaW50MzI6IFtcbiAgICAgICAgLTIxNDc0ODM2NDgsXG4gICAgICAgIDIxNDc0ODM2NDdcbiAgICBdLFxuICAgIHVpbnQzMjogW1xuICAgICAgICAwLFxuICAgICAgICA0Mjk0OTY3Mjk1XG4gICAgXSxcbiAgICBmbG9hdDMyOiBbXG4gICAgICAgIC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgsXG4gICAgICAgIDMuNDAyODIzNDY2Mzg1Mjg4NmUzOFxuICAgIF0sXG4gICAgZmxvYXQ2NDogW1xuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgTnVtYmVyLk1BWF9WQUxVRVxuICAgIF1cbn07XG5leHBvcnQgY29uc3QgQklHSU5UX0ZPUk1BVF9SQU5HRVMgPSB7XG4gICAgaW50NjQ6IFtcbiAgICAgICAgLyogQF9fUFVSRV9fKi8gQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjkyMjMzNzIwMzY4NTQ3NzU4MDdcIilcbiAgICBdLFxuICAgIHVpbnQ2NDogW1xuICAgICAgICAvKiBAX19QVVJFX18qLyBCaWdJbnQoMCksXG4gICAgICAgIC8qIEBfX1BVUkVfXyovIEJpZ0ludChcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIpXG4gICAgXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGN1cnJEZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgICAgIGZvcihjb25zdCBrZXkgaW4gbWFzayl7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIGN1cnJEZWYuc2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogXCIke2tleX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hc2tba2V5XSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGN1cnJEZWYuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBuZXdTaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIG5ld1NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvbWl0KHNjaGVtYSwgbWFzaykge1xuICAgIGNvbnN0IGN1cnJEZWYgPSBzY2hlbWEuX3pvZC5kZWY7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gY3VyckRlZi5zaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWFza1trZXldKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3U2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBuZXdTaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIG5ld1NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQoc2NoZW1hLCBzaGFwZSkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChzaGFwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCB0byBleHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0XCIpO1xuICAgIH1cbiAgICBjb25zdCBjaGVja3MgPSBzY2hlbWEuX3pvZC5kZWYuY2hlY2tzO1xuICAgIGNvbnN0IGhhc0NoZWNrcyA9IGNoZWNrcyAmJiBjaGVja3MubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzQ2hlY2tzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMgY2Fubm90IGJlIGV4dGVuZGVkLiBVc2UgYC5zYWZlRXh0ZW5kKClgIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSBtZXJnZURlZnMoc2NoZW1hLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uc2NoZW1hLl96b2QuZGVmLnNoYXBlLFxuICAgICAgICAgICAgICAgIC4uLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tzOiBbXVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2FmZUV4dGVuZChzY2hlbWEsIHNoYXBlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHRvIHNhZmVFeHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0XCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgIC4uLnNjaGVtYS5fem9kLmRlZixcbiAgICAgICAgZ2V0IHNoYXBlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IF9zaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEuX3pvZC5kZWYuc2hhcGUsXG4gICAgICAgICAgICAgICAgLi4uc2hhcGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhc3NpZ25Qcm9wKHRoaXMsIFwic2hhcGVcIiwgX3NoYXBlKTsgLy8gc2VsZi1jYWNoaW5nXG4gICAgICAgICAgICByZXR1cm4gX3NoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IHNjaGVtYS5fem9kLmRlZi5jaGVja3NcbiAgICB9O1xuICAgIHJldHVybiBjbG9uZShzY2hlbWEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoYSwgYikge1xuICAgIGNvbnN0IGRlZiA9IG1lcmdlRGVmcyhhLl96b2QuZGVmLCB7XG4gICAgICAgIGdldCBzaGFwZSAoKSB7XG4gICAgICAgICAgICBjb25zdCBfc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgLi4uYS5fem9kLmRlZi5zaGFwZSxcbiAgICAgICAgICAgICAgICAuLi5iLl96b2QuZGVmLnNoYXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXNzaWduUHJvcCh0aGlzLCBcInNoYXBlXCIsIF9zaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIF9zaGFwZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGNhdGNoYWxsICgpIHtcbiAgICAgICAgICAgIHJldHVybiBiLl96b2QuZGVmLmNhdGNoYWxsO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKGEsIGRlZik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFydGlhbChDbGFzcywgc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkU2hhcGUgPSBzY2hlbWEuX3pvZC5kZWYuc2hhcGU7XG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5vbGRTaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9sZFNoYXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAob2xkU2hhcGVba2V5XSEuX3pvZC5vcHRpbiA9PT0gXCJvcHRpb25hbFwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IENsYXNzID8gbmV3IENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZTogb2xkU2hhcGVba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KSA6IG9sZFNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG9sZFNoYXBlKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9sZFNoYXBlW2tleV0hLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBDbGFzcyA/IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSkgOiBvbGRTaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBzaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChDbGFzcywgc2NoZW1hLCBtYXNrKSB7XG4gICAgY29uc3QgZGVmID0gbWVyZ2VEZWZzKHNjaGVtYS5fem9kLmRlZiwge1xuICAgICAgICBnZXQgc2hhcGUgKCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkU2hhcGUgPSBzY2hlbWEuX3pvZC5kZWYuc2hhcGU7XG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5vbGRTaGFwZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChtYXNrKSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBtYXNrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIHNoYXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdGUgd2l0aCBub24tb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IG5ldyBDbGFzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm5vbm9wdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lclR5cGU6IG9sZFNoYXBlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG9sZFNoYXBlKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHdpdGggbm9uLW9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSBuZXcgQ2xhc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlOiBvbGRTaGFwZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2lnblByb3AodGhpcywgXCJzaGFwZVwiLCBzaGFwZSk7IC8vIHNlbGYtY2FjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja3M6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lKHNjaGVtYSwgZGVmKTtcbn1cbi8vIGludmFsaWRfdHlwZSB8IHRvb19iaWcgfCB0b29fc21hbGwgfCBpbnZhbGlkX2Zvcm1hdCB8IG5vdF9tdWx0aXBsZV9vZiB8IHVucmVjb2duaXplZF9rZXlzIHwgaW52YWxpZF91bmlvbiB8IGludmFsaWRfa2V5IHwgaW52YWxpZF9lbGVtZW50IHwgaW52YWxpZF92YWx1ZSB8IGN1c3RvbVxuZXhwb3J0IGZ1bmN0aW9uIGFib3J0ZWQoeCwgc3RhcnRJbmRleCA9IDApIHtcbiAgICBpZiAoeC5hYm9ydGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgeC5pc3N1ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBpZiAoeC5pc3N1ZXNbaV0/LmNvbnRpbnVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJlZml4SXNzdWVzKHBhdGgsIGlzc3Vlcykge1xuICAgIHJldHVybiBpc3N1ZXMubWFwKChpc3MpPT57XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gaXNzKS5wYXRoID8/IChfYS5wYXRoID0gW10pO1xuICAgICAgICBpc3MucGF0aC51bnNoaWZ0KHBhdGgpO1xuICAgICAgICByZXR1cm4gaXNzO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiBtZXNzYWdlPy5tZXNzYWdlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvbmZpZykge1xuICAgIGNvbnN0IGZ1bGwgPSB7XG4gICAgICAgIC4uLmlzcyxcbiAgICAgICAgcGF0aDogaXNzLnBhdGggPz8gW11cbiAgICB9O1xuICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGlmICghaXNzLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHVud3JhcE1lc3NhZ2UoaXNzLmluc3Q/Ll96b2QuZGVmPy5lcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY3R4Py5lcnJvcj8uKGlzcykpID8/IHVud3JhcE1lc3NhZ2UoY29uZmlnLmN1c3RvbUVycm9yPy4oaXNzKSkgPz8gdW53cmFwTWVzc2FnZShjb25maWcubG9jYWxlRXJyb3I/Lihpc3MpKSA/PyBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgZnVsbC5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgLy8gZGVsZXRlIChmdWxsIGFzIGFueSkuZGVmO1xuICAgIGRlbGV0ZSBmdWxsLmluc3Q7XG4gICAgZGVsZXRlIGZ1bGwuY29udGludWU7XG4gICAgaWYgKCFjdHg/LnJlcG9ydElucHV0KSB7XG4gICAgICAgIGRlbGV0ZSBmdWxsLmlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gZnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaXphYmxlT3JpZ2luKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgU2V0KSByZXR1cm4gXCJzZXRcIjtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBNYXApIHJldHVybiBcIm1hcFwiO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlKSByZXR1cm4gXCJmaWxlXCI7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHJldHVybiBcImFycmF5XCI7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBbaXNzLCBpbnB1dCwgaW5zdF0gPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgaXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBpc3MsXG4gICAgICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlzc1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY2xlYW5FbnVtKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW2ssIF9dKT0+e1xuICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBOYU4sIG1lYW5pbmcgaXQncyBub3QgYSBudW1iZXIsIHRodXMgYSBzdHJpbmcga2V5XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oTnVtYmVyLnBhcnNlSW50KGssIDEwKSk7XG4gICAgfSkubWFwKChlbCk9PmVsWzFdKTtcbn1cbi8vIENvZGVjIHV0aWxpdHkgZnVuY3Rpb25zXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NCkge1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeVN0cmluZy5sZW5ndGgpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspe1xuICAgICAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDhBcnJheVRvQmFzZTY0KGJ5dGVzKSB7XG4gICAgbGV0IGJpbmFyeVN0cmluZyA9IFwiXCI7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgYmluYXJ5U3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShiaW5hcnlTdHJpbmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NHVybFRvVWludDhBcnJheShiYXNlNjR1cmwpIHtcbiAgICBjb25zdCBiYXNlNjQgPSBiYXNlNjR1cmwucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgY29uc3QgcGFkZGluZyA9IFwiPVwiLnJlcGVhdCgoNCAtIGJhc2U2NC5sZW5ndGggJSA0KSAlIDQpO1xuICAgIHJldHVybiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0ICsgcGFkZGluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDhBcnJheVRvQmFzZTY0dXJsKGJ5dGVzKSB7XG4gICAgcmV0dXJuIHVpbnQ4QXJyYXlUb0Jhc2U2NChieXRlcykucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0vZywgXCJcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4VG9VaW50OEFycmF5KGhleCkge1xuICAgIGNvbnN0IGNsZWFuSGV4ID0gaGV4LnJlcGxhY2UoL14weC8sIFwiXCIpO1xuICAgIGlmIChjbGVhbkhleC5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGV4IHN0cmluZyBsZW5ndGhcIik7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoY2xlYW5IZXgubGVuZ3RoIC8gMik7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGNsZWFuSGV4Lmxlbmd0aDsgaSArPSAyKXtcbiAgICAgICAgYnl0ZXNbaSAvIDJdID0gTnVtYmVyLnBhcnNlSW50KGNsZWFuSGV4LnNsaWNlKGksIGkgKyAyKSwgMTYpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gdWludDhBcnJheVRvSGV4KGJ5dGVzKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpLm1hcCgoYik9PmIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbn1cbi8vIGluc3RhbmNlb2ZcbmV4cG9ydCBjbGFzcyBDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoLi4uX2FyZ3Mpe31cbn1cbiIsICJpbXBvcnQgeyAkY29uc3RydWN0b3IgfSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuL3V0aWwuanNcIjtcbmNvbnN0IGluaXRpYWxpemVyID0gKGluc3QsIGRlZik9PntcbiAgICBpbnN0Lm5hbWUgPSBcIiRab2RFcnJvclwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcIl96b2RcIiwge1xuICAgICAgICB2YWx1ZTogaW5zdC5fem9kLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcImlzc3Vlc1wiLCB7XG4gICAgICAgIHZhbHVlOiBkZWYsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgaW5zdC5tZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZGVmLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwidG9TdHJpbmdcIiwge1xuICAgICAgICB2YWx1ZTogKCk9Pmluc3QubWVzc2FnZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbn07XG5leHBvcnQgY29uc3QgJFpvZEVycm9yID0gJGNvbnN0cnVjdG9yKFwiJFpvZEVycm9yXCIsIGluaXRpYWxpemVyKTtcbmV4cG9ydCBjb25zdCAkWm9kUmVhbEVycm9yID0gJGNvbnN0cnVjdG9yKFwiJFpvZEVycm9yXCIsIGluaXRpYWxpemVyLCB7XG4gICAgUGFyZW50OiBFcnJvclxufSk7XG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkVycm9yKGVycm9yLCBtYXBwZXIgPSAoaXNzdWUpPT5pc3N1ZS5tZXNzYWdlKSB7XG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICBjb25zdCBmb3JtRXJyb3JzID0gW107XG4gICAgZm9yIChjb25zdCBzdWIgb2YgZXJyb3IuaXNzdWVzKXtcbiAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSA9IGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSB8fCBbXTtcbiAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXS5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybUVycm9ycyxcbiAgICAgICAgZmllbGRFcnJvcnNcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yLCBfbWFwcGVyKSB7XG4gICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fCBmdW5jdGlvbihpc3N1ZSkge1xuICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTtcbiAgICB9O1xuICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge1xuICAgICAgICBfZXJyb3JzOiBbXVxuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKT0+e1xuICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcyl7XG4gICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3VuaW9uXCIgJiYgaXNzdWUuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlzc3VlLmVycm9ycy5tYXAoKGlzc3Vlcyk9PnByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfa2V5XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfZWxlbWVudFwiKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBpc3N1ZS5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlKGkgPCBpc3N1ZS5wYXRoLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWwgPSBpID09PSBpc3N1ZS5wYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Vycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbZWxdO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBwcm9jZXNzRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBmaWVsZEVycm9ycztcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmVlaWZ5RXJyb3IoZXJyb3IsIF9tYXBwZXIpIHtcbiAgICBjb25zdCBtYXBwZXIgPSBfbWFwcGVyIHx8IGZ1bmN0aW9uKGlzc3VlKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IsIHBhdGggPSBbXSk9PntcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpe1xuICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiICYmIGlzc3VlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyByZWd1bGFyIHVuaW9uIGVycm9yXG4gICAgICAgICAgICAgICAgaXNzdWUuZXJyb3JzLm1hcCgoaXNzdWVzKT0+cHJvY2Vzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9LCBpc3N1ZS5wYXRoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9rZXlcIikge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogaXNzdWUuaXNzdWVzXG4gICAgICAgICAgICAgICAgfSwgaXNzdWUucGF0aCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9lbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGlzc3VlLmlzc3Vlc1xuICAgICAgICAgICAgICAgIH0sIGlzc3VlLnBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxscGF0aCA9IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgLi4uaXNzdWUucGF0aFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUoaSA8IGZ1bGxwYXRoLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnVsbHBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gZnVsbHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyci5wcm9wZXJ0aWVzID8/IChjdXJyLnByb3BlcnRpZXMgPSB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2EgPSBjdXJyLnByb3BlcnRpZXMpW2VsXSA/PyAoX2FbZWxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogW11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIucHJvcGVydGllc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLml0ZW1zID8/IChjdXJyLml0ZW1zID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gY3Vyci5pdGVtcylbZWxdID8/IChfYltlbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5pdGVtc1tlbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyLmVycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBGb3JtYXQgYSBab2RFcnJvciBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpbiB0aGUgZm9sbG93aW5nIGZvcm0uXG4gKlxuICogRnJvbVxuICpcbiAqIGBgYHRzXG4gKiBab2RFcnJvciB7XG4gKiAgIGlzc3VlczogW1xuICogICAgIHtcbiAqICAgICAgIGV4cGVjdGVkOiAnc3RyaW5nJyxcbiAqICAgICAgIGNvZGU6ICdpbnZhbGlkX3R5cGUnLFxuICogICAgICAgcGF0aDogWyAndXNlcm5hbWUnIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgc3RyaW5nJ1xuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgZXhwZWN0ZWQ6ICdudW1iZXInLFxuICogICAgICAgY29kZTogJ2ludmFsaWRfdHlwZScsXG4gKiAgICAgICBwYXRoOiBbICdmYXZvcml0ZU51bWJlcnMnLCAxIF0sXG4gKiAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgbnVtYmVyJ1xuICogICAgIH1cbiAqICAgXTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHRvXG4gKlxuICogYGBgXG4gKiB1c2VybmFtZVxuICogICBcdTI3MTYgRXhwZWN0ZWQgbnVtYmVyLCByZWNlaXZlZCBzdHJpbmcgYXQgXCJ1c2VybmFtZVxuICogZmF2b3JpdGVOdW1iZXJzWzBdXG4gKiAgIFx1MjcxNiBJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBudW1iZXJcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiB0b0RvdFBhdGgoX3BhdGgpIHtcbiAgICBjb25zdCBzZWdzID0gW107XG4gICAgY29uc3QgcGF0aCA9IF9wYXRoLm1hcCgoc2VnKT0+dHlwZW9mIHNlZyA9PT0gXCJvYmplY3RcIiA/IHNlZy5rZXkgOiBzZWcpO1xuICAgIGZvciAoY29uc3Qgc2VnIG9mIHBhdGgpe1xuICAgICAgICBpZiAodHlwZW9mIHNlZyA9PT0gXCJudW1iZXJcIikgc2Vncy5wdXNoKGBbJHtzZWd9XWApO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2VnID09PSBcInN5bWJvbFwiKSBzZWdzLnB1c2goYFske0pTT04uc3RyaW5naWZ5KFN0cmluZyhzZWcpKX1dYCk7XG4gICAgICAgIGVsc2UgaWYgKC9bXlxcdyRdLy50ZXN0KHNlZykpIHNlZ3MucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoc2VnKX1dYCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlZ3MubGVuZ3RoKSBzZWdzLnB1c2goXCIuXCIpO1xuICAgICAgICAgICAgc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ3Muam9pbihcIlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcmV0dGlmeUVycm9yKGVycm9yKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAvLyBzb3J0IGJ5IHBhdGggbGVuZ3RoXG4gICAgY29uc3QgaXNzdWVzID0gW1xuICAgICAgICAuLi5lcnJvci5pc3N1ZXNcbiAgICBdLnNvcnQoKGEsIGIpPT4oYS5wYXRoID8/IFtdKS5sZW5ndGggLSAoYi5wYXRoID8/IFtdKS5sZW5ndGgpO1xuICAgIC8vIFByb2Nlc3MgZWFjaCBpc3N1ZVxuICAgIGZvciAoY29uc3QgaXNzdWUgb2YgaXNzdWVzKXtcbiAgICAgICAgbGluZXMucHVzaChgXHUyNzE2ICR7aXNzdWUubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGlzc3VlLnBhdGg/Lmxlbmd0aCkgbGluZXMucHVzaChgICBcdTIxOTIgYXQgJHt0b0RvdFBhdGgoaXNzdWUucGF0aCl9YCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgTWFwIHRvIGZvcm1hdHRlZCBzdHJpbmdcbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0IF9wYXJzZSA9IChfRXJyKT0+KHNjaGVtYSwgdmFsdWUsIF9jdHgsIF9wYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyAoX3BhcmFtcz8uRXJyID8/IF9FcnIpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSk7XG4gICAgICAgICAgICB1dGlsLmNhcHR1cmVTdGFja1RyYWNlKGUsIF9wYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9wYXJzZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3BhcnNlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4LCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IChwYXJhbXM/LkVyciA/PyBfRXJyKShyZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSkpO1xuICAgICAgICAgICAgdXRpbC5jYXB0dXJlU3RhY2tUcmFjZShlLCBwYXJhbXM/LmNhbGxlZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3BhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2UgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8ge1xuICAgICAgICAgICAgLi4uX2N0eCxcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IChfRXJyID8/IGVycm9ycy4kWm9kRXJyb3IpKHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHQudmFsdWVcbiAgICAgICAgfTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZSA9IC8qIEBfX1BVUkVfXyovIF9zYWZlUGFyc2UoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlUGFyc2VBc3luYyA9IChfRXJyKT0+YXN5bmMgKHNjaGVtYSwgdmFsdWUsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGN0eCA9IF9jdHggPyBPYmplY3QuYXNzaWduKF9jdHgsIHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICAgIH0pIDoge1xuICAgICAgICAgICAgYXN5bmM6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdCA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pc3N1ZXMubGVuZ3RoID8ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbmV3IF9FcnIocmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18qLyBfc2FmZVBhcnNlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9lbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfcGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyovIF9lbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9kZWNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX2RlY29kZShlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX2VuY29kZUFzeW5jID0gKF9FcnIpPT5hc3luYyAoc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgY3R4ID0gX2N0eCA/IE9iamVjdC5hc3NpZ24oX2N0eCwge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJhY2t3YXJkXCJcbiAgICAgICAgfSkgOiB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IGVuY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX2VuY29kZUFzeW5jKGVycm9ycy4kWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBfZGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3BhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9kZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgX3NhZmVFbmNvZGUgPSAoX0Vycik9PihzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlKF9FcnIpKHNjaGVtYSwgdmFsdWUsIGN0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRW5jb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVFbmNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlID0gKF9FcnIpPT4oc2NoZW1hLCB2YWx1ZSwgX2N0eCk9PntcbiAgICAgICAgcmV0dXJuIF9zYWZlUGFyc2UoX0Vycikoc2NoZW1hLCB2YWx1ZSwgX2N0eCk7XG4gICAgfTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGUoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRW5jb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBjdHggPSBfY3R4ID8gT2JqZWN0LmFzc2lnbihfY3R4LCB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiYmFja3dhcmRcIlxuICAgICAgICB9KSA6IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiYWNrd2FyZFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc2FmZVBhcnNlQXN5bmMoX0Vycikoc2NoZW1hLCB2YWx1ZSwgY3R4KTtcbiAgICB9O1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyovIF9zYWZlRW5jb2RlQXN5bmMoZXJyb3JzLiRab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IF9zYWZlRGVjb2RlQXN5bmMgPSAoX0Vycik9PmFzeW5jIChzY2hlbWEsIHZhbHVlLCBfY3R4KT0+e1xuICAgICAgICByZXR1cm4gX3NhZmVQYXJzZUFzeW5jKF9FcnIpKHNjaGVtYSwgdmFsdWUsIF9jdHgpO1xuICAgIH07XG5leHBvcnQgY29uc3Qgc2FmZURlY29kZUFzeW5jID0gLyogQF9fUFVSRV9fKi8gX3NhZmVEZWNvZGVBc3luYyhlcnJvcnMuJFpvZFJlYWxFcnJvcik7XG4iLCAiZXhwb3J0IGNvbnN0IGN1aWQgPSAvXltjQ11bXlxccy1dezgsfSQvO1xuZXhwb3J0IGNvbnN0IGN1aWQyID0gL15bMC05YS16XSskLztcbmV4cG9ydCBjb25zdCB1bGlkID0gL15bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI2fSQvO1xuZXhwb3J0IGNvbnN0IHhpZCA9IC9eWzAtOWEtdkEtVl17MjB9JC87XG5leHBvcnQgY29uc3Qga3N1aWQgPSAvXltBLVphLXowLTldezI3fSQvO1xuZXhwb3J0IGNvbnN0IG5hbm9pZCA9IC9eW2EtekEtWjAtOV8tXXsyMX0kLztcbi8qKiBJU08gODYwMS0xIGR1cmF0aW9uIHJlZ2V4LiBEb2VzIG5vdCBzdXBwb3J0IHRoZSA4NjAxLTIgZXh0ZW5zaW9ucyBsaWtlIG5lZ2F0aXZlIGR1cmF0aW9ucyBvciBmcmFjdGlvbmFsL25lZ2F0aXZlIGNvbXBvbmVudHMuICovIGV4cG9ydCBjb25zdCBkdXJhdGlvbiA9IC9eUCg/OihcXGQrVyl8KD8hLipXKSg/PVxcZHxUXFxkKShcXGQrWSk/KFxcZCtNKT8oXFxkK0QpPyhUKD89XFxkKShcXGQrSCk/KFxcZCtNKT8oXFxkKyhbLixdXFxkKyk/Uyk/KT8pJC87XG4vKiogSW1wbGVtZW50cyBJU08gODYwMS0yIGV4dGVuc2lvbnMgbGlrZSBleHBsaWNpdCArLSBwcmVmaXhlcywgbWl4aW5nIHdlZWtzIHdpdGggb3RoZXIgdW5pdHMsIGFuZCBmcmFjdGlvbmFsL25lZ2F0aXZlIGNvbXBvbmVudHMuICovIGV4cG9ydCBjb25zdCBleHRlbmRlZER1cmF0aW9uID0gL15bLStdP1AoPyEkKSg/Oig/OlstK10/XFxkK1kpfCg/OlstK10/XFxkK1suLF1cXGQrWSQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86KD86Wy0rXT9cXGQrVyl8KD86Wy0rXT9cXGQrWy4sXVxcZCtXJCkpPyg/Oig/OlstK10/XFxkK0QpfCg/OlstK10/XFxkK1suLF1cXGQrRCQpKT8oPzpUKD89W1xcZCstXSkoPzooPzpbLStdP1xcZCtIKXwoPzpbLStdP1xcZCtbLixdXFxkK0gkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/OlstK10/XFxkKyg/OlsuLF1cXGQrKT9TKT8pPz8kLztcbi8qKiBBIHJlZ2V4IGZvciBhbnkgVVVJRC1saWtlIGlkZW50aWZpZXI6IDgtNC00LTQtMTIgaGV4IHBhdHRlcm4gKi8gZXhwb3J0IGNvbnN0IGd1aWQgPSAvXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0pJC87XG4vKiogUmV0dXJucyBhIHJlZ2V4IGZvciB2YWxpZGF0aW5nIGFuIFJGQyA5NTYyLzQxMjIgVVVJRC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiBPcHRpb25hbGx5IHNwZWNpZnkgYSB2ZXJzaW9uIDEtOC4gSWYgbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWQsIGFsbCB2ZXJzaW9ucyBhcmUgc3VwcG9ydGVkLiAqLyBleHBvcnQgY29uc3QgdXVpZCA9ICh2ZXJzaW9uKT0+e1xuICAgIGlmICghdmVyc2lvbikgcmV0dXJuIC9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVsxLThdWzAtOWEtZkEtRl17M30tWzg5YWJBQl1bMC05YS1mQS1GXXszfS1bMC05YS1mQS1GXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkLztcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS0ke3ZlcnNpb259WzAtOWEtZkEtRl17M30tWzg5YWJBQl1bMC05YS1mQS1GXXszfS1bMC05YS1mQS1GXXsxMn0pJGApO1xufTtcbmV4cG9ydCBjb25zdCB1dWlkNCA9IC8qQF9fUFVSRV9fKi8gdXVpZCg0KTtcbmV4cG9ydCBjb25zdCB1dWlkNiA9IC8qQF9fUFVSRV9fKi8gdXVpZCg2KTtcbmV4cG9ydCBjb25zdCB1dWlkNyA9IC8qQF9fUFVSRV9fKi8gdXVpZCg3KTtcbi8qKiBQcmFjdGljYWwgZW1haWwgdmFsaWRhdGlvbiAqLyBleHBvcnQgY29uc3QgZW1haWwgPSAvXig/IVxcLikoPyEuKlxcLlxcLikoW0EtWmEtejAtOV8nK1xcLVxcLl0qKVtBLVphLXowLTlfKy1dQChbQS1aYS16MC05XVtBLVphLXowLTlcXC1dKlxcLikrW0EtWmEtel17Mix9JC87XG4vKiogRXF1aXZhbGVudCB0byB0aGUgSFRNTDUgaW5wdXRbdHlwZT1lbWFpbF0gdmFsaWRhdGlvbiBpbXBsZW1lbnRlZCBieSBicm93c2Vycy4gU291cmNlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvZW1haWwgKi8gZXhwb3J0IGNvbnN0IGh0bWw1RW1haWwgPSAvXlthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87XG4vKiogVGhlIGNsYXNzaWMgZW1haWxyZWdleC5jb20gcmVnZXggZm9yIFJGQyA1MzIyLWNvbXBsaWFudCBlbWFpbHMgKi8gZXhwb3J0IGNvbnN0IHJmYzUzMjJFbWFpbCA9IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvO1xuLyoqIEEgbG9vc2UgcmVnZXggdGhhdCBhbGxvd3MgVW5pY29kZSBjaGFyYWN0ZXJzLCBlbmZvcmNlcyBsZW5ndGggbGltaXRzLCBhbmQgdGhhdCdzIGFib3V0IGl0LiAqLyBleHBvcnQgY29uc3QgdW5pY29kZUVtYWlsID0gL15bXlxcc0BcIl17MSw2NH1AW15cXHNAXXsxLDI1NX0kL3U7XG5leHBvcnQgY29uc3QgaWRuRW1haWwgPSB1bmljb2RlRW1haWw7XG5leHBvcnQgY29uc3QgYnJvd3NlckVtYWlsID0gL15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamkgPSBgXihcXFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxcXFxwe0Vtb2ppX0NvbXBvbmVudH0pKyRgO1xuZXhwb3J0IGZ1bmN0aW9uIGVtb2ppKCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKF9lbW9qaSwgXCJ1XCIpO1xufVxuZXhwb3J0IGNvbnN0IGlwdjQgPSAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvO1xuZXhwb3J0IGNvbnN0IGlwdjYgPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopKSQvO1xuZXhwb3J0IGNvbnN0IGNpZHJ2NCA9IC9eKCgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwvKFswLTldfFsxLTJdWzAtOV18M1swLTJdKSQvO1xuZXhwb3J0IGNvbnN0IGNpZHJ2NiA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fDo6fChbMC05YS1mQS1GXXsxLDR9KT86OihbMC05YS1mQS1GXXsxLDR9Oj8pezAsNn0pXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMS05XT9bMC05XSkkLztcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4NjAzOTIvZGV0ZXJtaW5lLWlmLXN0cmluZy1pcy1pbi1iYXNlNjQtdXNpbmctamF2YXNjcmlwdFxuZXhwb3J0IGNvbnN0IGJhc2U2NCA9IC9eJHxeKD86WzAtOWEtekEtWisvXXs0fSkqKD86KD86WzAtOWEtekEtWisvXXsyfT09KXwoPzpbMC05YS16QS1aKy9dezN9PSkpPyQvO1xuZXhwb3J0IGNvbnN0IGJhc2U2NHVybCA9IC9eW0EtWmEtejAtOV8tXSokLztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNjE3OS9yZWd1bGFyLWV4cHJlc3Npb24tdG8tbWF0Y2gtZG5zLWhvc3RuYW1lLW9yLWlwLWFkZHJlc3Ncbi8vIGV4cG9ydCBjb25zdCBob3N0bmFtZTogUmVnRXhwID0gL14oW2EtekEtWjAtOS1dK1xcLikqW2EtekEtWjAtOS1dKyQvO1xuZXhwb3J0IGNvbnN0IGhvc3RuYW1lID0gL14oPz0uezEsMjUzfVxcLj8kKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86Wy0wLTlhLXpBLVpdezAsNjF9WzAtOWEtekEtWl0pPykqXFwuPyQvO1xuZXhwb3J0IGNvbnN0IGRvbWFpbiA9IC9eKFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pP1xcLikrW2EtekEtWl17Mix9JC87XG4vLyBodHRwczovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL3ZhbGlkYXRlLXBob25lLW51bWJlciNyNC0zIChyZWdleCBzYW5zIHNwYWNlcylcbmV4cG9ydCBjb25zdCBlMTY0ID0gL15cXCsoPzpbMC05XSl7NiwxNH1bMC05XSQvO1xuLy8gY29uc3QgZGF0ZVNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVNvdXJjZSA9IGAoPzooPzpcXFxcZFxcXFxkWzI0NjhdWzA0OF18XFxcXGRcXFxcZFsxMzU3OV1bMjZdfFxcXFxkXFxcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXFxcZHs0fS0oPzooPzowWzEzNTc4XXwxWzAyXSktKD86MFsxLTldfFsxMl1cXFxcZHwzWzAxXSl8KD86MFs0NjldfDExKS0oPzowWzEtOV18WzEyXVxcXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuZXhwb3J0IGNvbnN0IGRhdGUgPSAvKkBfX1BVUkVfXyovIG5ldyBSZWdFeHAoYF4ke2RhdGVTb3VyY2V9JGApO1xuZnVuY3Rpb24gdGltZVNvdXJjZShhcmdzKSB7XG4gICAgY29uc3QgaGhtbSA9IGAoPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkYDtcbiAgICBjb25zdCByZWdleCA9IHR5cGVvZiBhcmdzLnByZWNpc2lvbiA9PT0gXCJudW1iZXJcIiA/IGFyZ3MucHJlY2lzaW9uID09PSAtMSA/IGAke2hobW19YCA6IGFyZ3MucHJlY2lzaW9uID09PSAwID8gYCR7aGhtbX06WzAtNV1cXFxcZGAgOiBgJHtoaG1tfTpbMC01XVxcXFxkXFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gIDogYCR7aGhtbX0oPzo6WzAtNV1cXFxcZCg/OlxcXFwuXFxcXGQrKT8pP2A7XG4gICAgcmV0dXJuIHJlZ2V4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRpbWUoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lU291cmNlKGFyZ3MpfSRgKTtcbn1cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lKGFyZ3MpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZVNvdXJjZSh7XG4gICAgICAgIHByZWNpc2lvbjogYXJncy5wcmVjaXNpb25cbiAgICB9KTtcbiAgICBjb25zdCBvcHRzID0gW1xuICAgICAgICBcIlpcIlxuICAgIF07XG4gICAgaWYgKGFyZ3MubG9jYWwpIG9wdHMucHVzaChcIlwiKTtcbiAgICAvLyBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV1cXFxcZHsyfTpcXFxcZHsyfSlgKTtcbiAgICBpZiAoYXJncy5vZmZzZXQpIG9wdHMucHVzaChgKFsrLV0oPzpbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKWApO1xuICAgIGNvbnN0IHRpbWVSZWdleCA9IGAke3RpbWV9KD86JHtvcHRzLmpvaW4oXCJ8XCIpfSlgO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtkYXRlU291cmNlfVQoPzoke3RpbWVSZWdleH0pJGApO1xufVxuZXhwb3J0IGNvbnN0IHN0cmluZyA9IChwYXJhbXMpPT57XG4gICAgY29uc3QgcmVnZXggPSBwYXJhbXMgPyBgW1xcXFxzXFxcXFNdeyR7cGFyYW1zPy5taW5pbXVtID8/IDB9LCR7cGFyYW1zPy5tYXhpbXVtID8/IFwiXCJ9fWAgOiBgW1xcXFxzXFxcXFNdKmA7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTtcbn07XG5leHBvcnQgY29uc3QgYmlnaW50ID0gL14tP1xcZCtuPyQvO1xuZXhwb3J0IGNvbnN0IGludGVnZXIgPSAvXi0/XFxkKyQvO1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IC9eLT9cXGQrKD86XFwuXFxkKyk/LztcbmV4cG9ydCBjb25zdCBib29sZWFuID0gL14oPzp0cnVlfGZhbHNlKSQvaTtcbmNvbnN0IF9udWxsID0gL15udWxsJC9pO1xuZXhwb3J0IHsgX251bGwgYXMgbnVsbCB9O1xuY29uc3QgX3VuZGVmaW5lZCA9IC9edW5kZWZpbmVkJC9pO1xuZXhwb3J0IHsgX3VuZGVmaW5lZCBhcyB1bmRlZmluZWQgfTtcbi8vIHJlZ2V4IGZvciBzdHJpbmcgd2l0aCBubyB1cHBlcmNhc2UgbGV0dGVyc1xuZXhwb3J0IGNvbnN0IGxvd2VyY2FzZSA9IC9eW15BLVpdKiQvO1xuLy8gcmVnZXggZm9yIHN0cmluZyB3aXRoIG5vIGxvd2VyY2FzZSBsZXR0ZXJzXG5leHBvcnQgY29uc3QgdXBwZXJjYXNlID0gL15bXmEtel0qJC87XG4vLyByZWdleCBmb3IgaGV4YWRlY2ltYWwgc3RyaW5ncyAoYW55IGxlbmd0aClcbmV4cG9ydCBjb25zdCBoZXggPSAvXlswLTlhLWZBLUZdKiQvO1xuLy8gSGFzaCByZWdleGVzIGZvciBkaWZmZXJlbnQgYWxnb3JpdGhtcyBhbmQgZW5jb2RpbmdzXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGJhc2U2NCByZWdleCB3aXRoIGV4YWN0IGxlbmd0aCBhbmQgcGFkZGluZ1xuZnVuY3Rpb24gZml4ZWRCYXNlNjQoYm9keUxlbmd0aCwgcGFkZGluZykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeW0EtWmEtejAtOSsvXXske2JvZHlMZW5ndGh9fSR7cGFkZGluZ30kYCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGJhc2U2NHVybCByZWdleCB3aXRoIGV4YWN0IGxlbmd0aCAobm8gcGFkZGluZylcbmZ1bmN0aW9uIGZpeGVkQmFzZTY0dXJsKGxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeW0EtWmEtejAtOV8tXXske2xlbmd0aH19JGApO1xufVxuLy8gTUQ1ICgxNiBieXRlcyk6IGJhc2U2NCA9IDI0IGNoYXJzIHRvdGFsICgyMiArIFwiPT1cIilcbmV4cG9ydCBjb25zdCBtZDVfaGV4ID0gL15bMC05YS1mQS1GXXszMn0kLztcbmV4cG9ydCBjb25zdCBtZDVfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCgyMiwgXCI9PVwiKTtcbmV4cG9ydCBjb25zdCBtZDVfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCgyMik7XG4vLyBTSEExICgyMCBieXRlcyk6IGJhc2U2NCA9IDI4IGNoYXJzIHRvdGFsICgyNyArIFwiPVwiKVxuZXhwb3J0IGNvbnN0IHNoYTFfaGV4ID0gL15bMC05YS1mQS1GXXs0MH0kLztcbmV4cG9ydCBjb25zdCBzaGExX2Jhc2U2NCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjQoMjcsIFwiPVwiKTtcbmV4cG9ydCBjb25zdCBzaGExX2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoMjcpO1xuLy8gU0hBMjU2ICgzMiBieXRlcyk6IGJhc2U2NCA9IDQ0IGNoYXJzIHRvdGFsICg0MyArIFwiPVwiKVxuZXhwb3J0IGNvbnN0IHNoYTI1Nl9oZXggPSAvXlswLTlhLWZBLUZdezY0fSQvO1xuZXhwb3J0IGNvbnN0IHNoYTI1Nl9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDQzLCBcIj1cIik7XG5leHBvcnQgY29uc3Qgc2hhMjU2X2Jhc2U2NHVybCA9IC8qQF9fUFVSRV9fKi8gZml4ZWRCYXNlNjR1cmwoNDMpO1xuLy8gU0hBMzg0ICg0OCBieXRlcyk6IGJhc2U2NCA9IDY0IGNoYXJzIHRvdGFsIChubyBwYWRkaW5nKVxuZXhwb3J0IGNvbnN0IHNoYTM4NF9oZXggPSAvXlswLTlhLWZBLUZdezk2fSQvO1xuZXhwb3J0IGNvbnN0IHNoYTM4NF9iYXNlNjQgPSAvKkBfX1BVUkVfXyovIGZpeGVkQmFzZTY0KDY0LCBcIlwiKTtcbmV4cG9ydCBjb25zdCBzaGEzODRfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCg2NCk7XG4vLyBTSEE1MTIgKDY0IGJ5dGVzKTogYmFzZTY0ID0gODggY2hhcnMgdG90YWwgKDg2ICsgXCI9PVwiKVxuZXhwb3J0IGNvbnN0IHNoYTUxMl9oZXggPSAvXlswLTlhLWZBLUZdezEyOH0kLztcbmV4cG9ydCBjb25zdCBzaGE1MTJfYmFzZTY0ID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NCg4NiwgXCI9PVwiKTtcbmV4cG9ydCBjb25zdCBzaGE1MTJfYmFzZTY0dXJsID0gLypAX19QVVJFX18qLyBmaXhlZEJhc2U2NHVybCg4Nik7XG4iLCAiLy8gaW1wb3J0IHsgJFpvZFR5cGUgfSBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gXCIuL2NvcmUuanNcIjtcbmltcG9ydCAqIGFzIHJlZ2V4ZXMgZnJvbSBcIi4vcmVnZXhlcy5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICBpbnN0Ll96b2QgPz8gKGluc3QuX3pvZCA9IHt9KTtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmO1xuICAgIChfYSA9IGluc3QuX3pvZCkub25hdHRhY2ggPz8gKF9hLm9uYXR0YWNoID0gW10pO1xufSk7XG5jb25zdCBudW1lcmljT3JpZ2luTWFwID0ge1xuICAgIG51bWJlcjogXCJudW1iZXJcIixcbiAgICBiaWdpbnQ6IFwiYmlnaW50XCIsXG4gICAgb2JqZWN0OiBcImRhdGVcIlxufTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tMZXNzVGhhbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tMZXNzVGhhblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3Qgb3JpZ2luID0gbnVtZXJpY09yaWdpbk1hcFt0eXBlb2YgZGVmLnZhbHVlXTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgY29uc3QgY3VyciA9IChkZWYuaW5jbHVzaXZlID8gYmFnLm1heGltdW0gOiBiYWcuZXhjbHVzaXZlTWF4aW11bSkgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBpZiAoZGVmLnZhbHVlIDwgY3Vycikge1xuICAgICAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUpIGJhZy5tYXhpbXVtID0gZGVmLnZhbHVlO1xuICAgICAgICAgICAgZWxzZSBiYWcuZXhjbHVzaXZlTWF4aW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoZGVmLmluY2x1c2l2ZSA/IHBheWxvYWQudmFsdWUgPD0gZGVmLnZhbHVlIDogcGF5bG9hZC52YWx1ZSA8IGRlZi52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICBtYXhpbXVtOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZGVmLmluY2x1c2l2ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrR3JlYXRlclRoYW4gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrR3JlYXRlclRoYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IG9yaWdpbiA9IG51bWVyaWNPcmlnaW5NYXBbdHlwZW9mIGRlZi52YWx1ZV07XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGNvbnN0IGN1cnIgPSAoZGVmLmluY2x1c2l2ZSA/IGJhZy5taW5pbXVtIDogYmFnLmV4Y2x1c2l2ZU1pbmltdW0pID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi52YWx1ZSA+IGN1cnIpIHtcbiAgICAgICAgICAgIGlmIChkZWYuaW5jbHVzaXZlKSBiYWcubWluaW11bSA9IGRlZi52YWx1ZTtcbiAgICAgICAgICAgIGVsc2UgYmFnLmV4Y2x1c2l2ZU1pbmltdW0gPSBkZWYudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5pbmNsdXNpdmUgPyBwYXlsb2FkLnZhbHVlID49IGRlZi52YWx1ZSA6IHBheWxvYWQudmFsdWUgPiBkZWYudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiBkZWYudmFsdWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZGVmLmluY2x1c2l2ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrTXVsdGlwbGVPZiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNdWx0aXBsZU9mXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBpbnN0Ll96b2QuYmFnKS5tdWx0aXBsZU9mID8/IChfYS5tdWx0aXBsZU9mID0gZGVmLnZhbHVlKTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSB0eXBlb2YgZGVmLnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbWl4IG51bWJlciBhbmQgYmlnaW50IGluIG11bHRpcGxlX29mIGNoZWNrLlwiKTtcbiAgICAgICAgY29uc3QgaXNNdWx0aXBsZSA9IHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcImJpZ2ludFwiID8gcGF5bG9hZC52YWx1ZSAlIGRlZi52YWx1ZSA9PT0gQmlnSW50KDApIDogdXRpbC5mbG9hdFNhZmVSZW1haW5kZXIocGF5bG9hZC52YWx1ZSwgZGVmLnZhbHVlKSA9PT0gMDtcbiAgICAgICAgaWYgKGlzTXVsdGlwbGUpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHR5cGVvZiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgY29kZTogXCJub3RfbXVsdGlwbGVfb2ZcIixcbiAgICAgICAgICAgIGRpdmlzb3I6IGRlZi52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tOdW1iZXJGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTnVtYmVyRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTsgLy8gbm8gZm9ybWF0IGNoZWNrc1xuICAgIGRlZi5mb3JtYXQgPSBkZWYuZm9ybWF0IHx8IFwiZmxvYXQ2NFwiO1xuICAgIGNvbnN0IGlzSW50ID0gZGVmLmZvcm1hdD8uaW5jbHVkZXMoXCJpbnRcIik7XG4gICAgY29uc3Qgb3JpZ2luID0gaXNJbnQgPyBcImludFwiIDogXCJudW1iZXJcIjtcbiAgICBjb25zdCBbbWluaW11bSwgbWF4aW11bV0gPSB1dGlsLk5VTUJFUl9GT1JNQVRfUkFOR0VTW2RlZi5mb3JtYXRdO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcuZm9ybWF0ID0gZGVmLmZvcm1hdDtcbiAgICAgICAgYmFnLm1pbmltdW0gPSBtaW5pbXVtO1xuICAgICAgICBiYWcubWF4aW11bSA9IG1heGltdW07XG4gICAgICAgIGlmIChpc0ludCkgYmFnLnBhdHRlcm4gPSByZWdleGVzLmludGVnZXI7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKGlzSW50KSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgLy8gaW52YWxpZF9mb3JtYXQgaXNzdWVcbiAgICAgICAgICAgICAgICAvLyBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAvLyAgIGV4cGVjdGVkOiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgICAgIC8vICAgZm9ybWF0OiBkZWYuZm9ybWF0LFxuICAgICAgICAgICAgICAgIC8vICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIC8vICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgLy8gICBpbnN0LFxuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIC8vIGludmFsaWRfdHlwZSBpc3N1ZVxuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogb3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IGRlZi5mb3JtYXQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyBub3RfbXVsdGlwbGVfb2YgaXNzdWVcbiAgICAgICAgICAgIC8vIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgLy8gICBjb2RlOiBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgICAgICAgICAgLy8gICBvcmlnaW46IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAvLyAgIGlucHV0LFxuICAgICAgICAgICAgLy8gICBpbnN0LFxuICAgICAgICAgICAgLy8gICBkaXZpc29yOiAxLFxuICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9vX2JpZ1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0b29fc21hbGxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtLFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja0JpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tCaWdJbnRGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpOyAvLyBubyBmb3JtYXQgY2hlY2tzXG4gICAgY29uc3QgW21pbmltdW0sIG1heGltdW1dID0gdXRpbC5CSUdJTlRfRk9STUFUX1JBTkdFU1tkZWYuZm9ybWF0XTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGRlZi5mb3JtYXQ7XG4gICAgICAgIGJhZy5taW5pbXVtID0gbWluaW11bTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBtYXhpbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnB1dCA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19zbWFsbFwiLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IG1pbmltdW0sXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtLFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01heFNpemUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWF4U2l6ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIHZhciBfYTtcbiAgICAkWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgIChfYSA9IGluc3QuX3pvZC5kZWYpLndoZW4gPz8gKF9hLndoZW4gPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgdmFsID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgcmV0dXJuICF1dGlsLm51bGxpc2godmFsKSAmJiB2YWwuc2l6ZSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBjdXJyID0gaW5zdC5fem9kLmJhZy5tYXhpbXVtID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi5tYXhpbXVtIDwgY3VycikgaW5zdC5fem9kLmJhZy5tYXhpbXVtID0gZGVmLm1heGltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlucHV0LnNpemU7XG4gICAgICAgIGlmIChzaXplIDw9IGRlZi5tYXhpbXVtKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luOiB1dGlsLmdldFNpemFibGVPcmlnaW4oaW5wdXQpLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4aW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNaW5TaXplID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja01pblNpemVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWluaW11bSA+IGN1cnIpIGluc3QuX3pvZC5iYWcubWluaW11bSA9IGRlZi5taW5pbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaXplO1xuICAgICAgICBpZiAoc2l6ZSA+PSBkZWYubWluaW11bSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogdXRpbC5nZXRTaXphYmxlT3JpZ2luKGlucHV0KSxcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluaW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tTaXplRXF1YWxzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1NpemVFcXVhbHNcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLnNpemUgIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLm1pbmltdW0gPSBkZWYuc2l6ZTtcbiAgICAgICAgYmFnLm1heGltdW0gPSBkZWYuc2l6ZTtcbiAgICAgICAgYmFnLnNpemUgPSBkZWYuc2l6ZTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBzaXplID0gaW5wdXQuc2l6ZTtcbiAgICAgICAgaWYgKHNpemUgPT09IGRlZi5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRvb0JpZyA9IHNpemUgPiBkZWYuc2l6ZTtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IHV0aWwuZ2V0U2l6YWJsZU9yaWdpbihpbnB1dCksXG4gICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLnNpemVcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYuc2l6ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja01heExlbmd0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNYXhMZW5ndGhcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICAoX2EgPSBpbnN0Ll96b2QuZGVmKS53aGVuID8/IChfYS53aGVuID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHZhbCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIHJldHVybiAhdXRpbC5udWxsaXNoKHZhbCkgJiYgdmFsLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBjdXJyID0gaW5zdC5fem9kLmJhZy5tYXhpbXVtID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgaWYgKGRlZi5tYXhpbXVtIDwgY3VycikgaW5zdC5fem9kLmJhZy5tYXhpbXVtID0gZGVmLm1heGltdW07XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDw9IGRlZi5tYXhpbXVtKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHV0aWwuZ2V0TGVuZ3RoYWJsZU9yaWdpbihpbnB1dCk7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgY29kZTogXCJ0b29fYmlnXCIsXG4gICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4aW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNaW5MZW5ndGggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTWluTGVuZ3RoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgY3VyciA9IGluc3QuX3pvZC5iYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIGlmIChkZWYubWluaW11bSA+IGN1cnIpIGluc3QuX3pvZC5iYWcubWluaW11bSA9IGRlZi5taW5pbXVtO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA+PSBkZWYubWluaW11bSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluaW11bSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tMZW5ndGhFcXVhbHMgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTGVuZ3RoRXF1YWxzXCIsIChpbnN0LCBkZWYpPT57XG4gICAgdmFyIF9hO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgKF9hID0gaW5zdC5fem9kLmRlZikud2hlbiA/PyAoX2Eud2hlbiA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCB2YWwgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICByZXR1cm4gIXV0aWwubnVsbGlzaCh2YWwpICYmIHZhbC5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLm1pbmltdW0gPSBkZWYubGVuZ3RoO1xuICAgICAgICBiYWcubWF4aW11bSA9IGRlZi5sZW5ndGg7XG4gICAgICAgIGJhZy5sZW5ndGggPSBkZWYubGVuZ3RoO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gZGVmLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcmlnaW4gPSB1dGlsLmdldExlbmd0aGFibGVPcmlnaW4oaW5wdXQpO1xuICAgICAgICBjb25zdCB0b29CaWcgPSBsZW5ndGggPiBkZWYubGVuZ3RoO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIC4uLnRvb0JpZyA/IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubGVuZ3RoXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwidG9vX3NtYWxsXCIsXG4gICAgICAgICAgICAgICAgbWluaW11bTogZGVmLmxlbmd0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDaGVja1N0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2EsIF9iO1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9uYXR0YWNoLnB1c2goKGluc3QpPT57XG4gICAgICAgIGNvbnN0IGJhZyA9IGluc3QuX3pvZC5iYWc7XG4gICAgICAgIGJhZy5mb3JtYXQgPSBkZWYuZm9ybWF0O1xuICAgICAgICBpZiAoZGVmLnBhdHRlcm4pIHtcbiAgICAgICAgICAgIGJhZy5wYXR0ZXJucyA/PyAoYmFnLnBhdHRlcm5zID0gbmV3IFNldCgpKTtcbiAgICAgICAgICAgIGJhZy5wYXR0ZXJucy5hZGQoZGVmLnBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRlZi5wYXR0ZXJuKSAoX2EgPSBpbnN0Ll96b2QpLmNoZWNrID8/IChfYS5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBkZWYucGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoZGVmLnBhdHRlcm4udGVzdChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgLi4uZGVmLnBhdHRlcm4gPyB7XG4gICAgICAgICAgICAgICAgcGF0dGVybjogZGVmLnBhdHRlcm4udG9TdHJpbmcoKVxuICAgICAgICAgICAgfSA6IHt9LFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGVsc2UgKF9iID0gaW5zdC5fem9kKS5jaGVjayA/PyAoX2IuY2hlY2sgPSAoKT0+e30pO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrUmVnZXggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrUmVnZXhcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kQ2hlY2tTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBkZWYucGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoZGVmLnBhdHRlcm4udGVzdChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJyZWdleFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBwYXR0ZXJuOiBkZWYucGF0dGVybi50b1N0cmluZygpLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tMb3dlckNhc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrTG93ZXJDYXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5sb3dlcmNhc2UpO1xuICAgICRab2RDaGVja1N0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tVcHBlckNhc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrVXBwZXJDYXNlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy51cHBlcmNhc2UpO1xuICAgICRab2RDaGVja1N0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tJbmNsdWRlcyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tJbmNsdWRlc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgZXNjYXBlZFJlZ2V4ID0gdXRpbC5lc2NhcGVSZWdleChkZWYuaW5jbHVkZXMpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHR5cGVvZiBkZWYucG9zaXRpb24gPT09IFwibnVtYmVyXCIgPyBgXi57JHtkZWYucG9zaXRpb259fSR7ZXNjYXBlZFJlZ2V4fWAgOiBlc2NhcGVkUmVnZXgpO1xuICAgIGRlZi5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5pbmNsdWRlcyhkZWYuaW5jbHVkZXMsIGRlZi5wb3NpdGlvbikpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgICAgIGluY2x1ZGVzOiBkZWYuaW5jbHVkZXMsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENoZWNrU3RhcnRzV2l0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tTdGFydHNXaXRoXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7dXRpbC5lc2NhcGVSZWdleChkZWYucHJlZml4KX0uKmApO1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHBhdHRlcm4pO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgICAgICBiYWcucGF0dGVybnMgPz8gKGJhZy5wYXR0ZXJucyA9IG5ldyBTZXQoKSk7XG4gICAgICAgIGJhZy5wYXR0ZXJucy5hZGQocGF0dGVybik7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlLnN0YXJ0c1dpdGgoZGVmLnByZWZpeCkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBvcmlnaW46IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICBmb3JtYXQ6IFwic3RhcnRzX3dpdGhcIixcbiAgICAgICAgICAgIHByZWZpeDogZGVmLnByZWZpeCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tFbmRzV2l0aCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tFbmRzV2l0aFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYC4qJHt1dGlsLmVzY2FwZVJlZ2V4KGRlZi5zdWZmaXgpfSRgKTtcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSBwYXR0ZXJuKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLnBhdHRlcm5zID8/IChiYWcucGF0dGVybnMgPSBuZXcgU2V0KCkpO1xuICAgICAgICBiYWcucGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZS5lbmRzV2l0aChkZWYuc3VmZml4KSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJlbmRzX3dpdGhcIixcbiAgICAgICAgICAgIHN1ZmZpeDogZGVmLnN1ZmZpeCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLyAgICAkWm9kQ2hlY2tQcm9wZXJ0eSAgICAvLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGhhbmRsZUNoZWNrUHJvcGVydHlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKC4uLnV0aWwucHJlZml4SXNzdWVzKHByb3BlcnR5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0ICRab2RDaGVja1Byb3BlcnR5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDaGVja1Byb3BlcnR5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnNjaGVtYS5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogcGF5bG9hZC52YWx1ZVtkZWYucHJvcGVydHldLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZUNoZWNrUHJvcGVydHlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBkZWYucHJvcGVydHkpKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVDaGVja1Byb3BlcnR5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgZGVmLnByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tNaW1lVHlwZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2hlY2tNaW1lVHlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RDaGVjay5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgbWltZVNldCA9IG5ldyBTZXQoZGVmLm1pbWUpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBpbnN0Ll96b2QuYmFnLm1pbWUgPSBkZWYubWltZTtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKG1pbWVTZXQuaGFzKHBheWxvYWQudmFsdWUudHlwZSkpIHJldHVybjtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgIHZhbHVlczogZGVmLm1pbWUsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZS50eXBlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ2hlY2tPdmVyd3JpdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENoZWNrT3ZlcndyaXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZENoZWNrLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi50eChwYXlsb2FkLnZhbHVlKTtcbiAgICB9O1xufSk7XG4iLCAiZXhwb3J0IGNsYXNzIERvYyB7XG4gICAgY29uc3RydWN0b3IoYXJncyA9IFtdKXtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgaWYgKHRoaXMpIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuICAgIGluZGVudGVkKGZuKSB7XG4gICAgICAgIHRoaXMuaW5kZW50ICs9IDE7XG4gICAgICAgIGZuKHRoaXMpO1xuICAgICAgICB0aGlzLmluZGVudCAtPSAxO1xuICAgIH1cbiAgICB3cml0ZShhcmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYXJnKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBleGVjdXRpb246IFwic3luY1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFyZyh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcImFzeW5jXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcmc7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKS5maWx0ZXIoKHgpPT54KTtcbiAgICAgICAgY29uc3QgbWluSW5kZW50ID0gTWF0aC5taW4oLi4ubGluZXMubWFwKCh4KT0+eC5sZW5ndGggLSB4LnRyaW1TdGFydCgpLmxlbmd0aCkpO1xuICAgICAgICBjb25zdCBkZWRlbnRlZCA9IGxpbmVzLm1hcCgoeCk9Pnguc2xpY2UobWluSW5kZW50KSkubWFwKCh4KT0+XCIgXCIucmVwZWF0KHRoaXMuaW5kZW50ICogMikgKyB4KTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGRlZGVudGVkKXtcbiAgICAgICAgICAgIHRoaXMuY29udGVudC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGNvbnN0IEYgPSBGdW5jdGlvbjtcbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXM/LmFyZ3M7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzPy5jb250ZW50ID8/IFtcbiAgICAgICAgICAgIGBgXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgICAgICAgLi4uY29udGVudC5tYXAoKHgpPT5gICAke3h9YClcbiAgICAgICAgXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cobGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgICAgIHJldHVybiBuZXcgRiguLi5hcmdzLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSB7XG4gICAgbWFqb3I6IDQsXG4gICAgbWlub3I6IDEsXG4gICAgcGF0Y2g6IDExXG59O1xuIiwgImltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4vY29yZS5qc1wiO1xuaW1wb3J0IHsgRG9jIH0gZnJvbSBcIi4vZG9jLmpzXCI7XG5pbXBvcnQgeyBwYXJzZSwgcGFyc2VBc3luYywgc2FmZVBhcnNlLCBzYWZlUGFyc2VBc3luYyB9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5pbXBvcnQgKiBhcyByZWdleGVzIGZyb20gXCIuL3JlZ2V4ZXMuanNcIjtcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL3ZlcnNpb25zLmpzXCI7XG5leHBvcnQgY29uc3QgJFpvZFR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFR5cGVcIiwgKGluc3QsIGRlZik9PntcbiAgICB2YXIgX2E7XG4gICAgaW5zdCA/PyAoaW5zdCA9IHt9KTtcbiAgICBpbnN0Ll96b2QuZGVmID0gZGVmOyAvLyBzZXQgX2RlZiBwcm9wZXJ0eVxuICAgIGluc3QuX3pvZC5iYWcgPSBpbnN0Ll96b2QuYmFnIHx8IHt9OyAvLyBpbml0aWFsaXplIF9iYWcgb2JqZWN0XG4gICAgaW5zdC5fem9kLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIGNvbnN0IGNoZWNrcyA9IFtcbiAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5jaGVja3MgPz8gW11cbiAgICBdO1xuICAgIC8vIGlmIGluc3QgaXMgaXRzZWxmIGEgY2hlY2tzLiRab2RDaGVjaywgcnVuIGl0IGFzIGEgY2hlY2tcbiAgICBpZiAoaW5zdC5fem9kLnRyYWl0cy5oYXMoXCIkWm9kQ2hlY2tcIikpIHtcbiAgICAgICAgY2hlY2tzLnVuc2hpZnQoaW5zdCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBjaC5fem9kLm9uYXR0YWNoKXtcbiAgICAgICAgICAgIGZuKGluc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjaGVja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGRlZmVycmVkIGluaXRpYWxpemVyXG4gICAgICAgIC8vIGluc3QuX3pvZC5wYXJzZSBpcyBub3QgeWV0IGRlZmluZWRcbiAgICAgICAgKF9hID0gaW5zdC5fem9kKS5kZWZlcnJlZCA/PyAoX2EuZGVmZXJyZWQgPSBbXSk7XG4gICAgICAgIGluc3QuX3pvZC5kZWZlcnJlZD8ucHVzaCgoKT0+e1xuICAgICAgICAgICAgaW5zdC5fem9kLnJ1biA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcnVuQ2hlY2tzID0gKHBheWxvYWQsIGNoZWNrcywgY3R4KT0+e1xuICAgICAgICAgICAgbGV0IGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkKTtcbiAgICAgICAgICAgIGxldCBhc3luY1Jlc3VsdDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ggb2YgY2hlY2tzKXtcbiAgICAgICAgICAgICAgICBpZiAoY2guX3pvZC5kZWYud2hlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRSdW4gPSBjaC5fem9kLmRlZi53aGVuKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFJ1bikgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IGNoLl96b2QuY2hlY2socGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgaWYgKF8gaW5zdGFuY2VvZiBQcm9taXNlICYmIGN0eD8uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLiRab2RBc3luY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCB8fCBfIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3VsdCA9IChhc3luY1Jlc3VsdCA/PyBQcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYyAoKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgXztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMZW4gPSBwYXlsb2FkLmlzc3Vlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExlbiA9PT0gY3VyckxlbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Fib3J0ZWQpIGlzQWJvcnRlZCA9IHV0aWwuYWJvcnRlZChwYXlsb2FkLCBjdXJyTGVuKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dExlbiA9IHBheWxvYWQuaXNzdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMZW4gPT09IGN1cnJMZW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWJvcnRlZCkgaXNBYm9ydGVkID0gdXRpbC5hYm9ydGVkKHBheWxvYWQsIGN1cnJMZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3luY1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhc3luY1Jlc3VsdC50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGNvbnN0IGhhbmRsZUNoZWNrc1Jlc3VsdCA9IChcbiAgICAgICAgLy8gICBjaGVja1Jlc3VsdDogUGFyc2VQYXlsb2FkLFxuICAgICAgICAvLyAgIG9yaWdpbmFsUmVzdWx0OiBQYXJzZVBheWxvYWQsXG4gICAgICAgIC8vICAgY3R4OiBQYXJzZUNvbnRleHRJbnRlcm5hbFxuICAgICAgICAvLyApOiB1dGlsLk1heWJlQXN5bmM8UGFyc2VQYXlsb2FkPiA9PiB7XG4gICAgICAgIC8vICAgLy8gaWYgdGhlIGNoZWNrcyBtdXRhdGVkIHRoZSB2YWx1ZSAmJiB0aGVyZSBhcmUgbm8gaXNzdWVzLCByZS1wYXJzZSB0aGUgcmVzdWx0XG4gICAgICAgIC8vICAgaWYgKGNoZWNrUmVzdWx0LnZhbHVlICE9PSBvcmlnaW5hbFJlc3VsdC52YWx1ZSAmJiAhY2hlY2tSZXN1bHQuaXNzdWVzLmxlbmd0aClcbiAgICAgICAgLy8gICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UoY2hlY2tSZXN1bHQsIGN0eCk7XG4gICAgICAgIC8vICAgcmV0dXJuIG9yaWdpbmFsUmVzdWx0O1xuICAgICAgICAvLyB9O1xuICAgICAgICBjb25zdCBoYW5kbGVDYW5hcnlSZXN1bHQgPSAoY2FuYXJ5LCBwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgICAgICAvLyBhYm9ydCBpZiB0aGUgY2FuYXJ5IGlzIGFib3J0ZWRcbiAgICAgICAgICAgIGlmICh1dGlsLmFib3J0ZWQoY2FuYXJ5KSkge1xuICAgICAgICAgICAgICAgIGNhbmFyeS5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FuYXJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcnVuIGNoZWNrcyBmaXJzdCwgdGhlblxuICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBydW5DaGVja3MocGF5bG9hZCwgY2hlY2tzLCBjdHgpO1xuICAgICAgICAgICAgaWYgKGNoZWNrUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChjdHguYXN5bmMgPT09IGZhbHNlKSB0aHJvdyBuZXcgY29yZS4kWm9kQXN5bmNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1Jlc3VsdC50aGVuKChjaGVja1Jlc3VsdCk9Pmluc3QuX3pvZC5wYXJzZShjaGVja1Jlc3VsdCwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5fem9kLnBhcnNlKGNoZWNrUmVzdWx0LCBjdHgpO1xuICAgICAgICB9O1xuICAgICAgICBpbnN0Ll96b2QucnVuID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgICAgIGlmIChjdHguc2tpcENoZWNrcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0Ll96b2QucGFyc2UocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBydW4gY2FuYXJ5XG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbCBwYXNzIChubyBjaGVja3MpXG4gICAgICAgICAgICAgICAgY29uc3QgY2FuYXJ5ID0gaW5zdC5fem9kLnBhcnNlKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgc2tpcENoZWNrczogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChjYW5hcnkgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5hcnkudGhlbigoY2FuYXJ5KT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNhbmFyeVJlc3VsdChjYW5hcnksIHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2FuYXJ5UmVzdWx0KGNhbmFyeSwgcGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZvcndhcmRcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGluc3QuX3pvZC5wYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3R4LmFzeW5jID09PSBmYWxzZSkgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PnJ1bkNoZWNrcyhyZXN1bHQsIGNoZWNrcywgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVuQ2hlY2tzKHJlc3VsdCwgY2hlY2tzLCBjdHgpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpbnN0W1wifnN0YW5kYXJkXCJdID0ge1xuICAgICAgICB2YWxpZGF0ZTogKHZhbHVlKT0+e1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gc2FmZVBhcnNlKGluc3QsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5zdWNjZXNzID8ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogci5kYXRhXG4gICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiByLmVycm9yPy5pc3N1ZXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYWZlUGFyc2VBc3luYyhpbnN0LCB2YWx1ZSkudGhlbigocik9PnIuc3VjY2VzcyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlczogci5lcnJvcj8uaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2ZW5kb3I6IFwiem9kXCIsXG4gICAgICAgIHZlcnNpb246IDFcbiAgICB9O1xufSk7XG5leHBvcnQgeyBjbG9uZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBbXG4gICAgICAgIC4uLmluc3Q/Ll96b2QuYmFnPy5wYXR0ZXJucyA/PyBbXVxuICAgIF0ucG9wKCkgPz8gcmVnZXhlcy5zdHJpbmcoaW5zdC5fem9kLmJhZyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF8pPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IFN0cmluZyhwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RTdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBjaGVjayBpbml0aWFsaXphdGlvbiBtdXN0IGNvbWUgZmlyc3RcbiAgICBjaGVja3MuJFpvZENoZWNrU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICAkWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RHVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RHVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5ndWlkKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgaWYgKGRlZi52ZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25NYXAgPSB7XG4gICAgICAgICAgICB2MTogMSxcbiAgICAgICAgICAgIHYyOiAyLFxuICAgICAgICAgICAgdjM6IDMsXG4gICAgICAgICAgICB2NDogNCxcbiAgICAgICAgICAgIHY1OiA1LFxuICAgICAgICAgICAgdjY6IDYsXG4gICAgICAgICAgICB2NzogNyxcbiAgICAgICAgICAgIHY4OiA4XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHYgPSB2ZXJzaW9uTWFwW2RlZi52ZXJzaW9uXTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFVVSUQgdmVyc2lvbjogXCIke2RlZi52ZXJzaW9ufVwiYCk7XG4gICAgICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCh2KSk7XG4gICAgfSBlbHNlIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudXVpZCgpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFbWFpbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW1haWxcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmVtYWlsKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVSTFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVHJpbSB3aGl0ZXNwYWNlIGZyb20gaW5wdXRcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwYXlsb2FkLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAoZGVmLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVmLmhvc3RuYW1lLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWYuaG9zdG5hbWUudGVzdCh1cmwuaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJJbnZhbGlkIGhvc3RuYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiByZWdleGVzLmhvc3RuYW1lLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWYucHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICBkZWYucHJvdG9jb2wubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZi5wcm90b2NvbC50ZXN0KHVybC5wcm90b2NvbC5lbmRzV2l0aChcIjpcIikgPyB1cmwucHJvdG9jb2wuc2xpY2UoMCwgLTEpIDogdXJsLnByb3RvY29sKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSW52YWxpZCBwcm90b2NvbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogZGVmLnByb3RvY29sLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCB0aGUgb3V0cHV0IHZhbHVlIGJhc2VkIG9uIG5vcm1hbGl6ZSBmbGFnXG4gICAgICAgICAgICBpZiAoZGVmLm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBub3JtYWxpemVkIFVSTFxuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB1cmwuaHJlZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGlucHV0ICh0cmltbWVkKVxuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB0cmltbWVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcInVybFwiLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFbW9qaSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW1vamlcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmVtb2ppKCkpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE5hbm9JRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTmFub0lEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5uYW5vaWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZENVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmN1aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZENVSUQyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDVUlEMlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuY3VpZDIpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFVMSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVMSURcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLnVsaWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFhJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kWElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy54aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEtTVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RLU1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMua3N1aWQpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgY29uc3QgJFpvZElTT0RhdGVUaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJU09EYXRlVGltZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZGF0ZXRpbWUoZGVmKSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuZGF0ZSk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSVNPVGltZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPVGltZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMudGltZShkZWYpKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJU09EdXJhdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kSVNPRHVyYXRpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmR1cmF0aW9uKTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJUHY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJUHY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5pcHY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGBpcHY0YDtcbiAgICB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RJUHY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJUHY2XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5pcHY2KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICAgICAgYmFnLmZvcm1hdCA9IGBpcHY2YDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ldyBVUkwoYGh0dHA6Ly9bJHtwYXlsb2FkLnZhbHVlfV1gKTtcbiAgICAgICAgLy8gcmV0dXJuO1xuICAgICAgICB9IGNhdGNoICB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImlwdjZcIixcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ0lEUnY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDSURSdjRcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmNpZHJ2NCk7XG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ0lEUnY2ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDSURSdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBkZWYucGF0dGVybiA/PyAoZGVmLnBhdHRlcm4gPSByZWdleGVzLmNpZHJ2Nik7IC8vIG5vdCB1c2VkIGZvciB2YWxpZGF0aW9uXG4gICAgJFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF5bG9hZC52YWx1ZS5zcGxpdChcIi9cIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IFthZGRyZXNzLCBwcmVmaXhdID0gcGFydHM7XG4gICAgICAgICAgICBpZiAoIXByZWZpeCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXhOdW0gPSBOdW1iZXIocHJlZml4KTtcbiAgICAgICAgICAgIGlmIChgJHtwcmVmaXhOdW19YCAhPT0gcHJlZml4KSB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGlmIChwcmVmaXhOdW0gPCAwIHx8IHByZWZpeE51bSA+IDEyOCkgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXcgVVJMKGBodHRwOi8vWyR7YWRkcmVzc31dYCk7XG4gICAgICAgIH0gY2F0Y2ggIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiY2lkcnY2XCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBjb250aW51ZTogIWRlZi5hYm9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICBab2RCYXNlNjQgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmFzZTY0KGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKGRhdGEubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYXRvYihkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0ICRab2RCYXNlNjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJhc2U2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGRlZi5wYXR0ZXJuID8/IChkZWYucGF0dGVybiA9IHJlZ2V4ZXMuYmFzZTY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2Qub25hdHRhY2gucHVzaCgoaW5zdCk9PntcbiAgICAgICAgaW5zdC5fem9kLmJhZy5jb250ZW50RW5jb2RpbmcgPSBcImJhc2U2NFwiO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEJhc2U2NChwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJiYXNlNjRcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIFpvZEJhc2U2NCAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjRVUkwoZGF0YSkge1xuICAgIGlmICghcmVnZXhlcy5iYXNlNjR1cmwudGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGJhc2U2NCA9IGRhdGEucmVwbGFjZSgvWy1fXS9nLCAoYyk9PmMgPT09IFwiLVwiID8gXCIrXCIgOiBcIi9cIik7XG4gICAgY29uc3QgcGFkZGVkID0gYmFzZTY0LnBhZEVuZChNYXRoLmNlaWwoYmFzZTY0Lmxlbmd0aCAvIDQpICogNCwgXCI9XCIpO1xuICAgIHJldHVybiBpc1ZhbGlkQmFzZTY0KHBhZGRlZCk7XG59XG5leHBvcnQgY29uc3QgJFpvZEJhc2U2NFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmFzZTY0VVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5iYXNlNjR1cmwpO1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vbmF0dGFjaC5wdXNoKChpbnN0KT0+e1xuICAgICAgICBpbnN0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZyA9IFwiYmFzZTY0dXJsXCI7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLmNoZWNrID0gKHBheWxvYWQpPT57XG4gICAgICAgIGlmIChpc1ZhbGlkQmFzZTY0VVJMKHBheWxvYWQudmFsdWUpKSByZXR1cm47XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgZm9ybWF0OiBcImJhc2U2NHVybFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgY29udGludWU6ICFkZWYuYWJvcnRcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RFMTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RFMTY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgZGVmLnBhdHRlcm4gPz8gKGRlZi5wYXR0ZXJuID0gcmVnZXhlcy5lMTY0KTtcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgWm9kSldUICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEpXVCh0b2tlbiwgYWxnb3JpdGhtID0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2Vuc1BhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAodG9rZW5zUGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IFtoZWFkZXJdID0gdG9rZW5zUGFydHM7XG4gICAgICAgIGlmICghaGVhZGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgcGFyc2VkSGVhZGVyID0gSlNPTi5wYXJzZShhdG9iKGhlYWRlcikpO1xuICAgICAgICBpZiAoXCJ0eXBcIiBpbiBwYXJzZWRIZWFkZXIgJiYgcGFyc2VkSGVhZGVyPy50eXAgIT09IFwiSldUXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFwYXJzZWRIZWFkZXIuYWxnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhbGdvcml0aG0gJiYgKCEoXCJhbGdcIiBpbiBwYXJzZWRIZWFkZXIpIHx8IHBhcnNlZEhlYWRlci5hbGcgIT09IGFsZ29yaXRobSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0ICRab2RKV1QgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEpXVFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5jaGVjayA9IChwYXlsb2FkKT0+e1xuICAgICAgICBpZiAoaXNWYWxpZEpXVChwYXlsb2FkLnZhbHVlLCBkZWYuYWxnKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogXCJqd3RcIixcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDdXN0b21TdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgaWYgKGRlZi5mbihwYXlsb2FkLnZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9mb3JtYXRcIixcbiAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCxcbiAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNvbnRpbnVlOiAhZGVmLmFib3J0XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVtYmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdW1iZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSBpbnN0Ll96b2QuYmFnLnBhdHRlcm4gPz8gcmVnZXhlcy5udW1iZXI7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmIChkZWYuY29lcmNlKSB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IE51bWJlcihwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNOYU4oaW5wdXQpICYmIE51bWJlci5pc0Zpbml0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkID0gdHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiID8gTnVtYmVyLmlzTmFOKGlucHV0KSA/IFwiTmFOXCIgOiAhTnVtYmVyLmlzRmluaXRlKGlucHV0KSA/IFwiSW5maW5pdHlcIiA6IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJudW1iZXJcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAuLi5yZWNlaXZlZCA/IHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZFxuICAgICAgICAgICAgfSA6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZE51bWJlckZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kTnVtYmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY2hlY2tzLiRab2RDaGVja051bWJlckZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgJFpvZE51bWJlci5pbml0KGluc3QsIGRlZik7IC8vIG5vIGZvcm1hdCBjaGVja3NwXG59KTtcbmV4cG9ydCBjb25zdCAkWm9kQm9vbGVhbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQm9vbGVhblwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMuYm9vbGVhbjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKGRlZi5jb2VyY2UpIHRyeSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gQm9vbGVhbihwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RCaWdJbnQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEJpZ0ludFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IHJlZ2V4ZXMuYmlnaW50O1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkgdHJ5IHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBCaWdJbnQocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZEJpZ0ludEZvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQmlnSW50XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY2hlY2tzLiRab2RDaGVja0JpZ0ludEZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgJFpvZEJpZ0ludC5pbml0KGluc3QsIGRlZik7IC8vIG5vIGZvcm1hdCBjaGVja3Ncbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RTeW1ib2wgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFN5bWJvbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN5bWJvbFwiKSByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBleHBlY3RlZDogXCJzeW1ib2xcIixcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVW5kZWZpbmVkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RVbmRlZmluZWRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhdHRlcm4gPSByZWdleGVzLnVuZGVmaW5lZDtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChbXG4gICAgICAgIHVuZGVmaW5lZFxuICAgIF0pO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICBpbnN0Ll96b2Qub3B0b3V0ID0gXCJvcHRpb25hbFwiO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcInVuZGVmaW5lZFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2ROdWxsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROdWxsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gcmVnZXhlcy5udWxsO1xuICAgIGluc3QuX3pvZC52YWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAgICAgbnVsbFxuICAgIF0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwibnVsbFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RBbnkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEFueVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCk9PnBheWxvYWQ7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kVW5rbm93biA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kVW5rbm93blwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCk9PnBheWxvYWQ7XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmV2ZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE5ldmVyXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBcIm5ldmVyXCIsXG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFZvaWQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFZvaWRcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwidm9pZFwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2REYXRlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2REYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IERhdGUocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7fVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgY29uc3QgaXNEYXRlID0gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IGlzRGF0ZSAmJiAhTnVtYmVyLmlzTmFOKGlucHV0LmdldFRpbWUoKSk7XG4gICAgICAgIGlmIChpc1ZhbGlkRGF0ZSkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgLi4uaXNEYXRlID8ge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBcIkludmFsaWQgRGF0ZVwiXG4gICAgICAgICAgICB9IDoge30sXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVBcnJheVJlc3VsdChyZXN1bHQsIGZpbmFsLCBpbmRleCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhpbmRleCwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbiAgICBmaW5hbC52YWx1ZVtpbmRleF0gPSByZXN1bHQudmFsdWU7XG59XG5leHBvcnQgY29uc3QgJFpvZEFycmF5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RBcnJheVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBBcnJheShpbnB1dC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGlucHV0W2ldO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLmVsZW1lbnQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZUFycmF5UmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQXJyYXlSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkOyAvL2hhbmRsZUFycmF5UmVzdWx0c0FzeW5jKHBhcnNlUmVzdWx0cywgZmluYWwpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5UmVzdWx0KHJlc3VsdCwgZmluYWwsIGtleSwgaW5wdXQpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoa2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgICBmaW5hbC52YWx1ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmluYWwudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVEZWYoZGVmKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRlZi5zaGFwZSk7XG4gICAgZm9yIChjb25zdCBrIG9mIGtleXMpe1xuICAgICAgICBpZiAoIWRlZi5zaGFwZT8uW2tdPy5fem9kPy50cmFpdHM/LmhhcyhcIiRab2RUeXBlXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhdCBrZXkgXCIke2t9XCI6IGV4cGVjdGVkIGEgWm9kIHNjaGVtYWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9rZXlzID0gdXRpbC5vcHRpb25hbEtleXMoZGVmLnNoYXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGtleXMsXG4gICAgICAgIGtleVNldDogbmV3IFNldChrZXlzKSxcbiAgICAgICAgbnVtS2V5czoga2V5cy5sZW5ndGgsXG4gICAgICAgIG9wdGlvbmFsS2V5czogbmV3IFNldChva2V5cylcbiAgICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlQ2F0Y2hhbGwocHJvbXMsIGlucHV0LCBwYXlsb2FkLCBjdHgsIGRlZiwgaW5zdCkge1xuICAgIGNvbnN0IHVucmVjb2duaXplZCA9IFtdO1xuICAgIC8vIGl0ZXJhdGUgb3ZlciBpbnB1dCBrZXlzXG4gICAgY29uc3Qga2V5U2V0ID0gZGVmLmtleVNldDtcbiAgICBjb25zdCBfY2F0Y2hhbGwgPSBkZWYuY2F0Y2hhbGwuX3pvZDtcbiAgICBjb25zdCB0ID0gX2NhdGNoYWxsLmRlZi50eXBlO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGlucHV0KSl7XG4gICAgICAgIGlmIChrZXlTZXQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAodCA9PT0gXCJuZXZlclwiKSB7XG4gICAgICAgICAgICB1bnJlY29nbml6ZWQucHVzaChrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgciA9IF9jYXRjaGFsbC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGlmIChyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcHJvbXMucHVzaChyLnRoZW4oKHIpPT5oYW5kbGVQcm9wZXJ0eVJlc3VsdChyLCBwYXlsb2FkLCBrZXksIGlucHV0KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlSZXN1bHQociwgcGF5bG9hZCwga2V5LCBpbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVucmVjb2duaXplZC5sZW5ndGgpIHtcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgICAgICAgICBrZXlzOiB1bnJlY29nbml6ZWQsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghcHJvbXMubGVuZ3RoKSByZXR1cm4gcGF5bG9hZDtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PntcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgJFpvZE9iamVjdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT2JqZWN0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gcmVxdWlyZXMgY2FzdCBiZWNhdXNlIHRlY2huaWNhbGx5ICRab2RPYmplY3QgZG9lc24ndCBleHRlbmRcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gY29uc3Qgc2ggPSBkZWYuc2hhcGU7XG4gICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmLCBcInNoYXBlXCIpO1xuICAgIGlmICghZGVzYz8uZ2V0KSB7XG4gICAgICAgIGNvbnN0IHNoID0gZGVmLnNoYXBlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVmLCBcInNoYXBlXCIsIHtcbiAgICAgICAgICAgIGdldDogKCk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTaCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2hcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWYsIFwic2hhcGVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3U2hcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3U2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBfbm9ybWFsaXplZCA9IHV0aWwuY2FjaGVkKCgpPT5ub3JtYWxpemVEZWYoZGVmKSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHNoYXBlID0gZGVmLnNoYXBlO1xuICAgICAgICBjb25zdCBwcm9wVmFsdWVzID0ge307XG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gc2hhcGUpe1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBzaGFwZVtrZXldLl96b2Q7XG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgcHJvcFZhbHVlc1trZXldID8/IChwcm9wVmFsdWVzW2tleV0gPSBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiBmaWVsZC52YWx1ZXMpcHJvcFZhbHVlc1trZXldLmFkZCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcFZhbHVlcztcbiAgICB9KTtcbiAgICBjb25zdCBpc09iamVjdCA9IHV0aWwuaXNPYmplY3Q7XG4gICAgY29uc3QgY2F0Y2hhbGwgPSBkZWYuY2F0Y2hhbGw7XG4gICAgbGV0IHZhbHVlO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIHZhbHVlID8/ICh2YWx1ZSA9IF9ub3JtYWxpemVkLnZhbHVlKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSB7fTtcbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB2YWx1ZS5zaGFwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdmFsdWUua2V5cyl7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHNoYXBlW2tleV07XG4gICAgICAgICAgICBjb25zdCByID0gZWwuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dFtrZXldLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHIudGhlbigocik9PmhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZVByb3BlcnR5UmVzdWx0KHIsIHBheWxvYWQsIGtleSwgaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2F0Y2hhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9tcy5sZW5ndGggPyBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVDYXRjaGFsbChwcm9tcywgaW5wdXQsIHBheWxvYWQsIGN0eCwgX25vcm1hbGl6ZWQudmFsdWUsIGluc3QpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kT2JqZWN0SklUID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RPYmplY3RKSVRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyByZXF1aXJlcyBjYXN0IGJlY2F1c2UgdGVjaG5pY2FsbHkgJFpvZE9iamVjdCBkb2Vzbid0IGV4dGVuZFxuICAgICRab2RPYmplY3QuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IHN1cGVyUGFyc2UgPSBpbnN0Ll96b2QucGFyc2U7XG4gICAgY29uc3QgX25vcm1hbGl6ZWQgPSB1dGlsLmNhY2hlZCgoKT0+bm9ybWFsaXplRGVmKGRlZikpO1xuICAgIGNvbnN0IGdlbmVyYXRlRmFzdHBhc3MgPSAoc2hhcGUpPT57XG4gICAgICAgIGNvbnN0IGRvYyA9IG5ldyBEb2MoW1xuICAgICAgICAgICAgXCJzaGFwZVwiLFxuICAgICAgICAgICAgXCJwYXlsb2FkXCIsXG4gICAgICAgICAgICBcImN0eFwiXG4gICAgICAgIF0pO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gX25vcm1hbGl6ZWQudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlU3RyID0gKGtleSk9PntcbiAgICAgICAgICAgIGNvbnN0IGsgPSB1dGlsLmVzYyhrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIGBzaGFwZVske2t9XS5fem9kLnJ1bih7IHZhbHVlOiBpbnB1dFske2t9XSwgaXNzdWVzOiBbXSB9LCBjdHgpYDtcbiAgICAgICAgfTtcbiAgICAgICAgZG9jLndyaXRlKGBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7YCk7XG4gICAgICAgIGNvbnN0IGlkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygbm9ybWFsaXplZC5rZXlzKXtcbiAgICAgICAgICAgIGlkc1trZXldID0gYGtleV8ke2NvdW50ZXIrK31gO1xuICAgICAgICB9XG4gICAgICAgIC8vIEE6IHByZXNlcnZlIGtleSBvcmRlciB7XG4gICAgICAgIGRvYy53cml0ZShgY29uc3QgbmV3UmVzdWx0ID0ge307YCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbGl6ZWQua2V5cyl7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGlkc1trZXldO1xuICAgICAgICAgICAgY29uc3QgayA9IHV0aWwuZXNjKGtleSk7XG4gICAgICAgICAgICBkb2Mud3JpdGUoYGNvbnN0ICR7aWR9ID0gJHtwYXJzZVN0cihrZXkpfTtgKTtcbiAgICAgICAgICAgIGRvYy53cml0ZShgXG4gICAgICAgIGlmICgke2lkfS5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtpZH0uaXNzdWVzLm1hcChpc3MgPT4gKHtcbiAgICAgICAgICAgIC4uLmlzcyxcbiAgICAgICAgICAgIHBhdGg6IGlzcy5wYXRoID8gWyR7a30sIC4uLmlzcy5wYXRoXSA6IFske2t9XVxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICBpZiAoJHtpZH0udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgke2t9IGluIGlucHV0KSB7XG4gICAgICAgICAgICBuZXdSZXN1bHRbJHtrfV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1Jlc3VsdFske2t9XSA9ICR7aWR9LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgYCk7XG4gICAgICAgIH1cbiAgICAgICAgZG9jLndyaXRlKGBwYXlsb2FkLnZhbHVlID0gbmV3UmVzdWx0O2ApO1xuICAgICAgICBkb2Mud3JpdGUoYHJldHVybiBwYXlsb2FkO2ApO1xuICAgICAgICBjb25zdCBmbiA9IGRvYy5jb21waWxlKCk7XG4gICAgICAgIHJldHVybiAocGF5bG9hZCwgY3R4KT0+Zm4oc2hhcGUsIHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbiAgICBsZXQgZmFzdHBhc3M7XG4gICAgY29uc3QgaXNPYmplY3QgPSB1dGlsLmlzT2JqZWN0O1xuICAgIGNvbnN0IGppdCA9ICFjb3JlLmdsb2JhbENvbmZpZy5qaXRsZXNzO1xuICAgIGNvbnN0IGFsbG93c0V2YWwgPSB1dGlsLmFsbG93c0V2YWw7XG4gICAgY29uc3QgZmFzdEVuYWJsZWQgPSBqaXQgJiYgYWxsb3dzRXZhbC52YWx1ZTsgLy8gJiYgIWRlZi5jYXRjaGFsbDtcbiAgICBjb25zdCBjYXRjaGFsbCA9IGRlZi5jYXRjaGFsbDtcbiAgICBsZXQgdmFsdWU7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgdmFsdWUgPz8gKHZhbHVlID0gX25vcm1hbGl6ZWQudmFsdWUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGppdCAmJiBmYXN0RW5hYmxlZCAmJiBjdHg/LmFzeW5jID09PSBmYWxzZSAmJiBjdHguaml0bGVzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gYWx3YXlzIHN5bmNocm9ub3VzXG4gICAgICAgICAgICBpZiAoIWZhc3RwYXNzKSBmYXN0cGFzcyA9IGdlbmVyYXRlRmFzdHBhc3MoZGVmLnNoYXBlKTtcbiAgICAgICAgICAgIHBheWxvYWQgPSBmYXN0cGFzcyhwYXlsb2FkLCBjdHgpO1xuICAgICAgICAgICAgaWYgKCFjYXRjaGFsbCkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ2F0Y2hhbGwoW10sIGlucHV0LCBwYXlsb2FkLCBjdHgsIHZhbHVlLCBpbnN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXJQYXJzZShwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVVuaW9uUmVzdWx0cyhyZXN1bHRzLCBmaW5hbCwgaW5zdCwgY3R4KSB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cyl7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZmluYWwudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9uYWJvcnRlZCA9IHJlc3VsdHMuZmlsdGVyKChyKT0+IXV0aWwuYWJvcnRlZChyKSk7XG4gICAgaWYgKG5vbmFib3J0ZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZpbmFsLnZhbHVlID0gbm9uYWJvcnRlZFswXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5vbmFib3J0ZWRbMF07XG4gICAgfVxuICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgY29kZTogXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgICAgIGlucHV0OiBmaW5hbC52YWx1ZSxcbiAgICAgICAgaW5zdCxcbiAgICAgICAgZXJyb3JzOiByZXN1bHRzLm1hcCgocmVzdWx0KT0+cmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpKVxuICAgIH0pO1xuICAgIHJldHVybiBmaW5hbDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVW5pb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5vcHRpb25zLnNvbWUoKG8pPT5vLl96b2Qub3B0aW4gPT09IFwib3B0aW9uYWxcIikgPyBcIm9wdGlvbmFsXCIgOiB1bmRlZmluZWQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0b3V0XCIsICgpPT5kZWYub3B0aW9ucy5zb21lKChvKT0+by5fem9kLm9wdG91dCA9PT0gXCJvcHRpb25hbFwiKSA/IFwib3B0aW9uYWxcIiA6IHVuZGVmaW5lZCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgaWYgKGRlZi5vcHRpb25zLmV2ZXJ5KChvKT0+by5fem9kLnZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KGRlZi5vcHRpb25zLmZsYXRNYXAoKG9wdGlvbik9PkFycmF5LmZyb20ob3B0aW9uLl96b2QudmFsdWVzKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGlmIChkZWYub3B0aW9ucy5ldmVyeSgobyk9Pm8uX3pvZC5wYXR0ZXJuKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBkZWYub3B0aW9ucy5tYXAoKG8pPT5vLl96b2QucGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXigke3BhdHRlcm5zLm1hcCgocCk9PnV0aWwuY2xlYW5SZWdleChwLnNvdXJjZSkpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBzaW5nbGUgPSBkZWYub3B0aW9ucy5sZW5ndGggPT09IDE7XG4gICAgY29uc3QgZmlyc3QgPSBkZWYub3B0aW9uc1swXS5fem9kLnJ1bjtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3QocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYXN5bmMpIHJldHVybiBoYW5kbGVVbmlvblJlc3VsdHMocmVzdWx0cywgcGF5bG9hZCwgaW5zdCwgY3R4KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpLnRoZW4oKHJlc3VsdHMpPT57XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlVW5pb25SZXN1bHRzKHJlc3VsdHMsIHBheWxvYWQsIGluc3QsIGN0eCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGlzY3JpbWluYXRlZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2REaXNjcmltaW5hdGVkVW5pb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvbnN0IF9zdXBlciA9IGluc3QuX3pvZC5wYXJzZTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PntcbiAgICAgICAgY29uc3QgcHJvcFZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBkZWYub3B0aW9ucyl7XG4gICAgICAgICAgICBjb25zdCBwdiA9IG9wdGlvbi5fem9kLnByb3BWYWx1ZXM7XG4gICAgICAgICAgICBpZiAoIXB2IHx8IE9iamVjdC5rZXlzKHB2KS5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkaXNjcmltaW5hdGVkIHVuaW9uIG9wdGlvbiBhdCBpbmRleCBcIiR7ZGVmLm9wdGlvbnMuaW5kZXhPZihvcHRpb24pfVwiYCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwdikpe1xuICAgICAgICAgICAgICAgIGlmICghcHJvcFZhbHVlc1trXSkgcHJvcFZhbHVlc1trXSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2KXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlc1trXS5hZGQodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZXM7XG4gICAgfSk7XG4gICAgY29uc3QgZGlzYyA9IHV0aWwuY2FjaGVkKCgpPT57XG4gICAgICAgIGNvbnN0IG9wdHMgPSBkZWYub3B0aW9ucztcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG8gb2Ygb3B0cyl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvLl96b2QucHJvcFZhbHVlcz8uW2RlZi5kaXNjcmltaW5hdG9yXTtcbiAgICAgICAgICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggXCIke2RlZi5vcHRpb25zLmluZGV4T2Yobyl9XCJgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpe1xuICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgXCIke1N0cmluZyh2KX1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXAuc2V0KHYsIG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIXV0aWwuaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gZGlzYy52YWx1ZS5nZXQoaW5wdXQ/LltkZWYuZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi51bmlvbkZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclxuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF91bmlvblwiLFxuICAgICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICAgIG5vdGU6IFwiTm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvclwiLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcjogZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICBkZWYuZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGluc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kSW50ZXJzZWN0aW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RJbnRlcnNlY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmxlZnQuX3pvZC5ydW4oe1xuICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICB9LCBjdHgpO1xuICAgICAgICBjb25zdCByaWdodCA9IGRlZi5yaWdodC5fem9kLnJ1bih7XG4gICAgICAgICAgICB2YWx1ZTogaW5wdXQsXG4gICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgIH0sIGN0eCk7XG4gICAgICAgIGNvbnN0IGFzeW5jID0gbGVmdCBpbnN0YW5jZW9mIFByb21pc2UgfHwgcmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlSW50ZXJzZWN0aW9uUmVzdWx0cyhwYXlsb2FkLCBsZWZ0LCByaWdodCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIC8vIGNvbnN0IGFUeXBlID0gcGFyc2UudChhKTtcbiAgICAvLyBjb25zdCBiVHlwZSA9IHBhcnNlLnQoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUgJiYgK2EgPT09ICtiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaXNQbGFpbk9iamVjdChhKSAmJiB1dGlsLmlzUGxhaW5PYmplY3QoYikpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoa2V5KT0+YktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcbiAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAuLi5iXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpe1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXJnZUVycm9yUGF0aDogW1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogbmV3T2JqXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKXtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2hhcmVkVmFsdWUubWVyZ2VFcnJvclBhdGhcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IG5ld0FycmF5XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VFcnJvclBhdGg6IFtdXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUludGVyc2VjdGlvblJlc3VsdHMocmVzdWx0LCBsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKC4uLmxlZnQuaXNzdWVzKTtcbiAgICB9XG4gICAgaWYgKHJpZ2h0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKC4uLnJpZ2h0Lmlzc3Vlcyk7XG4gICAgfVxuICAgIGlmICh1dGlsLmFib3J0ZWQocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhsZWZ0LnZhbHVlLCByaWdodC52YWx1ZSk7XG4gICAgaWYgKCFtZXJnZWQudmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbm1lcmdhYmxlIGludGVyc2VjdGlvbi4gRXJyb3IgcGF0aDogYCArIGAke0pTT04uc3RyaW5naWZ5KG1lcmdlZC5tZXJnZUVycm9yUGF0aCl9YCk7XG4gICAgfVxuICAgIHJlc3VsdC52YWx1ZSA9IG1lcmdlZC5kYXRhO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgY29uc3QgJFpvZFR1cGxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUdXBsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBpdGVtcyA9IGRlZi5pdGVtcztcbiAgICBjb25zdCBvcHRTdGFydCA9IGl0ZW1zLmxlbmd0aCAtIFtcbiAgICAgICAgLi4uaXRlbXNcbiAgICBdLnJldmVyc2UoKS5maW5kSW5kZXgoKGl0ZW0pPT5pdGVtLl96b2Qub3B0aW4gIT09IFwib3B0aW9uYWxcIik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcInR1cGxlXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gW107XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIGlmICghZGVmLnJlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGlucHV0Lmxlbmd0aCA+IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQubGVuZ3RoIDwgb3B0U3RhcnQgLSAxO1xuICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi50b29CaWcgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcInRvb19iaWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGl0ZW1zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ0b29fc21hbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGl0ZW1zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaSA9IC0xO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpe1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaWYgKGkgPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gb3B0U3RhcnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlbS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2ldLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlVHVwbGVSZXN1bHQocmVzdWx0LCBwYXlsb2FkLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnJlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBpbnB1dC5zbGljZShpdGVtcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiByZXN0KXtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnJlc3QuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWwsXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZVR1cGxlUmVzdWx0KHJlc3VsdCwgcGF5bG9hZCwgaSkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVUdXBsZVJlc3VsdChyZXN1bHQsIGZpbmFsLCBpbmRleCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhpbmRleCwgcmVzdWx0Lmlzc3VlcykpO1xuICAgIH1cbiAgICBmaW5hbC52YWx1ZVtpbmRleF0gPSByZXN1bHQudmFsdWU7XG59XG5leHBvcnQgY29uc3QgJFpvZFJlY29yZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kUmVjb3JkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKCF1dGlsLmlzUGxhaW5PYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJyZWNvcmRcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbXMgPSBbXTtcbiAgICAgICAgaWYgKGRlZi5rZXlUeXBlLl96b2QudmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBkZWYua2V5VHlwZS5fem9kLnZhbHVlcztcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHZhbHVlcyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi52YWx1ZVR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWVba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdW5yZWNvZ25pemVkO1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBpbnB1dCl7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkID0gdW5yZWNvZ25pemVkID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICB1bnJlY29nbml6ZWQucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnJlY29nbml6ZWQgJiYgdW5yZWNvZ25pemVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICAgICAga2V5czogdW5yZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoaW5wdXQpKXtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlSZXN1bHQgPSBkZWYua2V5VHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXlSZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9rZXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogXCJyZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlczoga2V5UmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleVJlc3VsdC52YWx1ZV0gPSBrZXlSZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0W2tleV0sXG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21zLnB1c2gocmVzdWx0LnRoZW4oKHJlc3VsdCk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlW2tleVJlc3VsdC52YWx1ZV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goLi4udXRpbC5wcmVmaXhJc3N1ZXMoa2V5LCByZXN1bHQuaXNzdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZVtrZXlSZXN1bHQudmFsdWVdID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpLnRoZW4oKCk9PnBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTWFwID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RNYXBcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm1hcFwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9tcyA9IFtdO1xuICAgICAgICBwYXlsb2FkLnZhbHVlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpbnB1dCl7XG4gICAgICAgICAgICBjb25zdCBrZXlSZXN1bHQgPSBkZWYua2V5VHlwZS5fem9kLnJ1bih7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVSZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgICAgfSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChrZXlSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHZhbHVlUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21zLnB1c2goUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBrZXlSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUmVzdWx0XG4gICAgICAgICAgICAgICAgXSkudGhlbigoW2tleVJlc3VsdCwgdmFsdWVSZXN1bHRdKT0+e1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVNYXBSZXN1bHQoa2V5UmVzdWx0LCB2YWx1ZVJlc3VsdCwgcGF5bG9hZCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1hcFJlc3VsdChrZXlSZXN1bHQsIHZhbHVlUmVzdWx0LCBwYXlsb2FkLCBrZXksIGlucHV0LCBpbnN0LCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZU1hcFJlc3VsdChrZXlSZXN1bHQsIHZhbHVlUmVzdWx0LCBmaW5hbCwga2V5LCBpbnB1dCwgaW5zdCwgY3R4KSB7XG4gICAgaWYgKGtleVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh1dGlsLnByb3BlcnR5S2V5VHlwZXMuaGFzKHR5cGVvZiBrZXkpKSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIGtleVJlc3VsdC5pc3N1ZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfa2V5XCIsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBcIm1hcFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBrZXlSZXN1bHQuaXNzdWVzLm1hcCgoaXNzKT0+dXRpbC5maW5hbGl6ZUlzc3VlKGlzcywgY3R4LCBjb3JlLmNvbmZpZygpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZVJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh1dGlsLnByb3BlcnR5S2V5VHlwZXMuaGFzKHR5cGVvZiBrZXkpKSB7XG4gICAgICAgICAgICBmaW5hbC5pc3N1ZXMucHVzaCguLi51dGlsLnByZWZpeElzc3VlcyhrZXksIHZhbHVlUmVzdWx0Lmlzc3VlcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWwuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJtYXBcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgaXNzdWVzOiB2YWx1ZVJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluYWwudmFsdWUuc2V0KGtleVJlc3VsdC52YWx1ZSwgdmFsdWVSZXN1bHQudmFsdWUpO1xufVxuZXhwb3J0IGNvbnN0ICRab2RTZXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFNldFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJzZXRcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdHlwZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21zID0gW107XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCl7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYudmFsdWVUeXBlLl96b2QucnVuKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBwcm9tcy5wdXNoKHJlc3VsdC50aGVuKChyZXN1bHQpPT5oYW5kbGVTZXRSZXN1bHQocmVzdWx0LCBwYXlsb2FkKSkpO1xuICAgICAgICAgICAgfSBlbHNlIGhhbmRsZVNldFJlc3VsdChyZXN1bHQsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9tcy5sZW5ndGgpIHJldHVybiBQcm9taXNlLmFsbChwcm9tcykudGhlbigoKT0+cGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVNldFJlc3VsdChyZXN1bHQsIGZpbmFsKSB7XG4gICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5pc3N1ZXMpO1xuICAgIH1cbiAgICBmaW5hbC52YWx1ZS5hZGQocmVzdWx0LnZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCAkWm9kRW51bSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRW51bVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEVudW1WYWx1ZXMoZGVmLmVudHJpZXMpO1xuICAgIGNvbnN0IHZhbHVlc1NldCA9IG5ldyBTZXQodmFsdWVzKTtcbiAgICBpbnN0Ll96b2QudmFsdWVzID0gdmFsdWVzU2V0O1xuICAgIGluc3QuX3pvZC5wYXR0ZXJuID0gbmV3IFJlZ0V4cChgXigke3ZhbHVlcy5maWx0ZXIoKGspPT51dGlsLnByb3BlcnR5S2V5VHlwZXMuaGFzKHR5cGVvZiBrKSkubWFwKChvKT0+dHlwZW9mIG8gPT09IFwic3RyaW5nXCIgPyB1dGlsLmVzY2FwZVJlZ2V4KG8pIDogby50b1N0cmluZygpKS5qb2luKFwifFwiKX0pJGApO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZXNTZXQuaGFzKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGlmIChkZWYudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGxpdGVyYWwgc2NoZW1hIHdpdGggbm8gdmFsaWQgdmFsdWVzXCIpO1xuICAgIH1cbiAgICBpbnN0Ll96b2QudmFsdWVzID0gbmV3IFNldChkZWYudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4oJHtkZWYudmFsdWVzLm1hcCgobyk9PnR5cGVvZiBvID09PSBcInN0cmluZ1wiID8gdXRpbC5lc2NhcGVSZWdleChvKSA6IG8gPyB1dGlsLmVzY2FwZVJlZ2V4KG8udG9TdHJpbmcoKSkgOiBTdHJpbmcobykpLmpvaW4oXCJ8XCIpfSkkYCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTtcbiAgICAgICAgaWYgKGluc3QuX3pvZC52YWx1ZXMuaGFzKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICBjb2RlOiBcImludmFsaWRfdmFsdWVcIixcbiAgICAgICAgICAgIHZhbHVlczogZGVmLnZhbHVlcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RGaWxlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RGaWxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiZmlsZVwiLFxuICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIixcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgaW5zdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RUcmFuc2Zvcm0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFRyYW5zZm9ybVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kRW5jb2RlRXJyb3IoaW5zdC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfb3V0ID0gZGVmLnRyYW5zZm9ybShwYXlsb2FkLnZhbHVlLCBwYXlsb2FkKTtcbiAgICAgICAgaWYgKGN0eC5hc3luYykge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gX291dCBpbnN0YW5jZW9mIFByb21pc2UgPyBfb3V0IDogUHJvbWlzZS5yZXNvbHZlKF9vdXQpO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC50aGVuKChvdXRwdXQpPT57XG4gICAgICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfb3V0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEFzeW5jRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBwYXlsb2FkLnZhbHVlID0gX291dDtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCAmJiBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0ICRab2RPcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kT3B0aW9uYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLm9wdGluID0gXCJvcHRpb25hbFwiO1xuICAgIGluc3QuX3pvZC5vcHRvdXQgPSBcIm9wdGlvbmFsXCI7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMgPyBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMsXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgXSkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwYXR0ZXJuXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBkZWYuaW5uZXJUeXBlLl96b2QucGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUmVnRXhwKGBeKCR7dXRpbC5jbGVhblJlZ2V4KHBhdHRlcm4uc291cmNlKX0pPyRgKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoZGVmLmlubmVyVHlwZS5fem9kLm9wdGluID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gcmVzdWx0LnRoZW4oKHIpPT5oYW5kbGVPcHRpb25hbFJlc3VsdChyLCBwYXlsb2FkLnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBwYXlsb2FkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTnVsbGFibGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE51bGxhYmxlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicGF0dGVyblwiLCAoKT0+e1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gZGVmLmlubmVyVHlwZS5fem9kLnBhdHRlcm47XG4gICAgICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFJlZ0V4cChgXigke3V0aWwuY2xlYW5SZWdleChwYXR0ZXJuLnNvdXJjZSl9fG51bGwpJGApIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzID8gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICBdKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYWxsb3cgbnVsbCB0byBwYXNzIHRocm91Z2hcbiAgICAgICAgaWYgKHBheWxvYWQudmFsdWUgPT09IG51bGwpIHJldHVybiBwYXlsb2FkO1xuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kRGVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRGVmYXVsdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICAvLyBpbnN0Ll96b2QucWluID0gXCJ0cnVlXCI7XG4gICAgaW5zdC5fem9kLm9wdGluID0gXCJvcHRpb25hbFwiO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIChkZWNvZGUpOiBhcHBseSBkZWZhdWx0cyBmb3IgdW5kZWZpbmVkIGlucHV0XG4gICAgICAgIGlmIChwYXlsb2FkLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAkWm9kRGVmYXVsdCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGltbWVkaWF0ZWx5IGluIGZvcndhcmQgZGlyZWN0aW9uLlxuICAgICAgICAgICAgICogSXQgZG9lc24ndCBwYXNzIHRoZSBkZWZhdWx0IHZhbHVlIGludG8gdGhlIHZhbGlkYXRvciAoXCJwcmVmYXVsdFwiKS4gVGhlcmUncyBubyByZWFzb24gdG8gcGFzcyB0aGUgZGVmYXVsdCB2YWx1ZSB0aHJvdWdoIHZhbGlkYXRpb24uIFRoZSB2YWxpZGl0eSBvZiB0aGUgZGVmYXVsdCBpcyBlbmZvcmNlZCBieSBUeXBlU2NyaXB0IHN0YXRpY2FsbHkuIE90aGVyd2lzZSwgaXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIgdG8gZW5zdXJlIHRoZSBkZWZhdWx0IGlzIHZhbGlkLiBJbiB0aGUgY2FzZSBvZiBwaXBlcyB3aXRoIGRpdmVyZ2VudCBpbi9vdXQgdHlwZXMsIHlvdSBjYW4gc3BlY2lmeSB0aGUgZGVmYXVsdCBvbiB0aGUgYGluYCBzY2hlbWEgb2YgeW91ciBab2RQaXBlIHRvIHNldCBhIFwicHJlZmF1bHRcIiBmb3IgdGhlIHBpcGUuICAgKi8gcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb246IGNvbnRpbnVlIHdpdGggZGVmYXVsdCBoYW5kbGluZ1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCk9PmhhbmRsZURlZmF1bHRSZXN1bHQocmVzdWx0LCBkZWYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlRGVmYXVsdFJlc3VsdChyZXN1bHQsIGRlZik7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlRGVmYXVsdFJlc3VsdChwYXlsb2FkLCBkZWYpIHtcbiAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kUHJlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFByZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5vcHRpbiA9IFwib3B0aW9uYWxcIjtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3J3YXJkIGRpcmVjdGlvbiAoZGVjb2RlKTogYXBwbHkgcHJlZmF1bHQgZm9yIHVuZGVmaW5lZCBpbnB1dFxuICAgICAgICBpZiAocGF5bG9hZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gZGVmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmLmlubmVyVHlwZS5fem9kLnJ1bihwYXlsb2FkLCBjdHgpO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTm9uT3B0aW9uYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZE5vbk9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT57XG4gICAgICAgIGNvbnN0IHYgPSBkZWYuaW5uZXJUeXBlLl96b2QudmFsdWVzO1xuICAgICAgICByZXR1cm4gdiA/IG5ldyBTZXQoW1xuICAgICAgICAgICAgLi4udlxuICAgICAgICBdLmZpbHRlcigoeCk9PnggIT09IHVuZGVmaW5lZCkpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+aGFuZGxlTm9uT3B0aW9uYWxSZXN1bHQocmVzdWx0LCBpbnN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZU5vbk9wdGlvbmFsUmVzdWx0KHJlc3VsdCwgaW5zdCk7XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlTm9uT3B0aW9uYWxSZXN1bHQocGF5bG9hZCwgaW5zdCkge1xuICAgIGlmICghcGF5bG9hZC5pc3N1ZXMubGVuZ3RoICYmIHBheWxvYWQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICBleHBlY3RlZDogXCJub25vcHRpb25hbFwiLFxuICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICBpbnN0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kU3VjY2VzcyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kU3VjY2Vzc1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS4kWm9kRW5jb2RlRXJyb3IoXCJab2RTdWNjZXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDYXRjaCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kQ2F0Y2hcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdG91dCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJ2YWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGlmIChjdHguZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gKGRlY29kZSk6IGFwcGx5IGNhdGNoIGxvZ2ljXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQudmFsdWUgPSBkZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IHJlc3VsdC5pc3N1ZXMubWFwKChpc3MpPT51dGlsLmZpbmFsaXplSXNzdWUoaXNzLCBjdHgsIGNvcmUuY29uZmlnKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWQudmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGRlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogcmVzdWx0Lmlzc3Vlcy5tYXAoKGlzcyk9PnV0aWwuZmluYWxpemVJc3N1ZShpc3MsIGN0eCwgY29yZS5jb25maWcoKSkpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG59KTtcbmV4cG9ydCBjb25zdCAkWm9kTmFOID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2ROYU5cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzTmFOKHBheWxvYWQudmFsdWUpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcIm5hblwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RQaXBlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RQaXBlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwidmFsdWVzXCIsICgpPT5kZWYuaW4uX3pvZC52YWx1ZXMpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwib3B0aW5cIiwgKCk9PmRlZi5pbi5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLm91dC5fem9kLm9wdG91dCk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJwcm9wVmFsdWVzXCIsICgpPT5kZWYuaW4uX3pvZC5wcm9wVmFsdWVzKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgY3R4KT0+e1xuICAgICAgICBpZiAoY3R4LmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiKSB7XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IGRlZi5vdXQuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChyaWdodCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQudGhlbigocmlnaHQpPT5oYW5kbGVQaXBlUmVzdWx0KHJpZ2h0LCBkZWYuaW4sIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBpcGVSZXN1bHQocmlnaHQsIGRlZi5pbiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZWZ0ID0gZGVmLmluLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGxlZnQudGhlbigobGVmdCk9PmhhbmRsZVBpcGVSZXN1bHQobGVmdCwgZGVmLm91dCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZVBpcGVSZXN1bHQobGVmdCwgZGVmLm91dCwgY3R4KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBoYW5kbGVQaXBlUmVzdWx0KGxlZnQsIG5leHQsIGN0eCkge1xuICAgIGlmIChsZWZ0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gcHJldmVudCBmdXJ0aGVyIGNoZWNrc1xuICAgICAgICBsZWZ0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQuX3pvZC5ydW4oe1xuICAgICAgICB2YWx1ZTogbGVmdC52YWx1ZSxcbiAgICAgICAgaXNzdWVzOiBsZWZ0Lmlzc3Vlc1xuICAgIH0sIGN0eCk7XG59XG5leHBvcnQgY29uc3QgJFpvZENvZGVjID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RDb2RlY1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QudmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5kZWYuaW4uX3pvZC5vcHRpbik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRvdXRcIiwgKCk9PmRlZi5vdXQuX3pvZC5vcHRvdXQpO1xuICAgIHV0aWwuZGVmaW5lTGF6eShpbnN0Ll96b2QsIFwicHJvcFZhbHVlc1wiLCAoKT0+ZGVmLmluLl96b2QucHJvcFZhbHVlcyk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gY3R4LmRpcmVjdGlvbiB8fCBcImZvcndhcmRcIjtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJmb3J3YXJkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBkZWYuaW4uX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0LnRoZW4oKGxlZnQpPT5oYW5kbGVDb2RlY0FSZXN1bHQobGVmdCwgZGVmLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDb2RlY0FSZXN1bHQobGVmdCwgZGVmLCBjdHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBkZWYub3V0Ll96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgICAgICBpZiAocmlnaHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LnRoZW4oKHJpZ2h0KT0+aGFuZGxlQ29kZWNBUmVzdWx0KHJpZ2h0LCBkZWYsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjQVJlc3VsdChyaWdodCwgZGVmLCBjdHgpO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuZnVuY3Rpb24gaGFuZGxlQ29kZWNBUmVzdWx0KHJlc3VsdCwgZGVmLCBjdHgpIHtcbiAgICBpZiAocmVzdWx0Lmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gcHJldmVudCBmdXJ0aGVyIGNoZWNrc1xuICAgICAgICByZXN1bHQuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGN0eC5kaXJlY3Rpb24gfHwgXCJmb3J3YXJkXCI7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJmb3J3YXJkXCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBkZWYudHJhbnNmb3JtKHJlc3VsdC52YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkLnRoZW4oKHZhbHVlKT0+aGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHZhbHVlLCBkZWYub3V0LCBjdHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlQ29kZWNUeFJlc3VsdChyZXN1bHQsIHRyYW5zZm9ybWVkLCBkZWYub3V0LCBjdHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gZGVmLnJldmVyc2VUcmFuc2Zvcm0ocmVzdWx0LnZhbHVlLCByZXN1bHQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQudGhlbigodmFsdWUpPT5oYW5kbGVDb2RlY1R4UmVzdWx0KHJlc3VsdCwgdmFsdWUsIGRlZi5pbiwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZUNvZGVjVHhSZXN1bHQocmVzdWx0LCB0cmFuc2Zvcm1lZCwgZGVmLmluLCBjdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUNvZGVjVHhSZXN1bHQobGVmdCwgdmFsdWUsIG5leHRTY2hlbWEsIGN0eCkge1xuICAgIC8vIENoZWNrIGlmIHRyYW5zZm9ybSBhZGRlZCBhbnkgaXNzdWVzXG4gICAgaWYgKGxlZnQuaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICBsZWZ0LmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRTY2hlbWEuX3pvZC5ydW4oe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXNzdWVzOiBsZWZ0Lmlzc3Vlc1xuICAgIH0sIGN0eCk7XG59XG5leHBvcnQgY29uc3QgJFpvZFJlYWRvbmx5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RSZWFkb25seVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9PmRlZi5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInZhbHVlc1wiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLnZhbHVlcyk7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QuX3pvZCwgXCJvcHRpblwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdGluKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+ZGVmLmlubmVyVHlwZS5fem9kLm9wdG91dCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi5pbm5lclR5cGUuX3pvZC5ydW4ocGF5bG9hZCwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYuaW5uZXJUeXBlLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oaGFuZGxlUmVhZG9ubHlSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVSZWFkb25seVJlc3VsdChyZXN1bHQpO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVJlYWRvbmx5UmVzdWx0KHBheWxvYWQpIHtcbiAgICBwYXlsb2FkLnZhbHVlID0gT2JqZWN0LmZyZWV6ZShwYXlsb2FkLnZhbHVlKTtcbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cbmV4cG9ydCBjb25zdCAkWm9kVGVtcGxhdGVMaXRlcmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIiRab2RUZW1wbGF0ZUxpdGVyYWxcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29uc3QgcmVnZXhQYXJ0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBkZWYucGFydHMpe1xuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgcGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaXMgWm9kIHNjaGVtYVxuICAgICAgICAgICAgaWYgKCFwYXJ0Ll96b2QucGF0dGVybikge1xuICAgICAgICAgICAgICAgIC8vIGlmICghc291cmNlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQsIG5vIHBhdHRlcm4gZm91bmQ6ICR7W1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXJ0Ll96b2QudHJhaXRzXG4gICAgICAgICAgICAgICAgXS5zaGlmdCgpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gcGFydC5fem9kLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHAgPyBwYXJ0Ll96b2QucGF0dGVybi5zb3VyY2UgOiBwYXJ0Ll96b2QucGF0dGVybjtcbiAgICAgICAgICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0OiAke3BhcnQuX3pvZC50cmFpdHN9YCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHNvdXJjZS5zdGFydHNXaXRoKFwiXlwiKSA/IDEgOiAwO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc291cmNlLmVuZHNXaXRoKFwiJFwiKSA/IHNvdXJjZS5sZW5ndGggLSAxIDogc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJlZ2V4UGFydHMucHVzaChzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09IG51bGwgfHwgdXRpbC5wcmltaXRpdmVUeXBlcy5oYXModHlwZW9mIHBhcnQpKSB7XG4gICAgICAgICAgICByZWdleFBhcnRzLnB1c2godXRpbC5lc2NhcGVSZWdleChgJHtwYXJ0fWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7cGFydH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnN0Ll96b2QucGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4UGFydHMuam9pbihcIlwiKX0kYCk7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIF9jdHgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC52YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX3R5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBpbnN0Ll96b2QucGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoIWluc3QuX3pvZC5wYXR0ZXJuLnRlc3QocGF5bG9hZC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlucHV0OiBwYXlsb2FkLnZhbHVlLFxuICAgICAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICAgICAgY29kZTogXCJpbnZhbGlkX2Zvcm1hdFwiLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogZGVmLmZvcm1hdCA/PyBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBpbnN0Ll96b2QucGF0dGVybi5zb3VyY2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RGdW5jdGlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCIkWm9kRnVuY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fZGVmID0gZGVmO1xuICAgIGluc3QuX3pvZC5kZWYgPSBkZWY7XG4gICAgaW5zdC5pbXBsZW1lbnQgPSAoZnVuYyk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImltcGxlbWVudCgpIG11c3QgYmUgY2FsbGVkIHdpdGggYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IGluc3QuX2RlZi5pbnB1dCA/IHBhcnNlKGluc3QuX2RlZi5pbnB1dCwgYXJncykgOiBhcmdzO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmdW5jLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIGlmIChpbnN0Ll9kZWYub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlKGluc3QuX2RlZi5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgaW5zdC5pbXBsZW1lbnRBc3luYyA9IChmdW5jKT0+e1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1wbGVtZW50QXN5bmMoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBpbnN0Ll9kZWYuaW5wdXQgPyBhd2FpdCBwYXJzZUFzeW5jKGluc3QuX2RlZi5pbnB1dCwgYXJncykgOiBhcmdzO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmdW5jLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIGlmIChpbnN0Ll9kZWYub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHBhcnNlQXN5bmMoaW5zdC5fZGVmLm91dHB1dCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgX2N0eCk9PntcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLnZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF90eXBlXCIsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICBpbnB1dDogcGF5bG9hZC52YWx1ZSxcbiAgICAgICAgICAgICAgICBpbnN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIG91dHB1dCBpcyBhIHByb21pc2UgdHlwZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHVzZSBhc3luYyBpbXBsZW1lbnRhdGlvblxuICAgICAgICBjb25zdCBoYXNQcm9taXNlT3V0cHV0ID0gaW5zdC5fZGVmLm91dHB1dCAmJiBpbnN0Ll9kZWYub3V0cHV0Ll96b2QuZGVmLnR5cGUgPT09IFwicHJvbWlzZVwiO1xuICAgICAgICBpZiAoaGFzUHJvbWlzZU91dHB1dCkge1xuICAgICAgICAgICAgcGF5bG9hZC52YWx1ZSA9IGluc3QuaW1wbGVtZW50QXN5bmMocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gaW5zdC5pbXBsZW1lbnQocGF5bG9hZC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbiAgICBpbnN0LmlucHV0ID0gKC4uLmFyZ3MpPT57XG4gICAgICAgIGNvbnN0IEYgPSBpbnN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IG5ldyAkWm9kVHVwbGUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInR1cGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBhcmdzWzBdLFxuICAgICAgICAgICAgICAgICAgICByZXN0OiBhcmdzWzFdXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBpbnN0Ll9kZWYub3V0cHV0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEYoe1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgaW5wdXQ6IGFyZ3NbMF0sXG4gICAgICAgICAgICBvdXRwdXQ6IGluc3QuX2RlZi5vdXRwdXRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbnN0Lm91dHB1dCA9IChvdXRwdXQpPT57XG4gICAgICAgIGNvbnN0IEYgPSBpbnN0LmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IEYoe1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgaW5wdXQ6IGluc3QuX2RlZi5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBpbnN0O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZFByb21pc2UgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZFByb21pc2VcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5fem9kLnBhcnNlID0gKHBheWxvYWQsIGN0eCk9PntcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYXlsb2FkLnZhbHVlKS50aGVuKChpbm5lcik9PmRlZi5pbm5lclR5cGUuX3pvZC5ydW4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpbm5lcixcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdXG4gICAgICAgICAgICB9LCBjdHgpKTtcbiAgICB9O1xufSk7XG5leHBvcnQgY29uc3QgJFpvZExhenkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZExhenlcIiwgKGluc3QsIGRlZik9PntcbiAgICAkWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgLy8gbGV0IF9pbm5lclR5cGUhOiBhbnk7XG4gICAgLy8gdXRpbC5kZWZpbmVMYXp5KGRlZiwgXCJnZXR0ZXJcIiwgKCkgPT4ge1xuICAgIC8vICAgaWYgKCFfaW5uZXJUeXBlKSB7XG4gICAgLy8gICAgIF9pbm5lclR5cGUgPSBkZWYuZ2V0dGVyKCk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gKCkgPT4gX2lubmVyVHlwZTtcbiAgICAvLyB9KTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcImlubmVyVHlwZVwiLCAoKT0+ZGVmLmdldHRlcigpKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInBhdHRlcm5cIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcInByb3BWYWx1ZXNcIiwgKCk9Pmluc3QuX3pvZC5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdGluXCIsICgpPT5pbnN0Ll96b2QuaW5uZXJUeXBlLl96b2Qub3B0aW4gPz8gdW5kZWZpbmVkKTtcbiAgICB1dGlsLmRlZmluZUxhenkoaW5zdC5fem9kLCBcIm9wdG91dFwiLCAoKT0+aW5zdC5fem9kLmlubmVyVHlwZS5fem9kLm9wdG91dCA/PyB1bmRlZmluZWQpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBjdHgpPT57XG4gICAgICAgIGNvbnN0IGlubmVyID0gaW5zdC5fem9kLmlubmVyVHlwZTtcbiAgICAgICAgcmV0dXJuIGlubmVyLl96b2QucnVuKHBheWxvYWQsIGN0eCk7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGNvbnN0ICRab2RDdXN0b20gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiJFpvZEN1c3RvbVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNoZWNrcy4kWm9kQ2hlY2suaW5pdChpbnN0LCBkZWYpO1xuICAgICRab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Ll96b2QucGFyc2UgPSAocGF5bG9hZCwgXyk9PntcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbiAgICBpbnN0Ll96b2QuY2hlY2sgPSAocGF5bG9hZCk9PntcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXlsb2FkLnZhbHVlO1xuICAgICAgICBjb25zdCByID0gZGVmLmZuKGlucHV0KTtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gci50aGVuKChyKT0+aGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlUmVmaW5lUmVzdWx0KHIsIHBheWxvYWQsIGlucHV0LCBpbnN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIGhhbmRsZVJlZmluZVJlc3VsdChyZXN1bHQsIHBheWxvYWQsIGlucHV0LCBpbnN0KSB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgY29uc3QgX2lzcyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBwYXRoOiBbXG4gICAgICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZi5wYXRoID8/IFtdXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY29udGludWU6ICFpbnN0Ll96b2QuZGVmLmFib3J0XG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbnN0Ll96b2QuZGVmLnBhcmFtcykgX2lzcy5wYXJhbXMgPSBpbnN0Ll96b2QuZGVmLnBhcmFtcztcbiAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh1dGlsLmlzc3VlKF9pc3MpKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0ICRvdXRwdXQgPSBTeW1ib2woXCJab2RPdXRwdXRcIik7XG5leHBvcnQgY29uc3QgJGlucHV0ID0gU3ltYm9sKFwiWm9kSW5wdXRcIik7XG5leHBvcnQgY2xhc3MgJFpvZFJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLl9pZG1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgYWRkKHNjaGVtYSwgLi4uX21ldGEpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IF9tZXRhWzBdO1xuICAgICAgICB0aGlzLl9tYXAuc2V0KHNjaGVtYSwgbWV0YSk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiBtZXRhKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faWRtYXAuaGFzKG1ldGEuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJRCAke21ldGEuaWR9IGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWdpc3RyeWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5faWRtYXAuc2V0KG1ldGEuaWQsIHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLl9pZG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlbW92ZShzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX21hcC5nZXQoc2NoZW1hKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIG1ldGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2lkbWFwLmRlbGV0ZShtZXRhLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKHNjaGVtYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXQoc2NoZW1hKSB7XG4gICAgICAgIC8vIHJldHVybiB0aGlzLl9tYXAuZ2V0KHNjaGVtYSkgYXMgYW55O1xuICAgICAgICAvLyBpbmhlcml0IG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IHAgPSBzY2hlbWEuX3pvZC5wYXJlbnQ7XG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICBjb25zdCBwbSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldChwKSA/PyB7fVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlbGV0ZSBwbS5pZDsgLy8gZG8gbm90IGluaGVyaXQgaWRcbiAgICAgICAgICAgIGNvbnN0IGYgPSB7XG4gICAgICAgICAgICAgICAgLi4ucG0sXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fbWFwLmdldChzY2hlbWEpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGYpLmxlbmd0aCA/IGYgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoc2NoZW1hKTtcbiAgICB9XG4gICAgaGFzKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhzY2hlbWEpO1xuICAgIH1cbn1cbi8vIHJlZ2lzdHJpZXNcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gbmV3ICRab2RSZWdpc3RyeSgpO1xufVxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gLypAX19QVVJFX18qLyByZWdpc3RyeSgpO1xuIiwgImltcG9ydCAqIGFzIGNoZWNrcyBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCAqIGFzIHNjaGVtYXMgZnJvbSBcIi4vc2NoZW1hcy5qc1wiO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwiLi91dGlsLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gX3N0cmluZyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZFN0cmluZyhDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lbWFpbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJlbWFpbFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9ndWlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImd1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3V1aWR2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1dWlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICB2ZXJzaW9uOiBcInY0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXVpZHY2KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInV1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIHZlcnNpb246IFwidjZcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91dWlkdjcoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwidXVpZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VybChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1cmxcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZW1vamkoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZW1vamlcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmFub2lkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcIm5hbm9pZFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jdWlkKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImN1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY3VpZDIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiY3VpZDJcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdWxpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ1bGlkXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3hpZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJ4aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfa3N1aWQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwia3N1aWRcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXB2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJpcHY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2lwdjYoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiaXB2NlwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jaWRydjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiY2lkcnY0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NpZHJ2NihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJjaWRydjZcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYmFzZTY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImJhc2U2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9iYXNlNjR1cmwoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2UxNjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZTE2NFwiLFxuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9qd3QoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiand0XCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgVGltZVByZWNpc2lvbiA9IHtcbiAgICBBbnk6IG51bGwsXG4gICAgTWludXRlOiAtMSxcbiAgICBTZWNvbmQ6IDAsXG4gICAgTWlsbGlzZWNvbmQ6IDMsXG4gICAgTWljcm9zZWNvbmQ6IDZcbn07XG5leHBvcnQgZnVuY3Rpb24gX2lzb0RhdGVUaW1lKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImRhdGV0aW1lXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgbG9jYWw6IGZhbHNlLFxuICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlXCIsXG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pc29UaW1lKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcInRpbWVcIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaXNvRHVyYXRpb24oQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQ6IFwiZHVyYXRpb25cIixcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX251bWJlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY29lcmNlZE51bWJlcihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBjaGVjazogXCJudW1iZXJfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcInNhZmVpbnRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9mbG9hdDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJmbG9hdDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZmxvYXQ2NChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwiZmxvYXQ2NFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2ludDMyKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgY2hlY2s6IFwibnVtYmVyX2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJpbnQzMlwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VpbnQzMihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrOiBcIm51bWJlcl9mb3JtYXRcIixcbiAgICAgICAgYWJvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IFwidWludDMyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYm9vbGVhbihDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWRCb29sZWFuKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9iaWdpbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NvZXJjZWRCaWdpbnQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW50NjQoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICBjaGVjazogXCJiaWdpbnRfZm9ybWF0XCIsXG4gICAgICAgIGFib3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiBcImludDY0XCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdWludDY0KENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgY2hlY2s6IFwiYmlnaW50X2Zvcm1hdFwiLFxuICAgICAgICBhYm9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogXCJ1aW50NjRcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zeW1ib2woQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN5bWJvbFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VuZGVmaW5lZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidW5kZWZpbmVkXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbnVsbChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibnVsbFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2FueShDbGFzcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImFueVwiXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3Vua25vd24oQ2xhc3MpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmtub3duXCJcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmV2ZXIoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm5ldmVyXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdm9pZChDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidm9pZFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2RhdGUoQ2xhc3MsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9jb2VyY2VkRGF0ZShDbGFzcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmFuKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJuYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9sdCh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTGVzc1RoYW4oe1xuICAgICAgICBjaGVjazogXCJsZXNzX3RoYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogZmFsc2VcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbHRlKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMZXNzVGhhbih7XG4gICAgICAgIGNoZWNrOiBcImxlc3NfdGhhblwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlXG4gICAgfSk7XG59XG5leHBvcnQgeyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6Lmx0ZSgpYCBpbnN0ZWFkLiAqLyBfbHRlIGFzIF9tYXggfTtcbmV4cG9ydCBmdW5jdGlvbiBfZ3QodmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0dyZWF0ZXJUaGFuKHtcbiAgICAgICAgY2hlY2s6IFwiZ3JlYXRlcl90aGFuXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2d0ZSh2YWx1ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrR3JlYXRlclRoYW4oe1xuICAgICAgICBjaGVjazogXCJncmVhdGVyX3RoYW5cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogdHJ1ZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgLyoqIEBkZXByZWNhdGVkIFVzZSBgei5ndGUoKWAgaW5zdGVhZC4gKi8gX2d0ZSBhcyBfbWluIH07XG5leHBvcnQgZnVuY3Rpb24gX3Bvc2l0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfZ3QoMCwgcGFyYW1zKTtcbn1cbi8vIG5lZ2F0aXZlXG5leHBvcnQgZnVuY3Rpb24gX25lZ2F0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfbHQoMCwgcGFyYW1zKTtcbn1cbi8vIG5vbnBvc2l0aXZlXG5leHBvcnQgZnVuY3Rpb24gX25vbnBvc2l0aXZlKHBhcmFtcykge1xuICAgIHJldHVybiBfbHRlKDAsIHBhcmFtcyk7XG59XG4vLyBub25uZWdhdGl2ZVxuZXhwb3J0IGZ1bmN0aW9uIF9ub25uZWdhdGl2ZShwYXJhbXMpIHtcbiAgICByZXR1cm4gX2d0ZSgwLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNdWx0aXBsZU9mKHtcbiAgICAgICAgY2hlY2s6IFwibXVsdGlwbGVfb2ZcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgdmFsdWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWF4U2l6ZShtYXhpbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNYXhTaXplKHtcbiAgICAgICAgY2hlY2s6IFwibWF4X3NpemVcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgbWF4aW11bVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9taW5TaXplKG1pbmltdW0sIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pblNpemUoe1xuICAgICAgICBjaGVjazogXCJtaW5fc2l6ZVwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBtaW5pbXVtXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3NpemUoc2l6ZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrU2l6ZUVxdWFscyh7XG4gICAgICAgIGNoZWNrOiBcInNpemVfZXF1YWxzXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIHNpemVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbWF4TGVuZ3RoKG1heGltdW0sIHBhcmFtcykge1xuICAgIGNvbnN0IGNoID0gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNYXhMZW5ndGgoe1xuICAgICAgICBjaGVjazogXCJtYXhfbGVuZ3RoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1heGltdW1cbiAgICB9KTtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gX21pbkxlbmd0aChtaW5pbXVtLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tNaW5MZW5ndGgoe1xuICAgICAgICBjaGVjazogXCJtaW5fbGVuZ3RoXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIG1pbmltdW1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbGVuZ3RoKGxlbmd0aCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrTGVuZ3RoRXF1YWxzKHtcbiAgICAgICAgY2hlY2s6IFwibGVuZ3RoX2VxdWFsc1wiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBsZW5ndGhcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcmVnZXgocGF0dGVybiwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrUmVnZXgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJyZWdleFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBwYXR0ZXJuXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2xvd2VyY2FzZShwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tMb3dlckNhc2Uoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJsb3dlcmNhc2VcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91cHBlcmNhc2UocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrVXBwZXJDYXNlKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwidXBwZXJjYXNlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfaW5jbHVkZXMoaW5jbHVkZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja0luY2x1ZGVzKHtcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICBmb3JtYXQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgaW5jbHVkZXNcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3RhcnRzV2l0aChwcmVmaXgsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja1N0YXJ0c1dpdGgoe1xuICAgICAgICBjaGVjazogXCJzdHJpbmdfZm9ybWF0XCIsXG4gICAgICAgIGZvcm1hdDogXCJzdGFydHNfd2l0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBwcmVmaXhcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZW5kc1dpdGgoc3VmZml4LCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IGNoZWNrcy4kWm9kQ2hlY2tFbmRzV2l0aCh7XG4gICAgICAgIGNoZWNrOiBcInN0cmluZ19mb3JtYXRcIixcbiAgICAgICAgZm9ybWF0OiBcImVuZHNfd2l0aFwiLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICBzdWZmaXhcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcHJvcGVydHkocHJvcGVydHksIHNjaGVtYSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBjaGVja3MuJFpvZENoZWNrUHJvcGVydHkoe1xuICAgICAgICBjaGVjazogXCJwcm9wZXJ0eVwiLFxuICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX21pbWUodHlwZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja01pbWVUeXBlKHtcbiAgICAgICAgY2hlY2s6IFwibWltZV90eXBlXCIsXG4gICAgICAgIG1pbWU6IHR5cGVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX292ZXJ3cml0ZSh0eCkge1xuICAgIHJldHVybiBuZXcgY2hlY2tzLiRab2RDaGVja092ZXJ3cml0ZSh7XG4gICAgICAgIGNoZWNrOiBcIm92ZXJ3cml0ZVwiLFxuICAgICAgICB0eFxuICAgIH0pO1xufVxuLy8gbm9ybWFsaXplXG5leHBvcnQgZnVuY3Rpb24gX25vcm1hbGl6ZShmb3JtKSB7XG4gICAgcmV0dXJuIF9vdmVyd3JpdGUoKGlucHV0KT0+aW5wdXQubm9ybWFsaXplKGZvcm0pKTtcbn1cbi8vIHRyaW1cbmV4cG9ydCBmdW5jdGlvbiBfdHJpbSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50cmltKCkpO1xufVxuLy8gdG9Mb3dlckNhc2VcbmV4cG9ydCBmdW5jdGlvbiBfdG9Mb3dlckNhc2UoKSB7XG4gICAgcmV0dXJuIF9vdmVyd3JpdGUoKGlucHV0KT0+aW5wdXQudG9Mb3dlckNhc2UoKSk7XG59XG4vLyB0b1VwcGVyQ2FzZVxuZXhwb3J0IGZ1bmN0aW9uIF90b1VwcGVyQ2FzZSgpIHtcbiAgICByZXR1cm4gX292ZXJ3cml0ZSgoaW5wdXQpPT5pbnB1dC50b1VwcGVyQ2FzZSgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfYXJyYXkoQ2xhc3MsIGVsZW1lbnQsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIC8vIGdldCBlbGVtZW50KCkge1xuICAgICAgICAvLyAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAvLyB9LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VuaW9uKENsYXNzLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ1bmlvblwiLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2Rpc2NyaW1pbmF0ZWRVbmlvbihDbGFzcywgZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9pbnRlcnNlY3Rpb24oQ2xhc3MsIGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiaW50ZXJzZWN0aW9uXCIsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHJpZ2h0XG4gICAgfSk7XG59XG4vLyBleHBvcnQgZnVuY3Rpb24gX3R1cGxlKFxuLy8gICBDbGFzczogdXRpbC5TY2hlbWFDbGFzczxzY2hlbWFzLiRab2RUdXBsZT4sXG4vLyAgIGl0ZW1zOiBbXSxcbi8vICAgcGFyYW1zPzogc3RyaW5nIHwgJFpvZFR1cGxlUGFyYW1zXG4vLyApOiBzY2hlbWFzLiRab2RUdXBsZTxbXSwgbnVsbD47XG5leHBvcnQgZnVuY3Rpb24gX3R1cGxlKENsYXNzLCBpdGVtcywgX3BhcmFtc09yUmVzdCwgX3BhcmFtcykge1xuICAgIGNvbnN0IGhhc1Jlc3QgPSBfcGFyYW1zT3JSZXN0IGluc3RhbmNlb2Ygc2NoZW1hcy4kWm9kVHlwZTtcbiAgICBjb25zdCBwYXJhbXMgPSBoYXNSZXN0ID8gX3BhcmFtcyA6IF9wYXJhbXNPclJlc3Q7XG4gICAgY29uc3QgcmVzdCA9IGhhc1Jlc3QgPyBfcGFyYW1zT3JSZXN0IDogbnVsbDtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgICAgICBpdGVtcyxcbiAgICAgICAgcmVzdCxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9yZWNvcmQoQ2xhc3MsIGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9tYXAoQ2xhc3MsIGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibWFwXCIsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zZXQoQ2xhc3MsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9lbnVtKENsYXNzLCB2YWx1ZXMsIHBhcmFtcykge1xuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyBPYmplY3QuZnJvbUVudHJpZXModmFsdWVzLm1hcCgodik9PltcbiAgICAgICAgICAgIHYsXG4gICAgICAgICAgICB2XG4gICAgICAgIF0pKSA6IHZhbHVlcztcbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgLy8gICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIC8vICAgICBlbnRyaWVzW3ZhbHVlXSA9IHZhbHVlO1xuICAgIC8vICAgfVxuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICBPYmplY3QuYXNzaWduKGVudHJpZXMsIHZhbHVlcyk7XG4gICAgLy8gfVxuICAgIC8vIGNvbnN0IGVudHJpZXM6IHV0aWwuRW51bUxpa2UgPSB7fTtcbiAgICAvLyBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAvLyAgIGVudHJpZXNbdmFsXSA9IHZhbDtcbiAgICAvLyB9XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgVGhpcyBBUEkgaGFzIGJlZW4gbWVyZ2VkIGludG8gYHouZW51bSgpYC4gVXNlIGB6LmVudW0oKWAgaW5zdGVhZC5cbiAqXG4gKiBgYGB0c1xuICogZW51bSBDb2xvcnMgeyByZWQsIGdyZWVuLCBibHVlIH1cbiAqIHouZW51bShDb2xvcnMpO1xuICogYGBgXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIF9uYXRpdmVFbnVtKENsYXNzLCBlbnRyaWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgIGVudHJpZXMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbGl0ZXJhbChDbGFzcywgdmFsdWUsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9maWxlKENsYXNzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdHJhbnNmb3JtKENsYXNzLCBmbikge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInRyYW5zZm9ybVwiLFxuICAgICAgICB0cmFuc2Zvcm06IGZuXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX29wdGlvbmFsKENsYXNzLCBpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJvcHRpb25hbFwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbnVsbGFibGUoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcIm51bGxhYmxlXCIsXG4gICAgICAgIGlubmVyVHlwZVxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9kZWZhdWx0KENsYXNzLCBpbm5lclR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImRlZmF1bHRcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbm9ub3B0aW9uYWwoQ2xhc3MsIGlubmVyVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N1Y2Nlc3MoQ2xhc3MsIGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX2NhdGNoKENsYXNzLCBpbm5lclR5cGUsIGNhdGNoVmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJjYXRjaFwiLFxuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBjYXRjaFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBjYXRjaFZhbHVlIDogKCk9PmNhdGNoVmFsdWVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcGlwZShDbGFzcywgaW5fLCBvdXQpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKHtcbiAgICAgICAgdHlwZTogXCJwaXBlXCIsXG4gICAgICAgIGluOiBpbl8sXG4gICAgICAgIG91dFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9yZWFkb25seShDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicmVhZG9ubHlcIixcbiAgICAgICAgaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX3RlbXBsYXRlTGl0ZXJhbChDbGFzcywgcGFydHMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgcGFydHMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbGF6eShDbGFzcywgZ2V0dGVyKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwibGF6eVwiLFxuICAgICAgICBnZXR0ZXJcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfcHJvbWlzZShDbGFzcywgaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwicHJvbWlzZVwiLFxuICAgICAgICBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY3VzdG9tKENsYXNzLCBmbiwgX3BhcmFtcykge1xuICAgIGNvbnN0IG5vcm0gPSB1dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKTtcbiAgICBub3JtLmFib3J0ID8/IChub3JtLmFib3J0ID0gdHJ1ZSk7IC8vIGRlZmF1bHQgdG8gYWJvcnQ6ZmFsc2VcbiAgICBjb25zdCBzY2hlbWEgPSBuZXcgQ2xhc3Moe1xuICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICBjaGVjazogXCJjdXN0b21cIixcbiAgICAgICAgZm46IGZuLFxuICAgICAgICAuLi5ub3JtXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbn1cbi8vIHNhbWUgYXMgX2N1c3RvbSBidXQgZGVmYXVsdHMgdG8gYWJvcnQ6ZmFsc2VcbmV4cG9ydCBmdW5jdGlvbiBfcmVmaW5lKENsYXNzLCBmbiwgX3BhcmFtcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBDbGFzcyh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3VwZXJSZWZpbmUoZm4pIHtcbiAgICBjb25zdCBjaCA9IF9jaGVjaygocGF5bG9hZCk9PntcbiAgICAgICAgcGF5bG9hZC5hZGRJc3N1ZSA9IChpc3N1ZSk9PntcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoaXNzdWUsIHBheWxvYWQudmFsdWUsIGNoLl96b2QuZGVmKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZvciBab2QgMyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IF9pc3N1ZSA9IGlzc3VlO1xuICAgICAgICAgICAgICAgIGlmIChfaXNzdWUuZmF0YWwpIF9pc3N1ZS5jb250aW51ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5jb2RlID8/IChfaXNzdWUuY29kZSA9IFwiY3VzdG9tXCIpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnB1dCA/PyAoX2lzc3VlLmlucHV0ID0gcGF5bG9hZC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2lzc3VlLmluc3QgPz8gKF9pc3N1ZS5pbnN0ID0gY2gpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5jb250aW51ZSA/PyAoX2lzc3VlLmNvbnRpbnVlID0gIWNoLl96b2QuZGVmLmFib3J0KTsgLy8gYWJvcnQgaXMgYWx3YXlzIHVuZGVmaW5lZCwgc28gdGhpcyBpcyBhbHdheXMgdHJ1ZS4uLlxuICAgICAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzLnB1c2godXRpbC5pc3N1ZShfaXNzdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZuKHBheWxvYWQudmFsdWUsIHBheWxvYWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBjaDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfY2hlY2soZm4sIHBhcmFtcykge1xuICAgIGNvbnN0IGNoID0gbmV3IGNoZWNrcy4kWm9kQ2hlY2soe1xuICAgICAgICBjaGVjazogXCJjdXN0b21cIixcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xuICAgIGNoLl96b2QuY2hlY2sgPSBmbjtcbiAgICByZXR1cm4gY2g7XG59XG5leHBvcnQgZnVuY3Rpb24gX3N0cmluZ2Jvb2woQ2xhc3NlcywgX3BhcmFtcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IHV0aWwubm9ybWFsaXplUGFyYW1zKF9wYXJhbXMpO1xuICAgIGxldCB0cnV0aHlBcnJheSA9IHBhcmFtcy50cnV0aHkgPz8gW1xuICAgICAgICBcInRydWVcIixcbiAgICAgICAgXCIxXCIsXG4gICAgICAgIFwieWVzXCIsXG4gICAgICAgIFwib25cIixcbiAgICAgICAgXCJ5XCIsXG4gICAgICAgIFwiZW5hYmxlZFwiXG4gICAgXTtcbiAgICBsZXQgZmFsc3lBcnJheSA9IHBhcmFtcy5mYWxzeSA/PyBbXG4gICAgICAgIFwiZmFsc2VcIixcbiAgICAgICAgXCIwXCIsXG4gICAgICAgIFwibm9cIixcbiAgICAgICAgXCJvZmZcIixcbiAgICAgICAgXCJuXCIsXG4gICAgICAgIFwiZGlzYWJsZWRcIlxuICAgIF07XG4gICAgaWYgKHBhcmFtcy5jYXNlICE9PSBcInNlbnNpdGl2ZVwiKSB7XG4gICAgICAgIHRydXRoeUFycmF5ID0gdHJ1dGh5QXJyYXkubWFwKCh2KT0+dHlwZW9mIHYgPT09IFwic3RyaW5nXCIgPyB2LnRvTG93ZXJDYXNlKCkgOiB2KTtcbiAgICAgICAgZmFsc3lBcnJheSA9IGZhbHN5QXJyYXkubWFwKCh2KT0+dHlwZW9mIHYgPT09IFwic3RyaW5nXCIgPyB2LnRvTG93ZXJDYXNlKCkgOiB2KTtcbiAgICB9XG4gICAgY29uc3QgdHJ1dGh5U2V0ID0gbmV3IFNldCh0cnV0aHlBcnJheSk7XG4gICAgY29uc3QgZmFsc3lTZXQgPSBuZXcgU2V0KGZhbHN5QXJyYXkpO1xuICAgIGNvbnN0IF9Db2RlYyA9IENsYXNzZXMuQ29kZWMgPz8gc2NoZW1hcy4kWm9kQ29kZWM7XG4gICAgY29uc3QgX0Jvb2xlYW4gPSBDbGFzc2VzLkJvb2xlYW4gPz8gc2NoZW1hcy4kWm9kQm9vbGVhbjtcbiAgICBjb25zdCBfU3RyaW5nID0gQ2xhc3Nlcy5TdHJpbmcgPz8gc2NoZW1hcy4kWm9kU3RyaW5nO1xuICAgIGNvbnN0IHN0cmluZ1NjaGVtYSA9IG5ldyBfU3RyaW5nKHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH0pO1xuICAgIGNvbnN0IGJvb2xlYW5TY2hlbWEgPSBuZXcgX0Jvb2xlYW4oe1xuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH0pO1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IF9Db2RlYyh7XG4gICAgICAgIHR5cGU6IFwicGlwZVwiLFxuICAgICAgICBpbjogc3RyaW5nU2NoZW1hLFxuICAgICAgICBvdXQ6IGJvb2xlYW5TY2hlbWEsXG4gICAgICAgIHRyYW5zZm9ybTogKGlucHV0LCBwYXlsb2FkKT0+e1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBpbnB1dDtcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY2FzZSAhPT0gXCJzZW5zaXRpdmVcIikgZGF0YSA9IGRhdGEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0cnV0aHlTZXQuaGFzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZhbHN5U2V0LmhhcyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF92YWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJzdHJpbmdib29sXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udHJ1dGh5U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZmFsc3lTZXRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBheWxvYWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluc3Q6IGNvZGVjLFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm06IChpbnB1dCwgX3BheWxvYWQpPT57XG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1dGh5QXJyYXlbMF0gfHwgXCJ0cnVlXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzeUFycmF5WzBdIHx8IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH0pO1xuICAgIHJldHVybiBjb2RlYztcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3RyaW5nRm9ybWF0KENsYXNzLCBmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgcGFyYW1zID0gdXRpbC5ub3JtYWxpemVQYXJhbXMoX3BhcmFtcyk7XG4gICAgY29uc3QgZGVmID0ge1xuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhfcGFyYW1zKSxcbiAgICAgICAgY2hlY2s6IFwic3RyaW5nX2Zvcm1hdFwiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIGZuOiB0eXBlb2YgZm5PclJlZ2V4ID09PSBcImZ1bmN0aW9uXCIgPyBmbk9yUmVnZXggOiAodmFsKT0+Zm5PclJlZ2V4LnRlc3QodmFsKSxcbiAgICAgICAgLi4ucGFyYW1zXG4gICAgfTtcbiAgICBpZiAoZm5PclJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGRlZi5wYXR0ZXJuID0gZm5PclJlZ2V4O1xuICAgIH1cbiAgICBjb25zdCBpbnN0ID0gbmV3IENsYXNzKGRlZik7XG4gICAgcmV0dXJuIGluc3Q7XG59XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgc2NoZW1hcyBmcm9tIFwiLi9zY2hlbWFzLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kSVNPRGF0ZVRpbWUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVRpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EYXRlVGltZS5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGVUaW1lKFpvZElTT0RhdGVUaW1lLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElTT0RhdGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRGF0ZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZElTT0RhdGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIHNjaGVtYXMuWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0RhdGUoWm9kSVNPRGF0ZSwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RJU09UaW1lID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZElTT1RpbWVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09UaW1lLmluaXQoaW5zdCwgZGVmKTtcbiAgICBzY2hlbWFzLlpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB0aW1lKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pc29UaW1lKFpvZElTT1RpbWUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVNPRHVyYXRpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVNPRHVyYXRpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RJU09EdXJhdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgc2NoZW1hcy5ab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZHVyYXRpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lzb0R1cmF0aW9uKFpvZElTT0R1cmF0aW9uLCBwYXJhbXMpO1xufVxuIiwgImltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIi4uL2NvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7ICRab2RFcnJvciB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gXCIuLi9jb3JlL3V0aWwuanNcIjtcbmNvbnN0IGluaXRpYWxpemVyID0gKGluc3QsIGlzc3Vlcyk9PntcbiAgICAkWm9kRXJyb3IuaW5pdChpbnN0LCBpc3N1ZXMpO1xuICAgIGluc3QubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpbnN0LCB7XG4gICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZvcm1hdEVycm9yKGluc3QsIG1hcHBlcilcbiAgICAgICAgfSxcbiAgICAgICAgZmxhdHRlbjoge1xuICAgICAgICAgICAgdmFsdWU6IChtYXBwZXIpPT5jb3JlLmZsYXR0ZW5FcnJvcihpbnN0LCBtYXBwZXIpXG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3VlOiB7XG4gICAgICAgICAgICB2YWx1ZTogKGlzc3VlKT0+e1xuICAgICAgICAgICAgICAgIGluc3QuaXNzdWVzLnB1c2goaXNzdWUpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFkZElzc3Vlczoge1xuICAgICAgICAgICAgdmFsdWU6IChpc3N1ZXMpPT57XG4gICAgICAgICAgICAgICAgaW5zdC5pc3N1ZXMucHVzaCguLi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIGluc3QubWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGluc3QuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzRW1wdHk6IHtcbiAgICAgICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3QuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3QsIFwiaXNFbXB0eVwiLCB7XG4vLyAgIGdldCgpIHtcbi8vICAgICByZXR1cm4gaW5zdC5pc3N1ZXMubGVuZ3RoID09PSAwO1xuLy8gICB9LFxuLy8gfSk7XG59O1xuZXhwb3J0IGNvbnN0IFpvZEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplcik7XG5leHBvcnQgY29uc3QgWm9kUmVhbEVycm9yID0gY29yZS4kY29uc3RydWN0b3IoXCJab2RFcnJvclwiLCBpbml0aWFsaXplciwge1xuICAgIFBhcmVudDogRXJyb3Jcbn0pOyAvLyAvKiogQGRlcHJlY2F0ZWQgVXNlIGB6LmNvcmUuJFpvZEVycm9yTWFwQ3R4YCBpbnN0ZWFkLiAqL1xuIC8vIGV4cG9ydCB0eXBlIEVycm9yTWFwQ3R4ID0gY29yZS4kWm9kRXJyb3JNYXBDdHg7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgWm9kUmVhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgY29uc3QgcGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fcGFyc2UoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBwYXJzZUFzeW5jID0gLyogQF9fUFVSRV9fICovIGNvcmUuX3BhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlUGFyc2UgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZVBhcnNlQXN5bmMoWm9kUmVhbEVycm9yKTtcbi8vIENvZGVjIGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9lbmNvZGUoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZGVjb2RlKFpvZFJlYWxFcnJvcik7XG5leHBvcnQgY29uc3QgZW5jb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fZW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBkZWNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9kZWNvZGVBc3luYyhab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZUVuY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVEZWNvZGUgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZShab2RSZWFsRXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNhZmVFbmNvZGVBc3luYyA9IC8qIEBfX1BVUkVfXyAqLyBjb3JlLl9zYWZlRW5jb2RlQXN5bmMoWm9kUmVhbEVycm9yKTtcbmV4cG9ydCBjb25zdCBzYWZlRGVjb2RlQXN5bmMgPSAvKiBAX19QVVJFX18gKi8gY29yZS5fc2FmZURlY29kZUFzeW5jKFpvZFJlYWxFcnJvcik7XG4iLCAiaW1wb3J0ICogYXMgY29yZSBmcm9tIFwiLi4vY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gXCIuLi9jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBjaGVja3MgZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgKiBhcyBpc28gZnJvbSBcIi4vaXNvLmpzXCI7XG5pbXBvcnQgKiBhcyBwYXJzZSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuZXhwb3J0IGNvbnN0IFpvZFR5cGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZGVmID0gZGVmO1xuICAgIGluc3QudHlwZSA9IGRlZi50eXBlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcIl9kZWZcIiwge1xuICAgICAgICB2YWx1ZTogZGVmXG4gICAgfSk7XG4gICAgLy8gYmFzZSBtZXRob2RzXG4gICAgaW5zdC5jaGVjayA9ICguLi5jaGVja3MpPT57XG4gICAgICAgIHJldHVybiBpbnN0LmNsb25lKHV0aWwubWVyZ2VEZWZzKGRlZiwge1xuICAgICAgICAgICAgY2hlY2tzOiBbXG4gICAgICAgICAgICAgICAgLi4uZGVmLmNoZWNrcyA/PyBbXSxcbiAgICAgICAgICAgICAgICAuLi5jaGVja3MubWFwKChjaCk9PnR5cGVvZiBjaCA9PT0gXCJmdW5jdGlvblwiID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3pvZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOiBjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWY6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6IFwiY3VzdG9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uYXR0YWNoOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IDogY2gpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIGluc3QuY2xvbmUgPSAoZGVmLCBwYXJhbXMpPT5jb3JlLmNsb25lKGluc3QsIGRlZiwgcGFyYW1zKTtcbiAgICBpbnN0LmJyYW5kID0gKCk9Pmluc3Q7XG4gICAgaW5zdC5yZWdpc3RlciA9IChyZWcsIG1ldGEpPT57XG4gICAgICAgIHJlZy5hZGQoaW5zdCwgbWV0YSk7XG4gICAgICAgIHJldHVybiBpbnN0O1xuICAgIH07XG4gICAgLy8gcGFyc2luZ1xuICAgIGluc3QucGFyc2UgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2UucGFyc2UoaW5zdCwgZGF0YSwgcGFyYW1zLCB7XG4gICAgICAgICAgICBjYWxsZWU6IGluc3QucGFyc2VcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zYWZlUGFyc2UgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZVBhcnNlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5wYXJzZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnBhcnNlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zLCB7XG4gICAgICAgICAgICBjYWxsZWU6IGluc3QucGFyc2VBc3luY1xuICAgICAgICB9KTtcbiAgICBpbnN0LnNhZmVQYXJzZUFzeW5jID0gYXN5bmMgKGRhdGEsIHBhcmFtcyk9PnBhcnNlLnNhZmVQYXJzZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zcGEgPSBpbnN0LnNhZmVQYXJzZUFzeW5jO1xuICAgIC8vIGVuY29kaW5nL2RlY29kaW5nXG4gICAgaW5zdC5lbmNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZW5jb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5kZWNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZGVjb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5lbmNvZGVBc3luYyA9IGFzeW5jIChkYXRhLCBwYXJhbXMpPT5wYXJzZS5lbmNvZGVBc3luYyhpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3QuZGVjb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2UuZGVjb2RlQXN5bmMoaW5zdCwgZGF0YSwgcGFyYW1zKTtcbiAgICBpbnN0LnNhZmVFbmNvZGUgPSAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZUVuY29kZShpbnN0LCBkYXRhLCBwYXJhbXMpO1xuICAgIGluc3Quc2FmZURlY29kZSA9IChkYXRhLCBwYXJhbXMpPT5wYXJzZS5zYWZlRGVjb2RlKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRW5jb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZUVuY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgaW5zdC5zYWZlRGVjb2RlQXN5bmMgPSBhc3luYyAoZGF0YSwgcGFyYW1zKT0+cGFyc2Uuc2FmZURlY29kZUFzeW5jKGluc3QsIGRhdGEsIHBhcmFtcyk7XG4gICAgLy8gcmVmaW5lbWVudHNcbiAgICBpbnN0LnJlZmluZSA9IChjaGVjaywgcGFyYW1zKT0+aW5zdC5jaGVjayhyZWZpbmUoY2hlY2ssIHBhcmFtcykpO1xuICAgIGluc3Quc3VwZXJSZWZpbmUgPSAocmVmaW5lbWVudCk9Pmluc3QuY2hlY2soc3VwZXJSZWZpbmUocmVmaW5lbWVudCkpO1xuICAgIGluc3Qub3ZlcndyaXRlID0gKGZuKT0+aW5zdC5jaGVjayhjaGVja3Mub3ZlcndyaXRlKGZuKSk7XG4gICAgLy8gd3JhcHBlcnNcbiAgICBpbnN0Lm9wdGlvbmFsID0gKCk9Pm9wdGlvbmFsKGluc3QpO1xuICAgIGluc3QubnVsbGFibGUgPSAoKT0+bnVsbGFibGUoaW5zdCk7XG4gICAgaW5zdC5udWxsaXNoID0gKCk9Pm9wdGlvbmFsKG51bGxhYmxlKGluc3QpKTtcbiAgICBpbnN0Lm5vbm9wdGlvbmFsID0gKHBhcmFtcyk9Pm5vbm9wdGlvbmFsKGluc3QsIHBhcmFtcyk7XG4gICAgaW5zdC5hcnJheSA9ICgpPT5hcnJheShpbnN0KTtcbiAgICBpbnN0Lm9yID0gKGFyZyk9PnVuaW9uKFtcbiAgICAgICAgICAgIGluc3QsXG4gICAgICAgICAgICBhcmdcbiAgICAgICAgXSk7XG4gICAgaW5zdC5hbmQgPSAoYXJnKT0+aW50ZXJzZWN0aW9uKGluc3QsIGFyZyk7XG4gICAgaW5zdC50cmFuc2Zvcm0gPSAodHgpPT5waXBlKGluc3QsIHRyYW5zZm9ybSh0eCkpO1xuICAgIGluc3QuZGVmYXVsdCA9IChkZWYpPT5fZGVmYXVsdChpbnN0LCBkZWYpO1xuICAgIGluc3QucHJlZmF1bHQgPSAoZGVmKT0+cHJlZmF1bHQoaW5zdCwgZGVmKTtcbiAgICAvLyBpbnN0LmNvYWxlc2NlID0gKGRlZiwgcGFyYW1zKSA9PiBjb2FsZXNjZShpbnN0LCBkZWYsIHBhcmFtcyk7XG4gICAgaW5zdC5jYXRjaCA9IChwYXJhbXMpPT5fY2F0Y2goaW5zdCwgcGFyYW1zKTtcbiAgICBpbnN0LnBpcGUgPSAodGFyZ2V0KT0+cGlwZShpbnN0LCB0YXJnZXQpO1xuICAgIGluc3QucmVhZG9ubHkgPSAoKT0+cmVhZG9ubHkoaW5zdCk7XG4gICAgLy8gbWV0YVxuICAgIGluc3QuZGVzY3JpYmUgPSAoZGVzY3JpcHRpb24pPT57XG4gICAgICAgIGNvbnN0IGNsID0gaW5zdC5jbG9uZSgpO1xuICAgICAgICBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmFkZChjbCwge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbDtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcImRlc2NyaXB0aW9uXCIsIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KT8uZGVzY3JpcHRpb247XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGluc3QubWV0YSA9ICguLi5hcmdzKT0+e1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlLmdsb2JhbFJlZ2lzdHJ5LmdldChpbnN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbCA9IGluc3QuY2xvbmUoKTtcbiAgICAgICAgY29yZS5nbG9iYWxSZWdpc3RyeS5hZGQoY2wsIGFyZ3NbMF0pO1xuICAgICAgICByZXR1cm4gY2w7XG4gICAgfTtcbiAgICAvLyBoZWxwZXJzXG4gICAgaW5zdC5pc09wdGlvbmFsID0gKCk9Pmluc3Quc2FmZVBhcnNlKHVuZGVmaW5lZCkuc3VjY2VzcztcbiAgICBpbnN0LmlzTnVsbGFibGUgPSAoKT0+aW5zdC5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICByZXR1cm4gaW5zdDtcbn0pO1xuLyoqIEBpbnRlcm5hbCAqLyBleHBvcnQgY29uc3QgX1pvZFN0cmluZyA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJfWm9kU3RyaW5nXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QuZm9ybWF0ID0gYmFnLmZvcm1hdCA/PyBudWxsO1xuICAgIGluc3QubWluTGVuZ3RoID0gYmFnLm1pbmltdW0gPz8gbnVsbDtcbiAgICBpbnN0Lm1heExlbmd0aCA9IGJhZy5tYXhpbXVtID8/IG51bGw7XG4gICAgLy8gdmFsaWRhdGlvbnNcbiAgICBpbnN0LnJlZ2V4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5yZWdleCguLi5hcmdzKSk7XG4gICAgaW5zdC5pbmNsdWRlcyA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MuaW5jbHVkZXMoLi4uYXJncykpO1xuICAgIGluc3Quc3RhcnRzV2l0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3Muc3RhcnRzV2l0aCguLi5hcmdzKSk7XG4gICAgaW5zdC5lbmRzV2l0aCA9ICguLi5hcmdzKT0+aW5zdC5jaGVjayhjaGVja3MuZW5kc1dpdGgoLi4uYXJncykpO1xuICAgIGluc3QubWluID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgoLi4uYXJncykpO1xuICAgIGluc3QubWF4ID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5tYXhMZW5ndGgoLi4uYXJncykpO1xuICAgIGluc3QubGVuZ3RoID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNoZWNrcy5sZW5ndGgoLi4uYXJncykpO1xuICAgIGluc3Qubm9uZW1wdHkgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aCgxLCAuLi5hcmdzKSk7XG4gICAgaW5zdC5sb3dlcmNhc2UgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubG93ZXJjYXNlKHBhcmFtcykpO1xuICAgIGluc3QudXBwZXJjYXNlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLnVwcGVyY2FzZShwYXJhbXMpKTtcbiAgICAvLyB0cmFuc2Zvcm1zXG4gICAgaW5zdC50cmltID0gKCk9Pmluc3QuY2hlY2soY2hlY2tzLnRyaW0oKSk7XG4gICAgaW5zdC5ub3JtYWxpemUgPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY2hlY2tzLm5vcm1hbGl6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC50b0xvd2VyQ2FzZSA9ICgpPT5pbnN0LmNoZWNrKGNoZWNrcy50b0xvd2VyQ2FzZSgpKTtcbiAgICBpbnN0LnRvVXBwZXJDYXNlID0gKCk9Pmluc3QuY2hlY2soY2hlY2tzLnRvVXBwZXJDYXNlKCkpO1xufSk7XG5leHBvcnQgY29uc3QgWm9kU3RyaW5nID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN0cmluZ1wiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG4gICAgX1pvZFN0cmluZy5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5lbWFpbCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2VtYWlsKFpvZEVtYWlsLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVybCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3VybChab2RVUkwsIHBhcmFtcykpO1xuICAgIGluc3Quand0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fand0KFpvZEpXVCwgcGFyYW1zKSk7XG4gICAgaW5zdC5lbW9qaSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2Vtb2ppKFpvZEVtb2ppLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9ndWlkKFpvZEdVSUQsIHBhcmFtcykpO1xuICAgIGluc3QudXVpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3V1aWQoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkdjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkdjQoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkdjYgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkdjYoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC51dWlkdjcgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91dWlkdjcoWm9kVVVJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5uYW5vaWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9uYW5vaWQoWm9kTmFub0lELCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9ndWlkKFpvZEdVSUQsIHBhcmFtcykpO1xuICAgIGluc3QuY3VpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2N1aWQoWm9kQ1VJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5jdWlkMiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX2N1aWQyKFpvZENVSUQyLCBwYXJhbXMpKTtcbiAgICBpbnN0LnVsaWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl91bGlkKFpvZFVMSUQsIHBhcmFtcykpO1xuICAgIGluc3QuYmFzZTY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fYmFzZTY0KFpvZEJhc2U2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5iYXNlNjR1cmwgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9iYXNlNjR1cmwoWm9kQmFzZTY0VVJMLCBwYXJhbXMpKTtcbiAgICBpbnN0LnhpZCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX3hpZChab2RYSUQsIHBhcmFtcykpO1xuICAgIGluc3Qua3N1aWQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9rc3VpZChab2RLU1VJRCwgcGFyYW1zKSk7XG4gICAgaW5zdC5pcHY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5faXB2NChab2RJUHY0LCBwYXJhbXMpKTtcbiAgICBpbnN0LmlwdjYgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9pcHY2KFpvZElQdjYsIHBhcmFtcykpO1xuICAgIGluc3QuY2lkcnY0ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fY2lkcnY0KFpvZENJRFJ2NCwgcGFyYW1zKSk7XG4gICAgaW5zdC5jaWRydjYgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9jaWRydjYoWm9kQ0lEUnY2LCBwYXJhbXMpKTtcbiAgICBpbnN0LmUxNjQgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjb3JlLl9lMTY0KFpvZEUxNjQsIHBhcmFtcykpO1xuICAgIC8vIGlzb1xuICAgIGluc3QuZGF0ZXRpbWUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpc28uZGF0ZXRpbWUocGFyYW1zKSk7XG4gICAgaW5zdC5kYXRlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLmRhdGUocGFyYW1zKSk7XG4gICAgaW5zdC50aW1lID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soaXNvLnRpbWUocGFyYW1zKSk7XG4gICAgaW5zdC5kdXJhdGlvbiA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGlzby5kdXJhdGlvbihwYXJhbXMpKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fc3RyaW5nKFpvZFN0cmluZywgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RTdHJpbmdGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kU3RyaW5nRm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBfWm9kU3RyaW5nLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGNvbnN0IFpvZEVtYWlsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEVtYWlsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RFbWFpbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9lbWFpbChab2RFbWFpbCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RHVUlEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEdVSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEdVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBndWlkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9ndWlkKFpvZEdVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVVVJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVVUlEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RVVUlELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdXVpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZChab2RVVUlELCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXVpZHY0KFpvZFVVSUQsIHBhcmFtcyk7XG59XG4vLyBab2RVVUlEdjZcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjYocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3V1aWR2Nihab2RVVUlELCBwYXJhbXMpO1xufVxuLy8gWm9kVVVJRHY3XG5leHBvcnQgZnVuY3Rpb24gdXVpZHY3KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl91dWlkdjcoWm9kVVVJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RVUkwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVVJMXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RVUkwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiB1cmwocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VybChab2RVUkwsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaHR0cFVybChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdXJsKFpvZFVSTCwge1xuICAgICAgICBwcm90b2NvbDogL15odHRwcz8kLyxcbiAgICAgICAgaG9zdG5hbWU6IGNvcmUucmVnZXhlcy5kb21haW4sXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RFbW9qaSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RFbW9qaVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRW1vamkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlbW9qaShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZW1vamkoWm9kRW1vamksIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTmFub0lEID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE5hbm9JRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kTmFub0lELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmFub2lkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9uYW5vaWQoWm9kTmFub0lELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENVSUQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ1VJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGN1aWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2N1aWQoWm9kQ1VJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDVUlEMiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDVUlEMlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ1VJRDIuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjdWlkMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY3VpZDIoWm9kQ1VJRDIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVUxJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RVTElEXCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RVTElELmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdWxpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWxpZChab2RVTElELCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFhJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RYSURcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZFhJRC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHhpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5feGlkKFpvZFhJRCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RLU1VJRCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RLU1VJRFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kS1NVSUQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBrc3VpZChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fa3N1aWQoWm9kS1NVSUQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSVB2NCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RJUHY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgLy8gWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBjb3JlLiRab2RJUHY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gaXB2NChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faXB2NChab2RJUHY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZElQdjYgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSVB2NlwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSVB2Ni5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlwdjYocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2lwdjYoWm9kSVB2NiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RDSURSdjQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ0lEUnY0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQ0lEUnY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY2lkcnY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9jaWRydjQoWm9kQ0lEUnY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZENJRFJ2NiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDSURSdjZcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDSURSdjYuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBjaWRydjYocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2NpZHJ2Nihab2RDSURSdjYsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQmFzZTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJhc2U2NFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQmFzZTY0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9iYXNlNjQoWm9kQmFzZTY0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEJhc2U2NFVSTCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RCYXNlNjRVUkxcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEJhc2U2NFVSTC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NHVybChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmFzZTY0dXJsKFpvZEJhc2U2NFVSTCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RFMTY0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEUxNjRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEUxNjQuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBlMTY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9lMTY0KFpvZEUxNjQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kSldUID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEpXVFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIC8vIFpvZFN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kSldULmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gand0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9qd3QoWm9kSldULCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDdXN0b21TdHJpbmdGb3JtYXRcIiwgKGluc3QsIGRlZik9PntcbiAgICAvLyBab2RTdHJpbmdGb3JtYXQuaW5pdChpbnN0LCBkZWYpO1xuICAgIGNvcmUuJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kU3RyaW5nRm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdChmb3JtYXQsIGZuT3JSZWdleCwgX3BhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIGZvcm1hdCwgZm5PclJlZ2V4LCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBob3N0bmFtZShfcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIFwiaG9zdG5hbWVcIiwgY29yZS5yZWdleGVzLmhvc3RuYW1lLCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoZXgoX3BhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9zdHJpbmdGb3JtYXQoWm9kQ3VzdG9tU3RyaW5nRm9ybWF0LCBcImhleFwiLCBjb3JlLnJlZ2V4ZXMuaGV4LCBfcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKGFsZywgcGFyYW1zKSB7XG4gICAgY29uc3QgZW5jID0gcGFyYW1zPy5lbmMgPz8gXCJoZXhcIjtcbiAgICBjb25zdCBmb3JtYXQgPSBgJHthbGd9XyR7ZW5jfWA7XG4gICAgY29uc3QgcmVnZXggPSBjb3JlLnJlZ2V4ZXNbZm9ybWF0XTtcbiAgICBpZiAoIXJlZ2V4KSB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBoYXNoIGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gICAgcmV0dXJuIGNvcmUuX3N0cmluZ0Zvcm1hdChab2RDdXN0b21TdHJpbmdGb3JtYXQsIGZvcm1hdCwgcmVnZXgsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVtYmVyID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bWJlclwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bWJlci5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5ndCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QuZ3RlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWluID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHQgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmx0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0LmludCA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGludChwYXJhbXMpKTtcbiAgICBpbnN0LnNhZmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhpbnQocGFyYW1zKSk7XG4gICAgaW5zdC5wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSgwLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KDAsIHBhcmFtcykpO1xuICAgIGluc3Qubm9ucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHRlKDAsIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5zdGVwID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5tdWx0aXBsZU9mKHZhbHVlLCBwYXJhbXMpKTtcbiAgICAvLyBpbnN0LmZpbml0ZSA9IChwYXJhbXMpID0+IGluc3QuY2hlY2soY29yZS5maW5pdGUocGFyYW1zKSk7XG4gICAgaW5zdC5maW5pdGUgPSAoKT0+aW5zdDtcbiAgICBjb25zdCBiYWcgPSBpbnN0Ll96b2QuYmFnO1xuICAgIGluc3QubWluVmFsdWUgPSBNYXRoLm1heChiYWcubWluaW11bSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIGJhZy5leGNsdXNpdmVNaW5pbXVtID8/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gTWF0aC5taW4oYmFnLm1heGltdW0gPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBiYWcuZXhjbHVzaXZlTWF4aW11bSA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpID8/IG51bGw7XG4gICAgaW5zdC5pc0ludCA9IChiYWcuZm9ybWF0ID8/IFwiXCIpLmluY2x1ZGVzKFwiaW50XCIpIHx8IE51bWJlci5pc1NhZmVJbnRlZ2VyKGJhZy5tdWx0aXBsZU9mID8/IDAuNSk7XG4gICAgaW5zdC5pc0Zpbml0ZSA9IHRydWU7XG4gICAgaW5zdC5mb3JtYXQgPSBiYWcuZm9ybWF0ID8/IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX251bWJlcihab2ROdW1iZXIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kTnVtYmVyRm9ybWF0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE51bWJlckZvcm1hdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bWJlckZvcm1hdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kTnVtYmVyLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDMyKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9mbG9hdDY0KFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5faW50MzIoWm9kTnVtYmVyRm9ybWF0LCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVpbnQzMihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fdWludDMyKFpvZE51bWJlckZvcm1hdCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCb29sZWFuID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZEJvb2xlYW5cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RCb29sZWFuLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW4ocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2Jvb2xlYW4oWm9kQm9vbGVhbiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCaWdJbnQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmlnSW50XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQmlnSW50LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0Lmd0ZSA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1pbiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3RlKHZhbHVlLCBwYXJhbXMpKTtcbiAgICBpbnN0Lmd0ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5ndCh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ndGUgPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5sdCA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubHQodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubHRlID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QubWF4ID0gKHZhbHVlLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUodmFsdWUsIHBhcmFtcykpO1xuICAgIGluc3QucG9zaXRpdmUgPSAocGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MuZ3QoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0KEJpZ0ludCgwKSwgcGFyYW1zKSk7XG4gICAgaW5zdC5ub25wb3NpdGl2ZSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5sdGUoQmlnSW50KDApLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbm5lZ2F0aXZlID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZShCaWdJbnQoMCksIHBhcmFtcykpO1xuICAgIGluc3QubXVsdGlwbGVPZiA9ICh2YWx1ZSwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubXVsdGlwbGVPZih2YWx1ZSwgcGFyYW1zKSk7XG4gICAgY29uc3QgYmFnID0gaW5zdC5fem9kLmJhZztcbiAgICBpbnN0Lm1pblZhbHVlID0gYmFnLm1pbmltdW0gPz8gbnVsbDtcbiAgICBpbnN0Lm1heFZhbHVlID0gYmFnLm1heGltdW0gPz8gbnVsbDtcbiAgICBpbnN0LmZvcm1hdCA9IGJhZy5mb3JtYXQgPz8gbnVsbDtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGJpZ2ludChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fYmlnaW50KFpvZEJpZ0ludCwgcGFyYW1zKTtcbn1cbmV4cG9ydCBjb25zdCBab2RCaWdJbnRGb3JtYXQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQmlnSW50Rm9ybWF0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kQmlnSW50Rm9ybWF0LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RCaWdJbnQuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLyBpbnQ2NFxuZXhwb3J0IGZ1bmN0aW9uIGludDY0KHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9pbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG4vLyB1aW50NjRcbmV4cG9ydCBmdW5jdGlvbiB1aW50NjQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VpbnQ2NChab2RCaWdJbnRGb3JtYXQsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kU3ltYm9sID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN5bWJvbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFN5bWJvbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBzeW1ib2wocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3N5bWJvbChab2RTeW1ib2wsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVW5kZWZpbmVkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVuZGVmaW5lZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFVuZGVmaW5lZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmZ1bmN0aW9uIF91bmRlZmluZWQocGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX3VuZGVmaW5lZChab2RVbmRlZmluZWQsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfdW5kZWZpbmVkIGFzIHVuZGVmaW5lZCB9O1xuZXhwb3J0IGNvbnN0IFpvZE51bGwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTnVsbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bGwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5mdW5jdGlvbiBfbnVsbChwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbnVsbChab2ROdWxsLCBwYXJhbXMpO1xufVxuZXhwb3J0IHsgX251bGwgYXMgbnVsbCB9O1xuZXhwb3J0IGNvbnN0IFpvZEFueSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RBbnlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RBbnkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYW55KCkge1xuICAgIHJldHVybiBjb3JlLl9hbnkoWm9kQW55KTtcbn1cbmV4cG9ydCBjb25zdCBab2RVbmtub3duID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVua25vd25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RVbmtub3duLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHVua25vd24oKSB7XG4gICAgcmV0dXJuIGNvcmUuX3Vua25vd24oWm9kVW5rbm93bik7XG59XG5leHBvcnQgY29uc3QgWm9kTmV2ZXIgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTmV2ZXJcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROZXZlci5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBuZXZlcihwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fbmV2ZXIoWm9kTmV2ZXIsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kVm9pZCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RWb2lkXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVm9pZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmZ1bmN0aW9uIF92b2lkKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl92b2lkKFpvZFZvaWQsIHBhcmFtcyk7XG59XG5leHBvcnQgeyBfdm9pZCBhcyB2b2lkIH07XG5leHBvcnQgY29uc3QgWm9kRGF0ZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REYXRlXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGF0ZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5taW4gPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmd0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAodmFsdWUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLmx0ZSh2YWx1ZSwgcGFyYW1zKSk7XG4gICAgY29uc3QgYyA9IGluc3QuX3pvZC5iYWc7XG4gICAgaW5zdC5taW5EYXRlID0gYy5taW5pbXVtID8gbmV3IERhdGUoYy5taW5pbXVtKSA6IG51bGw7XG4gICAgaW5zdC5tYXhEYXRlID0gYy5tYXhpbXVtID8gbmV3IERhdGUoYy5tYXhpbXVtKSA6IG51bGw7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBkYXRlKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9kYXRlKFpvZERhdGUsIHBhcmFtcyk7XG59XG5leHBvcnQgY29uc3QgWm9kQXJyYXkgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQXJyYXlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RBcnJheS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5lbGVtZW50ID0gZGVmLmVsZW1lbnQ7XG4gICAgaW5zdC5taW4gPSAobWluTGVuZ3RoLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNoZWNrcy5taW5MZW5ndGgobWluTGVuZ3RoLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm5vbmVtcHR5ID0gKHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1pbkxlbmd0aCgxLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9IChtYXhMZW5ndGgsIHBhcmFtcyk9Pmluc3QuY2hlY2soY2hlY2tzLm1heExlbmd0aChtYXhMZW5ndGgsIHBhcmFtcykpO1xuICAgIGluc3QubGVuZ3RoID0gKGxlbiwgcGFyYW1zKT0+aW5zdC5jaGVjayhjaGVja3MubGVuZ3RoKGxlbiwgcGFyYW1zKSk7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5lbGVtZW50O1xufSk7XG5leHBvcnQgZnVuY3Rpb24gYXJyYXkoZWxlbWVudCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIGNvcmUuX2FycmF5KFpvZEFycmF5LCBlbGVtZW50LCBwYXJhbXMpO1xufVxuLy8gLmtleW9mXG5leHBvcnQgZnVuY3Rpb24ga2V5b2Yoc2NoZW1hKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBzY2hlbWEuX3pvZC5kZWYuc2hhcGU7XG4gICAgcmV0dXJuIF9lbnVtKE9iamVjdC5rZXlzKHNoYXBlKSk7XG59XG5leHBvcnQgY29uc3QgWm9kT2JqZWN0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE9iamVjdFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE9iamVjdEpJVC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgdXRpbC5kZWZpbmVMYXp5KGluc3QsIFwic2hhcGVcIiwgKCk9PntcbiAgICAgICAgcmV0dXJuIGRlZi5zaGFwZTtcbiAgICB9KTtcbiAgICBpbnN0LmtleW9mID0gKCk9Pl9lbnVtKE9iamVjdC5rZXlzKGluc3QuX3pvZC5kZWYuc2hhcGUpKTtcbiAgICBpbnN0LmNhdGNoYWxsID0gKGNhdGNoYWxsKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsXG4gICAgICAgIH0pO1xuICAgIGluc3QucGFzc3Rocm91Z2ggPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKVxuICAgICAgICB9KTtcbiAgICBpbnN0Lmxvb3NlID0gKCk9Pmluc3QuY2xvbmUoe1xuICAgICAgICAgICAgLi4uaW5zdC5fem9kLmRlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiB1bmtub3duKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpY3QgPSAoKT0+aW5zdC5jbG9uZSh7XG4gICAgICAgICAgICAuLi5pbnN0Ll96b2QuZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG5ldmVyKClcbiAgICAgICAgfSk7XG4gICAgaW5zdC5zdHJpcCA9ICgpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIGluc3QuZXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5leHRlbmQoaW5zdCwgaW5jb21pbmcpO1xuICAgIH07XG4gICAgaW5zdC5zYWZlRXh0ZW5kID0gKGluY29taW5nKT0+e1xuICAgICAgICByZXR1cm4gdXRpbC5zYWZlRXh0ZW5kKGluc3QsIGluY29taW5nKTtcbiAgICB9O1xuICAgIGluc3QubWVyZ2UgPSAob3RoZXIpPT51dGlsLm1lcmdlKGluc3QsIG90aGVyKTtcbiAgICBpbnN0LnBpY2sgPSAobWFzayk9PnV0aWwucGljayhpbnN0LCBtYXNrKTtcbiAgICBpbnN0Lm9taXQgPSAobWFzayk9PnV0aWwub21pdChpbnN0LCBtYXNrKTtcbiAgICBpbnN0LnBhcnRpYWwgPSAoLi4uYXJncyk9PnV0aWwucGFydGlhbChab2RPcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG4gICAgaW5zdC5yZXF1aXJlZCA9ICguLi5hcmdzKT0+dXRpbC5yZXF1aXJlZChab2ROb25PcHRpb25hbCwgaW5zdCwgYXJnc1swXSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Qoc2hhcGUsIHBhcmFtcykge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgc2hhcGU6IHNoYXBlID8/IHt9LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdChkZWYpO1xufVxuLy8gc3RyaWN0T2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0T2JqZWN0KHNoYXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBjYXRjaGFsbDogbmV2ZXIoKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gbG9vc2VPYmplY3RcbmV4cG9ydCBmdW5jdGlvbiBsb29zZU9iamVjdChzaGFwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgY2F0Y2hhbGw6IHVua25vd24oKSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFVuaW9uID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFVuaW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVW5pb24uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3Qub3B0aW9ucyA9IGRlZi5vcHRpb25zO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdW5pb24ob3B0aW9ucywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmlvbih7XG4gICAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZERpc2NyaW1pbmF0ZWRVbmlvbiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REaXNjcmltaW5hdGVkVW5pb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBab2RVbmlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kRGlzY3JpbWluYXRlZFVuaW9uLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyaW1pbmF0ZWRVbmlvbihkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAvLyBjb25zdCBbb3B0aW9ucywgcGFyYW1zXSA9IGFyZ3M7XG4gICAgcmV0dXJuIG5ldyBab2REaXNjcmltaW5hdGVkVW5pb24oe1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RJbnRlcnNlY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kSW50ZXJzZWN0aW9uXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kSW50ZXJzZWN0aW9uLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kVHVwbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVHVwbGVcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUdXBsZS5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5yZXN0ID0gKHJlc3QpPT5pbnN0LmNsb25lKHtcbiAgICAgICAgICAgIC4uLmluc3QuX3pvZC5kZWYsXG4gICAgICAgICAgICByZXN0OiByZXN0XG4gICAgICAgIH0pO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gdHVwbGUoaXRlbXMsIF9wYXJhbXNPclJlc3QsIF9wYXJhbXMpIHtcbiAgICBjb25zdCBoYXNSZXN0ID0gX3BhcmFtc09yUmVzdCBpbnN0YW5jZW9mIGNvcmUuJFpvZFR5cGU7XG4gICAgY29uc3QgcGFyYW1zID0gaGFzUmVzdCA/IF9wYXJhbXMgOiBfcGFyYW1zT3JSZXN0O1xuICAgIGNvbnN0IHJlc3QgPSBoYXNSZXN0ID8gX3BhcmFtc09yUmVzdCA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIHR5cGU6IFwidHVwbGVcIixcbiAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICByZXN0LFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUmVjb3JkID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFJlY29yZFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFJlY29yZC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5rZXlUeXBlID0gZGVmLmtleVR5cGU7XG4gICAgaW5zdC52YWx1ZVR5cGUgPSBkZWYudmFsdWVUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICB0eXBlOiBcInJlY29yZFwiLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuLy8gdHlwZSBhbGtzamYgPSBjb3JlLm91dHB1dDxjb3JlLiRab2RSZWNvcmRLZXk+O1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpYWxSZWNvcmQoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICBjb25zdCBrID0gY29yZS5jbG9uZShrZXlUeXBlKTtcbiAgICBrLl96b2QudmFsdWVzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZTogayxcbiAgICAgICAgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RNYXAgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kTWFwXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTWFwLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LmtleVR5cGUgPSBkZWYua2V5VHlwZTtcbiAgICBpbnN0LnZhbHVlVHlwZSA9IGRlZi52YWx1ZVR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBtYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHR5cGU6IFwibWFwXCIsXG4gICAgICAgIGtleVR5cGU6IGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZTogdmFsdWVUeXBlLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kU2V0ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFNldFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFNldC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC5taW4gPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5ub25lbXB0eSA9IChwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pblNpemUoMSwgcGFyYW1zKSk7XG4gICAgaW5zdC5tYXggPSAoLi4uYXJncyk9Pmluc3QuY2hlY2soY29yZS5fbWF4U2l6ZSguLi5hcmdzKSk7XG4gICAgaW5zdC5zaXplID0gKC4uLmFyZ3MpPT5pbnN0LmNoZWNrKGNvcmUuX3NpemUoLi4uYXJncykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gc2V0KHZhbHVlVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICB2YWx1ZVR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEVudW0gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRW51bVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEVudW0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuZW51bSA9IGRlZi5lbnRyaWVzO1xuICAgIGluc3Qub3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoZGVmLmVudHJpZXMpO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGRlZi5lbnRyaWVzKSk7XG4gICAgaW5zdC5leHRyYWN0ID0gKHZhbHVlcywgcGFyYW1zKT0+e1xuICAgICAgICBjb25zdCBuZXdFbnRyaWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbiAgICAgICAgICAgIGlmIChrZXlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdFbnRyaWVzW3ZhbHVlXSA9IGRlZi5lbnRyaWVzW3ZhbHVlXTtcbiAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYEtleSAke3ZhbHVlfSBub3QgZm91bmQgaW4gZW51bWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgICAgIGVudHJpZXM6IG5ld0VudHJpZXNcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbnN0LmV4Y2x1ZGUgPSAodmFsdWVzLCBwYXJhbXMpPT57XG4gICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSB7XG4gICAgICAgICAgICAuLi5kZWYuZW50cmllc1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG4gICAgICAgICAgICBpZiAoa2V5cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld0VudHJpZXNbdmFsdWVdO1xuICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7dmFsdWV9IG5vdCBmb3VuZCBpbiBlbnVtYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICAgIGNoZWNrczogW10sXG4gICAgICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgZW50cmllczogbmV3RW50cmllc1xuICAgICAgICB9KTtcbiAgICB9O1xufSk7XG5mdW5jdGlvbiBfZW51bSh2YWx1ZXMsIHBhcmFtcykge1xuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyBPYmplY3QuZnJvbUVudHJpZXModmFsdWVzLm1hcCgodik9PltcbiAgICAgICAgICAgIHYsXG4gICAgICAgICAgICB2XG4gICAgICAgIF0pKSA6IHZhbHVlcztcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IHsgX2VudW0gYXMgZW51bSB9O1xuLyoqIEBkZXByZWNhdGVkIFRoaXMgQVBJIGhhcyBiZWVuIG1lcmdlZCBpbnRvIGB6LmVudW0oKWAuIFVzZSBgei5lbnVtKClgIGluc3RlYWQuXG4gKlxuICogYGBgdHNcbiAqIGVudW0gQ29sb3JzIHsgcmVkLCBncmVlbiwgYmx1ZSB9XG4gKiB6LmVudW0oQ29sb3JzKTtcbiAqIGBgYFxuICovIGV4cG9ydCBmdW5jdGlvbiBuYXRpdmVFbnVtKGVudHJpZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgICAuLi51dGlsLm5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kTGl0ZXJhbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kTGl0ZXJhbC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC52YWx1ZXMgPSBuZXcgU2V0KGRlZi52YWx1ZXMpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0LCBcInZhbHVlXCIsIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgIGlmIChkZWYudmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNjaGVtYSBjb250YWlucyBtdWx0aXBsZSB2YWxpZCBsaXRlcmFsIHZhbHVlcy4gVXNlIGAudmFsdWVzYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWYudmFsdWVzWzBdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsKHZhbHVlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgXSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZEZpbGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRmlsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZEZpbGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QubWluID0gKHNpemUsIHBhcmFtcyk9Pmluc3QuY2hlY2soY29yZS5fbWluU2l6ZShzaXplLCBwYXJhbXMpKTtcbiAgICBpbnN0Lm1heCA9IChzaXplLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21heFNpemUoc2l6ZSwgcGFyYW1zKSk7XG4gICAgaW5zdC5taW1lID0gKHR5cGVzLCBwYXJhbXMpPT5pbnN0LmNoZWNrKGNvcmUuX21pbWUoQXJyYXkuaXNBcnJheSh0eXBlcykgPyB0eXBlcyA6IFtcbiAgICAgICAgICAgIHR5cGVzXG4gICAgICAgIF0sIHBhcmFtcykpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZmlsZShwYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fZmlsZShab2RGaWxlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFRyYW5zZm9ybSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RUcmFuc2Zvcm1cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RUcmFuc2Zvcm0uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuX3pvZC5wYXJzZSA9IChwYXlsb2FkLCBfY3R4KT0+e1xuICAgICAgICBpZiAoX2N0eC5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuJFpvZEVuY29kZUVycm9yKGluc3QuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC5hZGRJc3N1ZSA9IChpc3N1ZSk9PntcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoaXNzdWUsIHBheWxvYWQudmFsdWUsIGRlZikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgWm9kIDMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBjb25zdCBfaXNzdWUgPSBpc3N1ZTtcbiAgICAgICAgICAgICAgICBpZiAoX2lzc3VlLmZhdGFsKSBfaXNzdWUuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuY29kZSA/PyAoX2lzc3VlLmNvZGUgPSBcImN1c3RvbVwiKTtcbiAgICAgICAgICAgICAgICBfaXNzdWUuaW5wdXQgPz8gKF9pc3N1ZS5pbnB1dCA9IHBheWxvYWQudmFsdWUpO1xuICAgICAgICAgICAgICAgIF9pc3N1ZS5pbnN0ID8/IChfaXNzdWUuaW5zdCA9IGluc3QpO1xuICAgICAgICAgICAgICAgIC8vIF9pc3N1ZS5jb250aW51ZSA/Pz0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHV0aWwuaXNzdWUoX2lzc3VlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGRlZi50cmFuc2Zvcm0ocGF5bG9hZC52YWx1ZSwgcGF5bG9hZCk7XG4gICAgICAgIGlmIChvdXRwdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0LnRoZW4oKG91dHB1dCk9PntcbiAgICAgICAgICAgICAgICBwYXlsb2FkLnZhbHVlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5bG9hZC52YWx1ZSA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIHJldHVybiBuZXcgWm9kVHJhbnNmb3JtKHtcbiAgICAgICAgdHlwZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgdHJhbnNmb3JtOiBmblxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZE9wdGlvbmFsID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZE9wdGlvbmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kT3B0aW9uYWwuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWwoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7XG4gICAgICAgIHR5cGU6IFwib3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2ROdWxsYWJsZSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROdWxsYWJsZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE51bGxhYmxlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxhYmxlKGlubmVyVHlwZSkge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICB0eXBlOiBcIm51bGxhYmxlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG4vLyBudWxsaXNoXG5leHBvcnQgZnVuY3Rpb24gbnVsbGlzaChpbm5lclR5cGUpIHtcbiAgICByZXR1cm4gb3B0aW9uYWwobnVsbGFibGUoaW5uZXJUeXBlKSk7XG59XG5leHBvcnQgY29uc3QgWm9kRGVmYXVsdCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2REZWZhdWx0XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kRGVmYXVsdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG4gICAgaW5zdC5yZW1vdmVEZWZhdWx0ID0gaW5zdC51bndyYXA7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBfZGVmYXVsdChpbm5lclR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgIHR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICBpbm5lclR5cGU6IGlubmVyVHlwZSxcbiAgICAgICAgZ2V0IGRlZmF1bHRWYWx1ZSAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbHVlKCkgOiB1dGlsLnNoYWxsb3dDbG9uZShkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kUHJlZmF1bHQgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUHJlZmF1bHRcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RQcmVmYXVsdC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBwcmVmYXVsdChpbm5lclR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBuZXcgWm9kUHJlZmF1bHQoe1xuICAgICAgICB0eXBlOiBcInByZWZhdWx0XCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlLFxuICAgICAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0VmFsdWUoKSA6IHV0aWwuc2hhbGxvd0Nsb25lKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2ROb25PcHRpb25hbCA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROb25PcHRpb25hbFwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZE5vbk9wdGlvbmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIG5vbm9wdGlvbmFsKGlubmVyVHlwZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2ROb25PcHRpb25hbCh7XG4gICAgICAgIHR5cGU6IFwibm9ub3B0aW9uYWxcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RTdWNjZXNzID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFN1Y2Nlc3NcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RTdWNjZXNzLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3MoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RTdWNjZXNzKHtcbiAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kQ2F0Y2ggPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kQ2F0Y2hcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDYXRjaC5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgaW5zdC51bndyYXAgPSAoKT0+aW5zdC5fem9kLmRlZi5pbm5lclR5cGU7XG4gICAgaW5zdC5yZW1vdmVDYXRjaCA9IGluc3QudW53cmFwO1xufSk7XG5mdW5jdGlvbiBfY2F0Y2goaW5uZXJUeXBlLCBjYXRjaFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgIHR5cGU6IFwiY2F0Y2hcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGUsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBjYXRjaFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBjYXRjaFZhbHVlIDogKCk9PmNhdGNoVmFsdWVcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9jYXRjaCBhcyBjYXRjaCB9O1xuZXhwb3J0IGNvbnN0IFpvZE5hTiA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2ROYU5cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2ROYU4uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbmFuKHBhcmFtcykge1xuICAgIHJldHVybiBjb3JlLl9uYW4oWm9kTmFOLCBwYXJhbXMpO1xufVxuZXhwb3J0IGNvbnN0IFpvZFBpcGUgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kUGlwZVwiLCAoaW5zdCwgZGVmKT0+e1xuICAgIGNvcmUuJFpvZFBpcGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QuaW4gPSBkZWYuaW47XG4gICAgaW5zdC5vdXQgPSBkZWYub3V0O1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcGlwZShpbl8sIG91dCkge1xuICAgIHJldHVybiBuZXcgWm9kUGlwZSh7XG4gICAgICAgIHR5cGU6IFwicGlwZVwiLFxuICAgICAgICBpbjogaW5fLFxuICAgICAgICBvdXQ6IG91dFxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZENvZGVjID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZENvZGVjXCIsIChpbnN0LCBkZWYpPT57XG4gICAgWm9kUGlwZS5pbml0KGluc3QsIGRlZik7XG4gICAgY29yZS4kWm9kQ29kZWMuaW5pdChpbnN0LCBkZWYpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gY29kZWMoaW5fLCBvdXQsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kQ29kZWMoe1xuICAgICAgICB0eXBlOiBcInBpcGVcIixcbiAgICAgICAgaW46IGluXyxcbiAgICAgICAgb3V0OiBvdXQsXG4gICAgICAgIHRyYW5zZm9ybTogcGFyYW1zLmRlY29kZSxcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybTogcGFyYW1zLmVuY29kZVxuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IFpvZFJlYWRvbmx5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFJlYWRvbmx5XCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kUmVhZG9ubHkuaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xuICAgIGluc3QudW53cmFwID0gKCk9Pmluc3QuX3pvZC5kZWYuaW5uZXJUeXBlO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RSZWFkb25seSh7XG4gICAgICAgIHR5cGU6IFwicmVhZG9ubHlcIixcbiAgICAgICAgaW5uZXJUeXBlOiBpbm5lclR5cGVcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RUZW1wbGF0ZUxpdGVyYWwgPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kVGVtcGxhdGVMaXRlcmFsXCIsIChpbnN0LCBkZWYpPT57XG4gICAgY29yZS4kWm9kVGVtcGxhdGVMaXRlcmFsLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlTGl0ZXJhbChwYXJ0cywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RUZW1wbGF0ZUxpdGVyYWwoe1xuICAgICAgICB0eXBlOiBcInRlbXBsYXRlX2xpdGVyYWxcIixcbiAgICAgICAgcGFydHMsXG4gICAgICAgIC4uLnV0aWwubm9ybWFsaXplUGFyYW1zKHBhcmFtcylcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RMYXp5ID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZExhenlcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RMYXp5LmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmdldHRlcigpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gbGF6eShnZXR0ZXIpIHtcbiAgICByZXR1cm4gbmV3IFpvZExhenkoe1xuICAgICAgICB0eXBlOiBcImxhenlcIixcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXJcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBab2RQcm9taXNlID0gLypAX19QVVJFX18qLyBjb3JlLiRjb25zdHJ1Y3RvcihcIlpvZFByb21pc2VcIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RQcm9taXNlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBab2RUeXBlLmluaXQoaW5zdCwgZGVmKTtcbiAgICBpbnN0LnVud3JhcCA9ICgpPT5pbnN0Ll96b2QuZGVmLmlubmVyVHlwZTtcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2UoaW5uZXJUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogXCJwcm9taXNlXCIsXG4gICAgICAgIGlubmVyVHlwZTogaW5uZXJUeXBlXG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgWm9kRnVuY3Rpb24gPSAvKkBfX1BVUkVfXyovIGNvcmUuJGNvbnN0cnVjdG9yKFwiWm9kRnVuY3Rpb25cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RGdW5jdGlvbi5pbml0KGluc3QsIGRlZik7XG4gICAgWm9kVHlwZS5pbml0KGluc3QsIGRlZik7XG59KTtcbmV4cG9ydCBmdW5jdGlvbiBfZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgaW5wdXQ6IEFycmF5LmlzQXJyYXkocGFyYW1zPy5pbnB1dCkgPyB0dXBsZShwYXJhbXM/LmlucHV0KSA6IHBhcmFtcz8uaW5wdXQgPz8gYXJyYXkodW5rbm93bigpKSxcbiAgICAgICAgb3V0cHV0OiBwYXJhbXM/Lm91dHB1dCA/PyB1bmtub3duKClcbiAgICB9KTtcbn1cbmV4cG9ydCB7IF9mdW5jdGlvbiBhcyBmdW5jdGlvbiB9O1xuZXhwb3J0IGNvbnN0IFpvZEN1c3RvbSA9IC8qQF9fUFVSRV9fKi8gY29yZS4kY29uc3RydWN0b3IoXCJab2RDdXN0b21cIiwgKGluc3QsIGRlZik9PntcbiAgICBjb3JlLiRab2RDdXN0b20uaW5pdChpbnN0LCBkZWYpO1xuICAgIFpvZFR5cGUuaW5pdChpbnN0LCBkZWYpO1xufSk7XG4vLyBjdXN0b20gY2hlY2tzXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soZm4pIHtcbiAgICBjb25zdCBjaCA9IG5ldyBjb3JlLiRab2RDaGVjayh7XG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiXG4gICAgfSk7XG4gICAgY2guX3pvZC5jaGVjayA9IGZuO1xuICAgIHJldHVybiBjaDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b20oZm4sIF9wYXJhbXMpIHtcbiAgICByZXR1cm4gY29yZS5fY3VzdG9tKFpvZEN1c3RvbSwgZm4gPz8gKCgpPT50cnVlKSwgX3BhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVmaW5lKGZuLCBfcGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gY29yZS5fcmVmaW5lKFpvZEN1c3RvbSwgZm4sIF9wYXJhbXMpO1xufVxuLy8gc3VwZXJSZWZpbmVcbmV4cG9ydCBmdW5jdGlvbiBzdXBlclJlZmluZShmbikge1xuICAgIHJldHVybiBjb3JlLl9zdXBlclJlZmluZShmbik7XG59XG5mdW5jdGlvbiBfaW5zdGFuY2VvZihjbHMsIHBhcmFtcyA9IHtcbiAgICBlcnJvcjogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWBcbn0pIHtcbiAgICBjb25zdCBpbnN0ID0gbmV3IFpvZEN1c3RvbSh7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIGNoZWNrOiBcImN1c3RvbVwiLFxuICAgICAgICBmbjogKGRhdGEpPT5kYXRhIGluc3RhbmNlb2YgY2xzLFxuICAgICAgICBhYm9ydDogdHJ1ZSxcbiAgICAgICAgLi4udXRpbC5ub3JtYWxpemVQYXJhbXMocGFyYW1zKVxuICAgIH0pO1xuICAgIGluc3QuX3pvZC5iYWcuQ2xhc3MgPSBjbHM7XG4gICAgcmV0dXJuIGluc3Q7XG59XG5leHBvcnQgeyBfaW5zdGFuY2VvZiBhcyBpbnN0YW5jZW9mIH07XG4vLyBzdHJpbmdib29sXG5leHBvcnQgY29uc3Qgc3RyaW5nYm9vbCA9ICguLi5hcmdzKT0+Y29yZS5fc3RyaW5nYm9vbCh7XG4gICAgICAgIENvZGVjOiBab2RDb2RlYyxcbiAgICAgICAgQm9vbGVhbjogWm9kQm9vbGVhbixcbiAgICAgICAgU3RyaW5nOiBab2RTdHJpbmdcbiAgICB9LCAuLi5hcmdzKTtcbmV4cG9ydCBmdW5jdGlvbiBqc29uKHBhcmFtcykge1xuICAgIGNvbnN0IGpzb25TY2hlbWEgPSBsYXp5KCgpPT57XG4gICAgICAgIHJldHVybiB1bmlvbihbXG4gICAgICAgICAgICBzdHJpbmcocGFyYW1zKSxcbiAgICAgICAgICAgIG51bWJlcigpLFxuICAgICAgICAgICAgYm9vbGVhbigpLFxuICAgICAgICAgICAgX251bGwoKSxcbiAgICAgICAgICAgIGFycmF5KGpzb25TY2hlbWEpLFxuICAgICAgICAgICAgcmVjb3JkKHN0cmluZygpLCBqc29uU2NoZW1hKVxuICAgICAgICBdKTtcbiAgICB9KTtcbiAgICByZXR1cm4ganNvblNjaGVtYTtcbn1cbi8vIHByZXByb2Nlc3Ncbi8vIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHoucGlwZSgpYCBhbmQgYHoudHJhbnNmb3JtKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzcyhmbiwgc2NoZW1hKSB7XG4gICAgcmV0dXJuIHBpcGUodHJhbnNmb3JtKGZuKSwgc2NoZW1hKTtcbn1cbiIsICJpbXBvcnQgeyBkZWZpbmVIb29rLCBnZXRXcml0YWJsZSB9IGZyb20gJ3dvcmtmbG93JztcbmltcG9ydCAqIGFzIHogZnJvbSAnem9kJztcbi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wid29ya2Zsb3dzL2hvb2tzLnRzXCI6e1wiY29sbGVjdFdpdGhIb29rXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCJ9fX0sXCJzdGVwc1wiOntcIndvcmtmbG93cy9ob29rcy50c1wiOntcIndyaXRlRXZlbnRcIjp7XCJzdGVwSWRcIjpcInN0ZXAvL3dvcmtmbG93cy9ob29rcy50cy8vd3JpdGVFdmVudFwifX19fSovO1xuZXhwb3J0IGNvbnN0IEhvb2sgPSBkZWZpbmVIb29rKHtcbiAgICBzY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgZGF0YTogei5zdHJpbmcoKSxcbiAgICAgICAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWV0YWRhdGE6IHoudW5rbm93bigpXG4gICAgfSlcbn0pO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXaXRoSG9vayh0b2tlbiwgY3VzdG9tRGF0YSkge1xuICAgIGNvbnN0IGhvb2sgPSBIb29rLmNyZWF0ZSh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgY3VzdG9tRGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29sbGVjdGVkID0gW107XG4gICAgY29uc3Qgd2YgPSBnZXRXcml0YWJsZSgpO1xuICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rQ3JlYXRlZCcpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgaG9vayl7XG4gICAgICAgIGF3YWl0IHdyaXRlRXZlbnQod2YsICdob29rUmVzdW1lZCcsIGV2ZW50KTtcbiAgICAgICAgY29sbGVjdGVkLnB1c2goZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQuZG9uZSkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbGxlY3RlZFxuICAgIH07XG59XG5jb2xsZWN0V2l0aEhvb2sud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9ob29rcy50cy8vY29sbGVjdFdpdGhIb29rXCIsIGNvbGxlY3RXaXRoSG9vayk7XG52YXIgd3JpdGVFdmVudCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9ob29rcy50cy8vd3JpdGVFdmVudFwiKTtcbiIsICIvKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcIndvcmtmbG93cy9hZGRpdGlvbi50c1wiOntcImFkZGl0aW9uXCI6e1wid29ya2Zsb3dJZFwiOlwid29ya2Zsb3cvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkaXRpb25cIn19fSxcInN0ZXBzXCI6e1wid29ya2Zsb3dzL2FkZGl0aW9uLnRzXCI6e1wiYWRkXCI6e1wic3RlcElkXCI6XCJzdGVwLy93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZFwifX19fSovO1xudmFyIGFkZCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkXCIpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZGl0aW9uKG51bSwgbnVtMikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkZChudW0sIG51bTIpO1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgcmVzdWx0XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmFkZGl0aW9uLndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly93b3JrZmxvd3MvYWRkaXRpb24udHMvL2FkZGl0aW9uXCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvL3dvcmtmbG93cy9hZGRpdGlvbi50cy8vYWRkaXRpb25cIiwgYWRkaXRpb24pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsd0VBQUFBLFNBQUE7QUFBQTtBQUVJLFFBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFhUixJQUFBQSxRQUFPLFVBQVUsU0FBUyxLQUFLLFNBQVM7QUFDeEMsZ0JBQVUsV0FBVyxDQUFDO0FBQ3RCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3JDLGVBQU9DLE9BQU0sR0FBRztBQUFBLE1BQ3BCLFdBQVcsU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQzNDLGVBQU8sUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ3JEO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMERBQTBELEtBQUssVUFBVSxHQUFHLENBQUM7QUFBQSxJQUNqRztBQU9JLGFBQVNBLE9BQU0sS0FBSztBQUNwQixZQUFNLE9BQU8sR0FBRztBQUNoQixVQUFJLElBQUksU0FBUyxLQUFLO0FBQ2xCO0FBQUEsTUFDSjtBQUNBLFVBQUksUUFBUSxtSUFBbUksS0FBSyxHQUFHO0FBQ3ZKLFVBQUksQ0FBQyxPQUFPO0FBQ1I7QUFBQSxNQUNKO0FBQ0EsVUFBSSxJQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDM0IsVUFBSSxRQUFRLE1BQU0sQ0FBQyxLQUFLLE1BQU0sWUFBWTtBQUMxQyxjQUFPLE1BQUs7QUFBQSxRQUNSLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFB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QU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFUZ0I7QUFVVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFUZ0I7QUFVVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFUZ0I7QUFVVCxTQUFTLEtBQUtBLFFBQU8sUUFBUTtBQUNoQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTQyxRQUFPRCxRQUFPLFFBQVE7QUFDbEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCLE9BQUFDLFNBQUE7QUFTVCxTQUFTLFFBQVFELFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE9BQU9BLFFBQU8sUUFBUTtBQUNsQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLEtBQUtBLFFBQU8sUUFBUTtBQUNoQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE9BQU9BLFFBQU8sUUFBUTtBQUNsQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFFBQVFBLFFBQU8sUUFBUTtBQUNuQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLFdBQVdBLFFBQU8sUUFBUTtBQUN0QyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLE1BQU1BLFFBQU8sUUFBUTtBQUNqQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFTVCxTQUFTLEtBQUtBLFFBQU8sUUFBUTtBQUNoQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFSZ0I7QUFnQlQsU0FBUyxhQUFhRSxRQUFPLFFBQVE7QUFDeEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBVmdCO0FBV1QsU0FBUyxTQUFTQSxRQUFPLFFBQVE7QUFDcEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUGdCO0FBUVQsU0FBUyxTQUFTQSxRQUFPLFFBQVE7QUFDcEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUmdCO0FBU1QsU0FBUyxhQUFhQSxRQUFPLFFBQVE7QUFDeEMsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsRUFDbEMsQ0FBQztBQUNMO0FBUGdCO0FBb0VULFNBQVMsU0FBU0MsUUFBTyxRQUFRO0FBQ3BDLFNBQU8sSUFBSUEsT0FBTTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDTDtBQUxnQjtBQW1FVCxTQUFTLFNBQVNDLFFBQU87QUFDNUIsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsRUFDVixDQUFDO0FBQ0w7QUFKZ0I7QUFLVCxTQUFTLE9BQU9BLFFBQU8sUUFBUTtBQUNsQyxTQUFPLElBQUlBLE9BQU07QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFMZ0I7QUE0R1QsU0FBUyxXQUFXLFNBQVMsUUFBUTtBQUN4QyxRQUFNLEtBQUssSUFBVyxtQkFBbUI7QUFBQSxJQUNyQyxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsSUFDOUI7QUFBQSxFQUNKLENBQUM7QUFDRCxTQUFPO0FBQ1g7QUFQZ0I7QUFRVCxTQUFTLFdBQVcsU0FBUyxRQUFRO0FBQ3hDLFNBQU8sSUFBVyxtQkFBbUI7QUFBQSxJQUNqQyxPQUFPO0FBQUEsSUFDUCxHQUFRLGdCQUFnQixNQUFNO0FBQUEsSUFDOUI7QUFBQSxFQUNKLENBQUM7QUFDTDtBQU5nQjtBQU9ULFNBQVMsUUFBUSxRQUFRLFFBQVE7QUFDcEMsU0FBTyxJQUFXLHNCQUFzQjtBQUFBLElBQ3BDLE9BQU87QUFBQSxJQUNQLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxJQUM5QjtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBTmdCO0FBT1QsU0FBUyxPQUFPLFNBQVMsUUFBUTtBQUNwQyxTQUFPLElBQVcsZUFBZTtBQUFBLElBQzdCLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxJQUM5QjtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBUGdCO0FBUVQsU0FBUyxXQUFXLFFBQVE7QUFDL0IsU0FBTyxJQUFXLG1CQUFtQjtBQUFBLElBQ2pDLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxFQUNsQyxDQUFDO0FBQ0w7QUFOZ0I7QUFPVCxTQUFTLFdBQVcsUUFBUTtBQUMvQixTQUFPLElBQVcsbUJBQW1CO0FBQUEsSUFDakMsT0FBTztBQUFBLElBQ1AsUUFBUTtBQUFBLElBQ1IsR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDTDtBQU5nQjtBQU9ULFNBQVMsVUFBVSxVQUFVLFFBQVE7QUFDeEMsU0FBTyxJQUFXLGtCQUFrQjtBQUFBLElBQ2hDLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLEdBQVEsZ0JBQWdCLE1BQU07QUFBQSxJQUM5QjtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBUGdCO0FBUVQsU0FBUyxZQUFZLFFBQVEsUUFBUTtBQUN4QyxTQUFPLElBQVcsb0JBQW9CO0FBQUEsSUFDbEMsT0FBTztBQUFBLElBQ1AsUUFBUTtBQUFBLElBQ1IsR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLElBQzlCO0FBQUEsRUFDSixDQUFDO0FBQ0w7QUFQZ0I7QUFRVCxTQUFTLFVBQVUsUUFBUSxRQUFRO0FBQ3RDLFNBQU8sSUFBVyxrQkFBa0I7QUFBQSxJQUNoQyxPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixHQUFRLGdCQUFnQixNQUFNO0FBQUEsSUFDOUI7QUFBQSxFQUNKLENBQUM7QUFDTDtBQVBnQjtBQXVCVCxTQUFTLFdBQVcsSUFBSTtBQUMzQixTQUFPLElBQVcsbUJBQW1CO0FBQUEsSUFDakMsT0FBTztBQUFBLElBQ1A7QUFBQSxFQUNKLENBQUM7QUFDTDtBQUxnQjtBQU9ULFNBQVMsV0FBVyxNQUFNO0FBQzdCLFNBQU8sV0FBVyxDQUFDLFVBQVEsTUFBTSxVQUFVLElBQUksQ0FBQztBQUNwRDtBQUZnQjtBQUlULFNBQVMsUUFBUTtBQUNwQixTQUFPLFdBQVcsQ0FBQyxVQUFRLE1BQU0sS0FBSyxDQUFDO0FBQzNDO0FBRmdCO0FBSVQsU0FBUyxlQUFlO0FBQzNCLFNBQU8sV0FBVyxDQUFDLFVBQVEsTUFBTSxZQUFZLENBQUM7QUFDbEQ7QUFGZ0I7QUFJVCxTQUFTLGVBQWU7QUFDM0IsU0FBTyxXQUFXLENBQUMsVUFBUSxNQUFNLFlBQVksQ0FBQztBQUNsRDtBQUZnQjtBQUdULFNBQVMsT0FBT0MsUUFBTyxTQUFTLFFBQVE7QUFDM0MsU0FBTyxJQUFJQSxPQUFNO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDTDtBQVRnQjtBQW9OVCxTQUFTLFFBQVFDLFFBQU8sSUFBSSxTQUFTO0FBQ3hDLFFBQU0sU0FBUyxJQUFJQSxPQUFNO0FBQUEsSUFDckIsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1A7QUFBQSxJQUNBLEdBQVEsZ0JBQWdCLE9BQU87QUFBQSxFQUNuQyxDQUFDO0FBQ0QsU0FBTztBQUNYO0FBUmdCO0FBU1QsU0FBUyxhQUFhLElBQUk7QUFDN0IsUUFBTSxLQUFLLE9BQU8sQ0FBQyxZQUFVO0FBQ3pCLFlBQVEsV0FBVyxDQUFDQyxXQUFRO0FBQ3hCLFVBQUksT0FBT0EsV0FBVSxVQUFVO0FBQzNCLGdCQUFRLE9BQU8sS0FBVSxNQUFNQSxRQUFPLFFBQVEsT0FBTyxHQUFHLEtBQUssR0FBRyxDQUFDO0FBQUEsTUFDckUsT0FBTztBQUVILGNBQU0sU0FBU0E7QUFDZixZQUFJLE9BQU8sTUFBTyxRQUFPLFdBQVc7QUFDcEMsZUFBTyxTQUFTLE9BQU8sT0FBTztBQUM5QixlQUFPLFVBQVUsT0FBTyxRQUFRLFFBQVE7QUFDeEMsZUFBTyxTQUFTLE9BQU8sT0FBTztBQUM5QixlQUFPLGFBQWEsT0FBTyxXQUFXLENBQUMsR0FBRyxLQUFLLElBQUk7QUFDbkQsZ0JBQVEsT0FBTyxLQUFVLE1BQU0sTUFBTSxDQUFDO0FBQUEsTUFDMUM7QUFBQSxJQUNKO0FBQ0EsV0FBTyxHQUFHLFFBQVEsT0FBTyxPQUFPO0FBQUEsRUFDcEMsQ0FBQztBQUNELFNBQU87QUFDWDtBQW5CZ0I7QUFvQlQsU0FBUyxPQUFPLElBQUksUUFBUTtBQUMvQixRQUFNLEtBQUssSUFBVyxVQUFVO0FBQUEsSUFDNUIsT0FBTztBQUFBLElBQ1AsR0FBUSxnQkFBZ0IsTUFBTTtBQUFBLEVBQ2xDLENBQUM7QUFDRCxLQUFHLEtBQUssUUFBUTtBQUNoQixTQUFPO0FBQ1g7QUFQZ0I7OztBQzUwQlQsSUFBTSxpQkFBK0IsZ0JBQUssYUFBYSxrQkFBa0IsQ0FBQyxNQUFNLFFBQU07QUFDekYsRUFBSyxnQkFBZ0IsS0FBSyxNQUFNLEdBQUc7QUFDbkMsRUFBUSxnQkFBZ0IsS0FBSyxNQUFNLEdBQUc7QUFDMUMsQ0FBQztBQUNNLFNBQVNDLFVBQVMsUUFBUTtBQUM3QixTQUFZLGFBQWEsZ0JBQWdCLE1BQU07QUFDbkQ7QUFGZ0IsT0FBQUEsV0FBQTtBQUdULElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBQ2pGLEVBQUssWUFBWSxLQUFLLE1BQU0sR0FBRztBQUMvQixFQUFRLGdCQUFnQixLQUFLLE1BQU0sR0FBRztBQUMxQyxDQUFDO0FBQ00sU0FBU0MsTUFBSyxRQUFRO0FBQ3pCLFNBQVksU0FBUyxZQUFZLE1BQU07QUFDM0M7QUFGZ0IsT0FBQUEsT0FBQTtBQUdULElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBQ2pGLEVBQUssWUFBWSxLQUFLLE1BQU0sR0FBRztBQUMvQixFQUFRLGdCQUFnQixLQUFLLE1BQU0sR0FBRztBQUMxQyxDQUFDO0FBQ00sU0FBU0MsTUFBSyxRQUFRO0FBQ3pCLFNBQVksU0FBUyxZQUFZLE1BQU07QUFDM0M7QUFGZ0IsT0FBQUEsT0FBQTtBQUdULElBQU0saUJBQStCLGdCQUFLLGFBQWEsa0JBQWtCLENBQUMsTUFBTSxRQUFNO0FBQ3pGLEVBQUssZ0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ25DLEVBQVEsZ0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQzFDLENBQUM7QUFDTSxTQUFTQyxVQUFTLFFBQVE7QUFDN0IsU0FBWSxhQUFhLGdCQUFnQixNQUFNO0FBQ25EO0FBRmdCLE9BQUFBLFdBQUE7OztBQ3hCaEIsSUFBTUMsZUFBYyx3QkFBQyxNQUFNLFdBQVM7QUFDaEMsWUFBVSxLQUFLLE1BQU0sTUFBTTtBQUMzQixPQUFLLE9BQU87QUFDWixTQUFPLGlCQUFpQixNQUFNO0FBQUEsSUFDMUIsUUFBUTtBQUFBLE1BQ0osT0FBTyx3QkFBQyxXQUFjLFlBQVksTUFBTSxNQUFNLEdBQXZDO0FBQUEsSUFDWDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ0wsT0FBTyx3QkFBQyxXQUFjLGFBQWEsTUFBTSxNQUFNLEdBQXhDO0FBQUEsSUFDWDtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ04sT0FBTyx3QkFBQ0MsV0FBUTtBQUNaLGFBQUssT0FBTyxLQUFLQSxNQUFLO0FBQ3RCLGFBQUssVUFBVSxLQUFLLFVBQVUsS0FBSyxRQUFhLHVCQUF1QixDQUFDO0FBQUEsTUFDNUUsR0FITztBQUFBLElBSVg7QUFBQSxJQUNBLFdBQVc7QUFBQSxNQUNQLE9BQU8sd0JBQUNDLFlBQVM7QUFDYixhQUFLLE9BQU8sS0FBSyxHQUFHQSxPQUFNO0FBQzFCLGFBQUssVUFBVSxLQUFLLFVBQVUsS0FBSyxRQUFhLHVCQUF1QixDQUFDO0FBQUEsTUFDNUUsR0FITztBQUFBLElBSVg7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNMLE1BQU87QUFDSCxlQUFPLEtBQUssT0FBTyxXQUFXO0FBQUEsTUFDbEM7QUFBQSxJQUNKO0FBQUEsRUFDSixDQUFDO0FBTUwsR0FqQ29CO0FBa0NiLElBQU0sV0FBZ0IsYUFBYSxZQUFZRixZQUFXO0FBQzFELElBQU0sZUFBb0IsYUFBYSxZQUFZQSxjQUFhO0FBQUEsRUFDbkUsUUFBUTtBQUNaLENBQUM7OztBQ3RDTSxJQUFNRyxTQUF3QixnQkFBSyxPQUFPLFlBQVk7QUFDdEQsSUFBTUMsY0FBNkIsZ0JBQUssWUFBWSxZQUFZO0FBQ2hFLElBQU1DLGFBQTRCLGdCQUFLLFdBQVcsWUFBWTtBQUM5RCxJQUFNQyxrQkFBaUMsZ0JBQUssZ0JBQWdCLFlBQVk7QUFFeEUsSUFBTSxTQUF5QixnQkFBSyxRQUFRLFlBQVk7QUFDeEQsSUFBTSxTQUF5QixnQkFBSyxRQUFRLFlBQVk7QUFDeEQsSUFBTSxjQUE4QixnQkFBSyxhQUFhLFlBQVk7QUFDbEUsSUFBTSxjQUE4QixnQkFBSyxhQUFhLFlBQVk7QUFDbEUsSUFBTSxhQUE2QixnQkFBSyxZQUFZLFlBQVk7QUFDaEUsSUFBTSxhQUE2QixnQkFBSyxZQUFZLFlBQVk7QUFDaEUsSUFBTSxrQkFBa0MsZ0JBQUssaUJBQWlCLFlBQVk7QUFDMUUsSUFBTSxrQkFBa0MsZ0JBQUssaUJBQWlCLFlBQVk7OztBQ1QxRSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUMzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsT0FBSyxNQUFNO0FBQ1gsT0FBSyxPQUFPLElBQUk7QUFDaEIsU0FBTyxlQUFlLE1BQU0sUUFBUTtBQUFBLElBQ2hDLE9BQU87QUFBQSxFQUNYLENBQUM7QUFFRCxPQUFLLFFBQVEsSUFBSSxXQUFTO0FBQ3RCLFdBQU8sS0FBSyxNQUFNLGFBQUssVUFBVSxLQUFLO0FBQUEsTUFDbEMsUUFBUTtBQUFBLFFBQ0osR0FBRyxJQUFJLFVBQVUsQ0FBQztBQUFBLFFBQ2xCLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBSyxPQUFPLE9BQU8sYUFBYTtBQUFBLFVBQ3ZDLE1BQU07QUFBQSxZQUNGLE9BQU87QUFBQSxZQUNQLEtBQUs7QUFBQSxjQUNELE9BQU87QUFBQSxZQUNYO0FBQUEsWUFDQSxVQUFVLENBQUM7QUFBQSxVQUNmO0FBQUEsUUFDSixJQUFJLEVBQUU7QUFBQSxNQUNkO0FBQUEsSUFDSixDQUFDLENBQUM7QUFBQSxFQUNOO0FBQ0EsT0FBSyxRQUFRLENBQUNDLE1BQUssV0FBYyxNQUFNLE1BQU1BLE1BQUssTUFBTTtBQUN4RCxPQUFLLFFBQVEsTUFBSTtBQUNqQixPQUFLLFdBQVcsQ0FBQyxLQUFLLFNBQU87QUFDekIsUUFBSSxJQUFJLE1BQU0sSUFBSTtBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUVBLE9BQUssUUFBUSxDQUFDLE1BQU0sV0FBZUMsT0FBTSxNQUFNLE1BQU0sUUFBUTtBQUFBLElBQ3JELFFBQVEsS0FBSztBQUFBLEVBQ2pCLENBQUM7QUFDTCxPQUFLLFlBQVksQ0FBQyxNQUFNLFdBQWVDLFdBQVUsTUFBTSxNQUFNLE1BQU07QUFDbkUsT0FBSyxhQUFhLE9BQU8sTUFBTSxXQUFlQyxZQUFXLE1BQU0sTUFBTSxRQUFRO0FBQUEsSUFDckUsUUFBUSxLQUFLO0FBQUEsRUFDakIsQ0FBQztBQUNMLE9BQUssaUJBQWlCLE9BQU8sTUFBTSxXQUFlQyxnQkFBZSxNQUFNLE1BQU0sTUFBTTtBQUNuRixPQUFLLE1BQU0sS0FBSztBQUVoQixPQUFLLFNBQVMsQ0FBQyxNQUFNLFdBQWUsT0FBTyxNQUFNLE1BQU0sTUFBTTtBQUM3RCxPQUFLLFNBQVMsQ0FBQyxNQUFNLFdBQWUsT0FBTyxNQUFNLE1BQU0sTUFBTTtBQUM3RCxPQUFLLGNBQWMsT0FBTyxNQUFNLFdBQWUsWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUM3RSxPQUFLLGNBQWMsT0FBTyxNQUFNLFdBQWUsWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUM3RSxPQUFLLGFBQWEsQ0FBQyxNQUFNLFdBQWUsV0FBVyxNQUFNLE1BQU0sTUFBTTtBQUNyRSxPQUFLLGFBQWEsQ0FBQyxNQUFNLFdBQWUsV0FBVyxNQUFNLE1BQU0sTUFBTTtBQUNyRSxPQUFLLGtCQUFrQixPQUFPLE1BQU0sV0FBZSxnQkFBZ0IsTUFBTSxNQUFNLE1BQU07QUFDckYsT0FBSyxrQkFBa0IsT0FBTyxNQUFNLFdBQWUsZ0JBQWdCLE1BQU0sTUFBTSxNQUFNO0FBRXJGLE9BQUssU0FBUyxDQUFDLE9BQU8sV0FBUyxLQUFLLE1BQU0sT0FBTyxPQUFPLE1BQU0sQ0FBQztBQUMvRCxPQUFLLGNBQWMsQ0FBQyxlQUFhLEtBQUssTUFBTSxZQUFZLFVBQVUsQ0FBQztBQUNuRSxPQUFLLFlBQVksQ0FBQyxPQUFLLEtBQUssTUFBYSxXQUFVLEVBQUUsQ0FBQztBQUV0RCxPQUFLLFdBQVcsTUFBSSxTQUFTLElBQUk7QUFDakMsT0FBSyxXQUFXLE1BQUksU0FBUyxJQUFJO0FBQ2pDLE9BQUssVUFBVSxNQUFJLFNBQVMsU0FBUyxJQUFJLENBQUM7QUFDMUMsT0FBSyxjQUFjLENBQUMsV0FBUyxZQUFZLE1BQU0sTUFBTTtBQUNyRCxPQUFLLFFBQVEsTUFBSSxNQUFNLElBQUk7QUFDM0IsT0FBSyxLQUFLLENBQUMsUUFBTSxNQUFNO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxFQUNKLENBQUM7QUFDTCxPQUFLLE1BQU0sQ0FBQyxRQUFNLGFBQWEsTUFBTSxHQUFHO0FBQ3hDLE9BQUssWUFBWSxDQUFDLE9BQUssS0FBSyxNQUFNLFVBQVUsRUFBRSxDQUFDO0FBQy9DLE9BQUssVUFBVSxDQUFDSixTQUFNLFNBQVMsTUFBTUEsSUFBRztBQUN4QyxPQUFLLFdBQVcsQ0FBQ0EsU0FBTSxTQUFTLE1BQU1BLElBQUc7QUFFekMsT0FBSyxRQUFRLENBQUMsV0FBUyxPQUFPLE1BQU0sTUFBTTtBQUMxQyxPQUFLLE9BQU8sQ0FBQyxXQUFTLEtBQUssTUFBTSxNQUFNO0FBQ3ZDLE9BQUssV0FBVyxNQUFJLFNBQVMsSUFBSTtBQUVqQyxPQUFLLFdBQVcsQ0FBQyxnQkFBYztBQUMzQixVQUFNLEtBQUssS0FBSyxNQUFNO0FBQ3RCLElBQUssZUFBZSxJQUFJLElBQUk7QUFBQSxNQUN4QjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQ0EsU0FBTyxlQUFlLE1BQU0sZUFBZTtBQUFBLElBQ3ZDLE1BQU87QUFDSCxhQUFZLGVBQWUsSUFBSSxJQUFJLEdBQUc7QUFBQSxJQUMxQztBQUFBLElBQ0EsY0FBYztBQUFBLEVBQ2xCLENBQUM7QUFDRCxPQUFLLE9BQU8sSUFBSSxTQUFPO0FBQ25CLFFBQUksS0FBSyxXQUFXLEdBQUc7QUFDbkIsYUFBWSxlQUFlLElBQUksSUFBSTtBQUFBLElBQ3ZDO0FBQ0EsVUFBTSxLQUFLLEtBQUssTUFBTTtBQUN0QixJQUFLLGVBQWUsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBRUEsT0FBSyxhQUFhLE1BQUksS0FBSyxVQUFVLE1BQVMsRUFBRTtBQUNoRCxPQUFLLGFBQWEsTUFBSSxLQUFLLFVBQVUsSUFBSSxFQUFFO0FBQzNDLFNBQU87QUFDWCxDQUFDO0FBQ3VCLElBQU0sYUFBMkIsZ0JBQUssYUFBYSxjQUFjLENBQUMsTUFBTSxRQUFNO0FBQ2xHLEVBQUssV0FBVyxLQUFLLE1BQU0sR0FBRztBQUM5QixVQUFRLEtBQUssTUFBTSxHQUFHO0FBQ3RCLFFBQU0sTUFBTSxLQUFLLEtBQUs7QUFDdEIsT0FBSyxTQUFTLElBQUksVUFBVTtBQUM1QixPQUFLLFlBQVksSUFBSSxXQUFXO0FBQ2hDLE9BQUssWUFBWSxJQUFJLFdBQVc7QUFFaEMsT0FBSyxRQUFRLElBQUksU0FBTyxLQUFLLE1BQWEsT0FBTSxHQUFHLElBQUksQ0FBQztBQUN4RCxPQUFLLFdBQVcsSUFBSSxTQUFPLEtBQUssTUFBYSxVQUFTLEdBQUcsSUFBSSxDQUFDO0FBQzlELE9BQUssYUFBYSxJQUFJLFNBQU8sS0FBSyxNQUFhLFlBQVcsR0FBRyxJQUFJLENBQUM7QUFDbEUsT0FBSyxXQUFXLElBQUksU0FBTyxLQUFLLE1BQWEsVUFBUyxHQUFHLElBQUksQ0FBQztBQUM5RCxPQUFLLE1BQU0sSUFBSSxTQUFPLEtBQUssTUFBYSxXQUFVLEdBQUcsSUFBSSxDQUFDO0FBQzFELE9BQUssTUFBTSxJQUFJLFNBQU8sS0FBSyxNQUFhLFdBQVUsR0FBRyxJQUFJLENBQUM7QUFDMUQsT0FBSyxTQUFTLElBQUksU0FBTyxLQUFLLE1BQWEsUUFBTyxHQUFHLElBQUksQ0FBQztBQUMxRCxPQUFLLFdBQVcsSUFBSSxTQUFPLEtBQUssTUFBYSxXQUFVLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDbEUsT0FBSyxZQUFZLENBQUMsV0FBUyxLQUFLLE1BQWEsV0FBVSxNQUFNLENBQUM7QUFDOUQsT0FBSyxZQUFZLENBQUMsV0FBUyxLQUFLLE1BQWEsV0FBVSxNQUFNLENBQUM7QUFFOUQsT0FBSyxPQUFPLE1BQUksS0FBSyxNQUFhLE1BQUssQ0FBQztBQUN4QyxPQUFLLFlBQVksSUFBSSxTQUFPLEtBQUssTUFBYSxXQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ2hFLE9BQUssY0FBYyxNQUFJLEtBQUssTUFBYSxhQUFZLENBQUM7QUFDdEQsT0FBSyxjQUFjLE1BQUksS0FBSyxNQUFhLGFBQVksQ0FBQztBQUMxRCxDQUFDO0FBQ00sSUFBTSxZQUEwQixnQkFBSyxhQUFhLGFBQWEsQ0FBQyxNQUFNLFFBQU07QUFDL0UsRUFBSyxXQUFXLEtBQUssTUFBTSxHQUFHO0FBQzlCLGFBQVcsS0FBSyxNQUFNLEdBQUc7QUFDekIsT0FBSyxRQUFRLENBQUMsV0FBUyxLQUFLLE1BQVcsT0FBTyxVQUFVLE1BQU0sQ0FBQztBQUMvRCxPQUFLLE1BQU0sQ0FBQyxXQUFTLEtBQUssTUFBVyxLQUFLLFFBQVEsTUFBTSxDQUFDO0FBQ3pELE9BQUssTUFBTSxDQUFDLFdBQVMsS0FBSyxNQUFXLEtBQUssUUFBUSxNQUFNLENBQUM7QUFDekQsT0FBSyxRQUFRLENBQUMsV0FBUyxLQUFLLE1BQVdLLFFBQU8sVUFBVSxNQUFNLENBQUM7QUFDL0QsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLE9BQU8sQ0FBQyxXQUFTLEtBQUssTUFBVyxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQzVELE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsU0FBUyxNQUFNLENBQUM7QUFDaEUsT0FBSyxTQUFTLENBQUMsV0FBUyxLQUFLLE1BQVcsUUFBUSxTQUFTLE1BQU0sQ0FBQztBQUNoRSxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFNBQVMsTUFBTSxDQUFDO0FBQ2hFLE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFDbEUsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLE9BQU8sQ0FBQyxXQUFTLEtBQUssTUFBVyxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQzVELE9BQUssUUFBUSxDQUFDLFdBQVMsS0FBSyxNQUFXLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDL0QsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ2xFLE9BQUssWUFBWSxDQUFDLFdBQVMsS0FBSyxNQUFXLFdBQVcsY0FBYyxNQUFNLENBQUM7QUFDM0UsT0FBSyxNQUFNLENBQUMsV0FBUyxLQUFLLE1BQVcsS0FBSyxRQUFRLE1BQU0sQ0FBQztBQUN6RCxPQUFLLFFBQVEsQ0FBQyxXQUFTLEtBQUssTUFBVyxPQUFPLFVBQVUsTUFBTSxDQUFDO0FBQy9ELE9BQUssT0FBTyxDQUFDLFdBQVMsS0FBSyxNQUFXLE1BQU0sU0FBUyxNQUFNLENBQUM7QUFDNUQsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUM1RCxPQUFLLFNBQVMsQ0FBQyxXQUFTLEtBQUssTUFBVyxRQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ2xFLE9BQUssU0FBUyxDQUFDLFdBQVMsS0FBSyxNQUFXLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFDbEUsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVcsTUFBTSxTQUFTLE1BQU0sQ0FBQztBQUU1RCxPQUFLLFdBQVcsQ0FBQyxXQUFTLEtBQUssTUFBVUMsVUFBUyxNQUFNLENBQUM7QUFDekQsT0FBSyxPQUFPLENBQUMsV0FBUyxLQUFLLE1BQVVDLE1BQUssTUFBTSxDQUFDO0FBQ2pELE9BQUssT0FBTyxDQUFDLFdBQVMsS0FBSyxNQUFVQyxNQUFLLE1BQU0sQ0FBQztBQUNqRCxPQUFLLFdBQVcsQ0FBQyxXQUFTLEtBQUssTUFBVUMsVUFBUyxNQUFNLENBQUM7QUFDN0QsQ0FBQztBQUNNLFNBQVNDLFFBQU8sUUFBUTtBQUMzQixTQUFZLFFBQVEsV0FBVyxNQUFNO0FBQ3pDO0FBRmdCLE9BQUFBLFNBQUE7QUFHVCxJQUFNLGtCQUFnQyxnQkFBSyxhQUFhLG1CQUFtQixDQUFDLE1BQU0sUUFBTTtBQUMzRixFQUFLLGlCQUFpQixLQUFLLE1BQU0sR0FBRztBQUNwQyxhQUFXLEtBQUssTUFBTSxHQUFHO0FBQzdCLENBQUM7QUFDTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFlTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFXTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUUvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFNBQXVCLGdCQUFLLGFBQWEsVUFBVSxDQUFDLE1BQU0sUUFBTTtBQUV6RSxFQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDM0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFdBQXlCLGdCQUFLLGFBQWEsWUFBWSxDQUFDLE1BQU0sUUFBTTtBQUU3RSxFQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDN0Isa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFVBQXdCLGdCQUFLLGFBQWEsV0FBVyxDQUFDLE1BQU0sUUFBTTtBQUUzRSxFQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDNUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUMvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUMvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLFlBQTBCLGdCQUFLLGFBQWEsYUFBYSxDQUFDLE1BQU0sUUFBTTtBQUUvRSxFQUFLLFdBQVcsS0FBSyxNQUFNLEdBQUc7QUFDOUIsa0JBQWdCLEtBQUssTUFBTSxHQUFHO0FBQ2xDLENBQUM7QUFJTSxJQUFNLGVBQTZCLGdCQUFL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YUFBYSxXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHNDQUFzQzs7O0FDOUJuRyxJQUFJLE1BQU0sV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSxrQ0FBa0M7QUFDeEYsZUFBc0IsU0FBUyxLQUFLLE1BQU07QUFDdEMsUUFBTSxTQUFTLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFDbEMsVUFBUSxJQUFJO0FBQUEsSUFDUjtBQUFBLEVBQ0osQ0FBQztBQUNELFNBQU87QUFDWDtBQU5zQjtBQU90QixTQUFTLGFBQWE7QUFDdEIsV0FBVyxvQkFBb0IsSUFBSSw2Q0FBNkMsUUFBUTsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgInBhcnNlIiwgIm1zIiwgImluaXRpYWxpemVyIiwgImFycmF5IiwgIm9iamVjdCIsICJDbGFzcyIsICJjb25maWciLCAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJpc3N1ZSIsICJlcnJvciIsICJ2ZXJzaW9uIiwgInRpbWUiLCAiaW5zdCIsICJjaGVja3MiLCAiY2hlY2tSZXN1bHQiLCAiY2FuYXJ5IiwgInJlc3VsdCIsICJfIiwgImluc3QiLCAiYmFzZTY0IiwgInJlc3VsdCIsICJyIiwgImlzT2JqZWN0IiwgImFsbG93c0V2YWwiLCAicmVzdWx0cyIsICJsZWZ0IiwgInJpZ2h0IiwgIm91dHB1dCIsICJyZXN1bHQiLCAicmVzdWx0IiwgInJpZ2h0IiwgImxlZnQiLCAiciIsICJDbGFzcyIsICJDbGFzcyIsICJfZW1vamkiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiQ2xhc3MiLCAiaXNzdWUiLCAiZGF0ZXRpbWUiLCAiZGF0ZSIsICJ0aW1lIiwgImR1cmF0aW9uIiwgImluaXRpYWxpemVyIiwgImlzc3VlIiwgImlzc3VlcyIsICJwYXJzZSIsICJwYXJzZUFzeW5jIiwgInNhZmVQYXJzZSIsICJzYWZlUGFyc2VBc3luYyIsICJkZWYiLCAicGFyc2UiLCAic2FmZVBhcnNlIiwgInBhcnNlQXN5bmMiLCAic2FmZVBhcnNlQXN5bmMiLCAiX2Vtb2ppIiwgImRhdGV0aW1lIiwgImRhdGUiLCAidGltZSIsICJkdXJhdGlvbiIsICJzdHJpbmciLCAiYm9vbGVhbiIsICJpc3N1ZSIsICJvdXRwdXQiLCAic3RyaW5nIiwgImJvb2xlYW4iXQp9Cg==
|
|
51996
51996
|
`;
|
|
51997
51997
|
var POST = workflowEntrypoint(workflowCode);
|
|
51998
51998
|
// Annotate the CommonJS export names for ESM import in node:
|