experimental-agent 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapter-zgOel4wW.d.mts → adapter-Cl735Kp4.d.mts} +3 -60
- package/dist/{adapter-zgOel4wW.d.ts → adapter-Cl735Kp4.d.ts} +3 -60
- package/dist/{chunk-ZUFJJYC4.mjs → chunk-2Y7EZPIP.mjs} +3 -2
- package/dist/{chunk-RT72C52I.mjs → chunk-6MS4CGEZ.mjs} +3 -2
- package/dist/{chunk-MSTM6W3Y.mjs → chunk-AB2JYY6A.mjs} +3 -3
- package/dist/{chunk-IV75IMEW.mjs → chunk-I5DCB7RU.mjs} +27 -9
- package/dist/chunk-NOW6XL5E.mjs +310 -0
- package/dist/{docker-QPCLWLYR.mjs → docker-OBUQX5ZI.mjs} +1 -1
- package/dist/entry-Bs17QEiq.d.mts +45 -0
- package/dist/entry-QNyd4S1s.d.ts +45 -0
- package/dist/index.d.mts +128 -37
- package/dist/index.d.ts +128 -37
- package/dist/index.js +251 -130
- package/dist/index.mjs +216 -123
- package/dist/lifecycle-workflow-steps.d.mts +2 -2
- package/dist/lifecycle-workflow-steps.d.ts +2 -2
- package/dist/lifecycle-workflow.d.mts +2 -2
- package/dist/lifecycle-workflow.d.ts +2 -2
- package/dist/{local-KJ3BSIFJ.mjs → local-4C3V4EFS.mjs} +1 -1
- package/dist/next/loader.js +3 -3
- package/dist/next/loader.mjs +1 -1
- package/dist/next.js +3 -3
- package/dist/next.mjs +1 -1
- package/dist/sandbox.d.mts +3 -3
- package/dist/sandbox.d.ts +3 -3
- package/dist/sandbox.js +15 -5
- package/dist/sandbox.mjs +3 -3
- package/dist/{steps-DShnXBLf.d.ts → steps-XA4wG8W3.d.ts} +4 -1
- package/dist/{steps-BIsP57pm.d.mts → steps-eTytqxQb.d.mts} +4 -1
- package/dist/storage.d.mts +2 -2
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +27 -9
- package/dist/storage.mjs +1 -1
- package/dist/{vercel-QZ6INPMV.mjs → vercel-6ORAC625.mjs} +1 -1
- package/package.json +2 -2
- package/dist/chunk-BFFNCESS.mjs +0 -302
- package/dist/entry-6HYg5qqg.d.mts +0 -36
- package/dist/entry-BrWOmEK2.d.ts +0 -36
package/dist/index.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
localStorage,
|
|
7
7
|
shouldFallbackToKV2,
|
|
8
8
|
toStorage
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-I5DCB7RU.mjs";
|
|
10
10
|
import {
|
|
11
11
|
createLogger
|
|
12
12
|
} from "./chunk-MSWINCCM.mjs";
|
|
@@ -74,14 +74,14 @@ function isSingleBinding(sandbox) {
|
|
|
74
74
|
}
|
|
75
75
|
async function getDefaultBinding() {
|
|
76
76
|
if (await isVercel()) {
|
|
77
|
-
const { vercelSandbox } = await import("./vercel-
|
|
77
|
+
const { vercelSandbox } = await import("./vercel-6ORAC625.mjs");
|
|
78
78
|
return vercelSandbox();
|
|
79
79
|
}
|
|
80
80
|
if (await isDockerAvailable()) {
|
|
81
|
-
const { dockerSandbox } = await import("./docker-
|
|
81
|
+
const { dockerSandbox } = await import("./docker-OBUQX5ZI.mjs");
|
|
82
82
|
return dockerSandbox();
|
|
83
83
|
}
|
|
84
|
-
const { localSandbox } = await import("./local-
|
|
84
|
+
const { localSandbox } = await import("./local-4C3V4EFS.mjs");
|
|
85
85
|
return localSandbox();
|
|
86
86
|
}
|
|
87
87
|
async function isDockerAvailable() {
|
|
@@ -116,6 +116,7 @@ async function resolveBinding(sandbox, type) {
|
|
|
116
116
|
return { binding: sandbox[0], bindingName: sandbox[0].type };
|
|
117
117
|
}
|
|
118
118
|
async function setup(ctx, opts) {
|
|
119
|
+
"use step";
|
|
119
120
|
if (ctx._pendingSetup) {
|
|
120
121
|
return { done: ctx._pendingSetup };
|
|
121
122
|
}
|
|
@@ -138,7 +139,7 @@ async function setup(ctx, opts) {
|
|
|
138
139
|
}
|
|
139
140
|
const setupLog = log2.withContext({
|
|
140
141
|
binding: bindingName,
|
|
141
|
-
version: opts?.version
|
|
142
|
+
version: opts?.version ?? binding.defaults?.version
|
|
142
143
|
});
|
|
143
144
|
let resolveBlockingPromise = (value) => value;
|
|
144
145
|
let rejectBlockingPromise = (_reason) => {
|
|
@@ -154,8 +155,17 @@ async function setup(ctx, opts) {
|
|
|
154
155
|
const doneStorageGet = setupLog.time("storage.sandbox.get");
|
|
155
156
|
const record = await agent2.storage.sandbox.get(ctx.sandboxId);
|
|
156
157
|
doneStorageGet();
|
|
158
|
+
const bindingDefaults = binding.defaults ?? {};
|
|
159
|
+
const effectiveVersion = opts?.version ?? bindingDefaults.version ?? null;
|
|
160
|
+
const effectiveRun = opts?.run ?? bindingDefaults.run;
|
|
161
|
+
const effectiveNetworkPolicy = opts?.networkPolicy ?? bindingDefaults.networkPolicy ?? null;
|
|
162
|
+
const effectiveConfig = {
|
|
163
|
+
...bindingDefaults.config,
|
|
164
|
+
// biome-ignore lint/suspicious/noExplicitAny: opts is a union; config exists on binding-specific branches
|
|
165
|
+
...opts?.config
|
|
166
|
+
};
|
|
157
167
|
if (record) {
|
|
158
|
-
const versionMatches = !
|
|
168
|
+
const versionMatches = !effectiveVersion || record.setup?.version === effectiveVersion;
|
|
159
169
|
if (versionMatches && record.setup?.completedAt) {
|
|
160
170
|
resolveBlockingPromise();
|
|
161
171
|
const doneConnectExisting = setupLog.time(
|
|
@@ -227,8 +237,8 @@ async function setup(ctx, opts) {
|
|
|
227
237
|
const now = Date.now();
|
|
228
238
|
const setup_ = {
|
|
229
239
|
binding: bindingName,
|
|
230
|
-
version:
|
|
231
|
-
networkPolicy:
|
|
240
|
+
version: effectiveVersion ?? record?.setup?.version ?? null,
|
|
241
|
+
networkPolicy: effectiveNetworkPolicy ?? record?.setup?.networkPolicy ?? null,
|
|
232
242
|
completedAt: null,
|
|
233
243
|
metadata: null
|
|
234
244
|
};
|
|
@@ -248,8 +258,11 @@ async function setup(ctx, opts) {
|
|
|
248
258
|
const result = await binding.create({
|
|
249
259
|
cwd: ctx._cwd ?? ".",
|
|
250
260
|
agent: agent2,
|
|
251
|
-
|
|
252
|
-
|
|
261
|
+
setup: {
|
|
262
|
+
...setup_,
|
|
263
|
+
run: effectiveRun,
|
|
264
|
+
config: effectiveConfig
|
|
265
|
+
},
|
|
253
266
|
record: newRecord,
|
|
254
267
|
signal: opts?.signal,
|
|
255
268
|
log: setupLog
|
|
@@ -338,60 +351,70 @@ async function pollUntilReady(ctx, signal) {
|
|
|
338
351
|
|
|
339
352
|
// src/sandbox/exec.ts
|
|
340
353
|
async function exec(sandboxContext, ...opts) {
|
|
354
|
+
"use step";
|
|
341
355
|
const sbx = await resolve(sandboxContext);
|
|
342
356
|
return await sbx.exec(...opts);
|
|
343
357
|
}
|
|
344
358
|
|
|
345
359
|
// src/sandbox/get-domain.ts
|
|
346
360
|
async function getDomain(sandboxContext, ...opts) {
|
|
361
|
+
"use step";
|
|
347
362
|
const sbx = await resolve(sandboxContext);
|
|
348
363
|
return await sbx.getDomain(...opts);
|
|
349
364
|
}
|
|
350
365
|
|
|
351
366
|
// src/sandbox/get-status.ts
|
|
352
367
|
async function getStatus(sandboxContext, ...opts) {
|
|
368
|
+
"use step";
|
|
353
369
|
const sbx = await resolve(sandboxContext);
|
|
354
370
|
return await sbx.getStatus(...opts);
|
|
355
371
|
}
|
|
356
372
|
|
|
357
373
|
// src/sandbox/kill.ts
|
|
358
374
|
async function kill(sandboxContext, ...opts) {
|
|
375
|
+
"use step";
|
|
359
376
|
const sbx = await resolve(sandboxContext);
|
|
360
377
|
return await sbx.kill(...opts);
|
|
361
378
|
}
|
|
362
379
|
|
|
363
380
|
// src/sandbox/read-file.ts
|
|
364
381
|
async function readFile(sandboxContext, ...opts) {
|
|
382
|
+
"use step";
|
|
365
383
|
const sbx = await resolve(sandboxContext);
|
|
366
384
|
return await sbx.readFile(...opts);
|
|
367
385
|
}
|
|
368
386
|
|
|
369
387
|
// src/sandbox/snapshot.ts
|
|
370
388
|
async function snapshot(sandboxContext, ...opts) {
|
|
389
|
+
"use step";
|
|
371
390
|
const sbx = await resolve(sandboxContext);
|
|
372
391
|
return await sbx.snapshot(...opts);
|
|
373
392
|
}
|
|
374
393
|
|
|
375
394
|
// src/sandbox/start.ts
|
|
376
395
|
async function start(sandboxContext, ...opts) {
|
|
396
|
+
"use step";
|
|
377
397
|
const sbx = await resolve(sandboxContext);
|
|
378
398
|
return await sbx.start(...opts);
|
|
379
399
|
}
|
|
380
400
|
|
|
381
401
|
// src/sandbox/stop.ts
|
|
382
402
|
async function stop(sandboxContext, ...opts) {
|
|
403
|
+
"use step";
|
|
383
404
|
const sbx = await resolve(sandboxContext);
|
|
384
405
|
return await sbx.stop(...opts);
|
|
385
406
|
}
|
|
386
407
|
|
|
387
408
|
// src/sandbox/update-network-policy.ts
|
|
388
409
|
async function updateNetworkPolicy(sandboxContext, ...opts) {
|
|
410
|
+
"use step";
|
|
389
411
|
const sbx = await resolve(sandboxContext);
|
|
390
412
|
return await sbx.updateNetworkPolicy(...opts);
|
|
391
413
|
}
|
|
392
414
|
|
|
393
415
|
// src/sandbox/write-files.ts
|
|
394
416
|
async function writeFiles(sandboxContext, ...opts) {
|
|
417
|
+
"use step";
|
|
395
418
|
const sbx = await resolve(sandboxContext);
|
|
396
419
|
return await sbx.writeFiles(...opts);
|
|
397
420
|
}
|
|
@@ -423,6 +446,58 @@ function sandboxHandle(agent2, id) {
|
|
|
423
446
|
getStatus: getStatus.bind(null, sandboxContext)
|
|
424
447
|
};
|
|
425
448
|
}
|
|
449
|
+
function lazySandboxHandle(agent2, getId) {
|
|
450
|
+
const getHandle = async () => {
|
|
451
|
+
const id = await getId();
|
|
452
|
+
return sandboxHandle(agent2, id);
|
|
453
|
+
};
|
|
454
|
+
return {
|
|
455
|
+
setup: async (...args) => {
|
|
456
|
+
const h = await getHandle();
|
|
457
|
+
return h.setup(...args);
|
|
458
|
+
},
|
|
459
|
+
exec: async (...args) => {
|
|
460
|
+
const h = await getHandle();
|
|
461
|
+
return h.exec(...args);
|
|
462
|
+
},
|
|
463
|
+
readFile: async (...args) => {
|
|
464
|
+
const h = await getHandle();
|
|
465
|
+
return h.readFile(...args);
|
|
466
|
+
},
|
|
467
|
+
writeFiles: async (...args) => {
|
|
468
|
+
const h = await getHandle();
|
|
469
|
+
return h.writeFiles(...args);
|
|
470
|
+
},
|
|
471
|
+
getDomain: async (...args) => {
|
|
472
|
+
const h = await getHandle();
|
|
473
|
+
return h.getDomain(...args);
|
|
474
|
+
},
|
|
475
|
+
updateNetworkPolicy: async (...args) => {
|
|
476
|
+
const h = await getHandle();
|
|
477
|
+
return h.updateNetworkPolicy(...args);
|
|
478
|
+
},
|
|
479
|
+
start: async (...args) => {
|
|
480
|
+
const h = await getHandle();
|
|
481
|
+
return h.start(...args);
|
|
482
|
+
},
|
|
483
|
+
stop: async (...args) => {
|
|
484
|
+
const h = await getHandle();
|
|
485
|
+
return h.stop(...args);
|
|
486
|
+
},
|
|
487
|
+
kill: async (...args) => {
|
|
488
|
+
const h = await getHandle();
|
|
489
|
+
return h.kill(...args);
|
|
490
|
+
},
|
|
491
|
+
snapshot: async (...args) => {
|
|
492
|
+
const h = await getHandle();
|
|
493
|
+
return h.snapshot(...args);
|
|
494
|
+
},
|
|
495
|
+
getStatus: async (...args) => {
|
|
496
|
+
const h = await getHandle();
|
|
497
|
+
return h.getStatus(...args);
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
}
|
|
426
501
|
|
|
427
502
|
// src/session/handle.ts
|
|
428
503
|
import { ulid as ulid4 } from "ulid";
|
|
@@ -509,6 +584,7 @@ function computeSessionUsage(messages) {
|
|
|
509
584
|
|
|
510
585
|
// src/session/history.ts
|
|
511
586
|
async function history(sessionContext) {
|
|
587
|
+
"use step";
|
|
512
588
|
const [session, messages, parts] = await Promise.all([
|
|
513
589
|
sessionContext.agent.storage.session.get(sessionContext.sessionId),
|
|
514
590
|
sessionContext.agent.storage.message.listBySession(
|
|
@@ -596,6 +672,14 @@ import { all } from "better-all";
|
|
|
596
672
|
import * as errore2 from "errore";
|
|
597
673
|
import { ulid as ulid3 } from "ulid";
|
|
598
674
|
|
|
675
|
+
// src/session/ai-loop/stream-text.ts
|
|
676
|
+
import {
|
|
677
|
+
convertToModelMessages,
|
|
678
|
+
createUIMessageStream,
|
|
679
|
+
stepCountIs,
|
|
680
|
+
streamText as streamTextAi
|
|
681
|
+
} from "ai";
|
|
682
|
+
|
|
599
683
|
// src/skills/parser.ts
|
|
600
684
|
function parseSkillFrontmatter(content) {
|
|
601
685
|
const trimmed = content.trim();
|
|
@@ -655,14 +739,6 @@ function normalizeSkills(skills) {
|
|
|
655
739
|
});
|
|
656
740
|
}
|
|
657
741
|
|
|
658
|
-
// src/session/ai-loop/stream-text.ts
|
|
659
|
-
import {
|
|
660
|
-
convertToModelMessages,
|
|
661
|
-
createUIMessageStream,
|
|
662
|
-
stepCountIs,
|
|
663
|
-
streamText as streamTextAi
|
|
664
|
-
} from "ai";
|
|
665
|
-
|
|
666
742
|
// src/skills/discover.ts
|
|
667
743
|
async function discoverSkillsInSandbox(opts) {
|
|
668
744
|
const { agent: agent2, sandbox, skillsDirs, sessionId } = opts;
|
|
@@ -1280,8 +1356,8 @@ async function executeInSandbox({
|
|
|
1280
1356
|
}
|
|
1281
1357
|
}
|
|
1282
1358
|
function createJavaScriptTool(opts) {
|
|
1283
|
-
const {
|
|
1284
|
-
const activeSet =
|
|
1359
|
+
const { sandbox, onSubToolCall } = opts;
|
|
1360
|
+
const activeSet = opts.activeTools ? new Set(opts.activeTools) : null;
|
|
1285
1361
|
const availableTools = {};
|
|
1286
1362
|
for (const [name, t] of Object.entries(opts.tools)) {
|
|
1287
1363
|
if (!activeSet || activeSet.has(name)) {
|
|
@@ -1558,7 +1634,7 @@ var builtinToolNames = Object.fromEntries(
|
|
|
1558
1634
|
var SKILL_MD_SUFFIX = /\/?SKILL\.md$/;
|
|
1559
1635
|
function getTools({
|
|
1560
1636
|
agent: agent2,
|
|
1561
|
-
|
|
1637
|
+
sandbox,
|
|
1562
1638
|
skillsRef,
|
|
1563
1639
|
writer,
|
|
1564
1640
|
abortController,
|
|
@@ -1566,9 +1642,10 @@ function getTools({
|
|
|
1566
1642
|
assistantMessageId,
|
|
1567
1643
|
sessionId,
|
|
1568
1644
|
stepLog,
|
|
1569
|
-
context
|
|
1645
|
+
context,
|
|
1646
|
+
messages,
|
|
1647
|
+
activeTools
|
|
1570
1648
|
}) {
|
|
1571
|
-
const sandbox = agent2.sandbox(session.sandboxId ?? session.id);
|
|
1572
1649
|
const rawTools = {
|
|
1573
1650
|
[builtinToolNames.Read]: tool2({
|
|
1574
1651
|
...builtInTools.Read,
|
|
@@ -1938,7 +2015,7 @@ function getTools({
|
|
|
1938
2015
|
}),
|
|
1939
2016
|
...agent2.options.tools
|
|
1940
2017
|
};
|
|
1941
|
-
if (
|
|
2018
|
+
if (skillsRef.current.length > 0) {
|
|
1942
2019
|
rawTools[builtinToolNames.Skill] = tool2({
|
|
1943
2020
|
...builtInTools.Skill,
|
|
1944
2021
|
execute: async ({ name }) => {
|
|
@@ -2071,15 +2148,15 @@ function getTools({
|
|
|
2071
2148
|
};
|
|
2072
2149
|
};
|
|
2073
2150
|
const toolContext = {
|
|
2074
|
-
|
|
2151
|
+
context,
|
|
2152
|
+
sessionId,
|
|
2075
2153
|
sandbox,
|
|
2076
|
-
|
|
2077
|
-
context
|
|
2154
|
+
messages
|
|
2078
2155
|
};
|
|
2079
2156
|
rawTools[builtinToolNames.JavaScript] = createJavaScriptTool({
|
|
2080
2157
|
tools: rawTools,
|
|
2081
|
-
session,
|
|
2082
2158
|
sandbox,
|
|
2159
|
+
activeTools,
|
|
2083
2160
|
onSubToolCall,
|
|
2084
2161
|
toolContext
|
|
2085
2162
|
});
|
|
@@ -2382,7 +2459,6 @@ async function streamText({
|
|
|
2382
2459
|
sessionId,
|
|
2383
2460
|
context,
|
|
2384
2461
|
createdAt,
|
|
2385
|
-
sessionUpdates,
|
|
2386
2462
|
writable,
|
|
2387
2463
|
lastPartIndex,
|
|
2388
2464
|
stepIndexOffset,
|
|
@@ -2407,30 +2483,16 @@ async function streamText({
|
|
|
2407
2483
|
abortController
|
|
2408
2484
|
});
|
|
2409
2485
|
const doneLoad = stepLog.time("load session + messages + parts + sandbox");
|
|
2410
|
-
const [, messagesResult, partsResult, {
|
|
2486
|
+
const [, messagesResult, partsResult, { sandbox }] = await Promise.all([
|
|
2411
2487
|
firstCheck,
|
|
2412
2488
|
agent2.storage.message.listBySession(sessionId),
|
|
2413
2489
|
agent2.storage.part.listBySession(sessionId),
|
|
2414
|
-
agent2.storage.session.get(sessionId).then(
|
|
2415
|
-
if (!
|
|
2490
|
+
agent2.storage.session.get(sessionId).then((session) => {
|
|
2491
|
+
if (!session) {
|
|
2416
2492
|
throw new SessionNotFoundError({ id: sessionId });
|
|
2417
2493
|
}
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
const diff = {};
|
|
2421
|
-
for (const [key, value] of Object.entries(sessionUpdates)) {
|
|
2422
|
-
if (value !== void 0 && value !== session2[key]) {
|
|
2423
|
-
diff[key] = value;
|
|
2424
|
-
}
|
|
2425
|
-
}
|
|
2426
|
-
if (Object.keys(diff).length > 0) {
|
|
2427
|
-
Object.assign(session2, diff);
|
|
2428
|
-
pendingUpdate = agent2.session(sessionId).update(diff);
|
|
2429
|
-
}
|
|
2430
|
-
}
|
|
2431
|
-
const sandbox2 = agent2.sandbox(session2.sandboxId ?? session2.id);
|
|
2432
|
-
await pendingUpdate;
|
|
2433
|
-
return { session: session2, sandbox: sandbox2 };
|
|
2494
|
+
const sandbox2 = agent2.sandbox(session.sandboxId ?? session.id);
|
|
2495
|
+
return { sandbox: sandbox2 };
|
|
2434
2496
|
})
|
|
2435
2497
|
]);
|
|
2436
2498
|
doneLoad();
|
|
@@ -2472,11 +2534,30 @@ async function streamText({
|
|
|
2472
2534
|
const skillsRef = {
|
|
2473
2535
|
current: discoveredSkills ?? []
|
|
2474
2536
|
};
|
|
2537
|
+
let uiMessages = assembleUIMessages({
|
|
2538
|
+
messages: messagesResult,
|
|
2539
|
+
parts: allParts,
|
|
2540
|
+
until: createdAt,
|
|
2541
|
+
includeQueued: true,
|
|
2542
|
+
excludeSubToolParts: true
|
|
2543
|
+
});
|
|
2544
|
+
const resolvableArgs = {
|
|
2545
|
+
context,
|
|
2546
|
+
sessionId,
|
|
2547
|
+
sandbox,
|
|
2548
|
+
get messages() {
|
|
2549
|
+
return uiMessages;
|
|
2550
|
+
}
|
|
2551
|
+
};
|
|
2475
2552
|
if (lastPartIndex === 0 && !discoveredSkills) {
|
|
2476
|
-
const
|
|
2553
|
+
const resolvedSkills = await resolveOption(
|
|
2554
|
+
agent2.options.skills,
|
|
2555
|
+
resolvableArgs
|
|
2556
|
+
);
|
|
2557
|
+
const skillsDirs = resolvedSkills?.length ? await resolveSkillInputsToSandboxDirs({
|
|
2477
2558
|
agent: agent2,
|
|
2478
2559
|
sandbox,
|
|
2479
|
-
skills:
|
|
2560
|
+
skills: resolvedSkills,
|
|
2480
2561
|
sessionId
|
|
2481
2562
|
}) : [];
|
|
2482
2563
|
if (skillsDirs.length > 0) {
|
|
@@ -2495,13 +2576,24 @@ async function streamText({
|
|
|
2495
2576
|
let loopFinishReason = "unknown";
|
|
2496
2577
|
let wasAborted = false;
|
|
2497
2578
|
const allPendingApprovals = [];
|
|
2498
|
-
let currentMaxSteps
|
|
2499
|
-
let currentSession = session;
|
|
2579
|
+
let currentMaxSteps;
|
|
2500
2580
|
try {
|
|
2501
2581
|
for (let iteration = 0; iteration < stepThroughput; iteration++) {
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2582
|
+
const resolvedModel = await resolveOption(
|
|
2583
|
+
agent2.options.model,
|
|
2584
|
+
resolvableArgs
|
|
2585
|
+
);
|
|
2586
|
+
const resolvedGeneration = await resolveOption(
|
|
2587
|
+
agent2.options.generation,
|
|
2588
|
+
resolvableArgs
|
|
2589
|
+
);
|
|
2590
|
+
const resolvedActiveTools = await resolveOption(
|
|
2591
|
+
agent2.options.activeTools,
|
|
2592
|
+
resolvableArgs
|
|
2593
|
+
);
|
|
2594
|
+
currentMaxSteps = resolvedGeneration?.maxSteps;
|
|
2595
|
+
if (!resolvedModel) {
|
|
2596
|
+
throw new Error("Agent model is not set");
|
|
2505
2597
|
}
|
|
2506
2598
|
const stepParts = [];
|
|
2507
2599
|
let streamTextFinishReason;
|
|
@@ -2510,7 +2602,7 @@ async function streamText({
|
|
|
2510
2602
|
execute: async ({ writer }) => {
|
|
2511
2603
|
const { rawTools, toolsWithNeedsApproval, toolContext } = getTools({
|
|
2512
2604
|
agent: agent2,
|
|
2513
|
-
|
|
2605
|
+
sandbox,
|
|
2514
2606
|
skillsRef,
|
|
2515
2607
|
writer,
|
|
2516
2608
|
abortController,
|
|
@@ -2518,7 +2610,9 @@ async function streamText({
|
|
|
2518
2610
|
assistantMessageId,
|
|
2519
2611
|
sessionId,
|
|
2520
2612
|
stepLog,
|
|
2521
|
-
context
|
|
2613
|
+
context,
|
|
2614
|
+
messages: uiMessages,
|
|
2615
|
+
activeTools: resolvedActiveTools
|
|
2522
2616
|
});
|
|
2523
2617
|
if (iteration === 0) {
|
|
2524
2618
|
await processApprovals({
|
|
@@ -2541,41 +2635,38 @@ async function streamText({
|
|
|
2541
2635
|
const iterResult = streamTextAi({
|
|
2542
2636
|
messages: [{ role: "user", content: "." }],
|
|
2543
2637
|
tools: toolsWithNeedsApproval,
|
|
2544
|
-
model:
|
|
2638
|
+
model: resolvedModel,
|
|
2545
2639
|
abortSignal: abortController.signal,
|
|
2546
2640
|
stopWhen: stepCountIs(1),
|
|
2547
|
-
temperature:
|
|
2548
|
-
topK:
|
|
2549
|
-
topP:
|
|
2550
|
-
frequencyPenalty:
|
|
2551
|
-
presencePenalty:
|
|
2552
|
-
maxOutputTokens:
|
|
2553
|
-
headers:
|
|
2641
|
+
temperature: resolvedGeneration?.temperature,
|
|
2642
|
+
topK: resolvedGeneration?.topK,
|
|
2643
|
+
topP: resolvedGeneration?.topP,
|
|
2644
|
+
frequencyPenalty: resolvedGeneration?.frequencyPenalty,
|
|
2645
|
+
presencePenalty: resolvedGeneration?.presencePenalty,
|
|
2646
|
+
maxOutputTokens: resolvedGeneration?.maxOutputTokens,
|
|
2647
|
+
headers: resolvedGeneration?.headers,
|
|
2554
2648
|
experimental_context: {
|
|
2555
|
-
|
|
2649
|
+
context,
|
|
2650
|
+
sessionId,
|
|
2556
2651
|
sandbox,
|
|
2557
|
-
|
|
2558
|
-
context
|
|
2652
|
+
messages: uiMessages
|
|
2559
2653
|
},
|
|
2560
2654
|
prepareStep: async ({ model }) => {
|
|
2561
2655
|
const skillsContext = buildSkillsContext(skillsRef.current);
|
|
2562
2656
|
const cwdPrompt = `Your working directory is ${sandbox.cwd}. All file paths should be absolute.`;
|
|
2657
|
+
const resolvedSystem = await resolveSystem(
|
|
2658
|
+
agent2.options.system,
|
|
2659
|
+
resolvableArgs
|
|
2660
|
+
);
|
|
2563
2661
|
const systemHeader = joinPromptSections(
|
|
2564
2662
|
BASE_SYSTEM_PROMPT,
|
|
2565
2663
|
cwdPrompt,
|
|
2566
|
-
|
|
2664
|
+
resolvedSystem
|
|
2567
2665
|
);
|
|
2568
2666
|
const systemContext = joinPromptSections(
|
|
2569
2667
|
skillsContext,
|
|
2570
2668
|
cwdPrompt
|
|
2571
2669
|
);
|
|
2572
|
-
const uiMessages = assembleUIMessages({
|
|
2573
|
-
messages: messagesResult,
|
|
2574
|
-
parts: allParts,
|
|
2575
|
-
until: createdAt,
|
|
2576
|
-
includeQueued: true,
|
|
2577
|
-
excludeSubToolParts: true
|
|
2578
|
-
});
|
|
2579
2670
|
const convertedMessages = await convertToModelMessages(
|
|
2580
2671
|
uiMessages,
|
|
2581
2672
|
{ ignoreIncompleteToolCalls: true }
|
|
@@ -2590,7 +2681,7 @@ async function streamText({
|
|
|
2590
2681
|
sessionId,
|
|
2591
2682
|
messages: modelMessages
|
|
2592
2683
|
});
|
|
2593
|
-
let activeTools =
|
|
2684
|
+
let activeTools = resolvedActiveTools ?? void 0;
|
|
2594
2685
|
if (skillsRef.current.length === 0 && activeTools) {
|
|
2595
2686
|
activeTools = activeTools.filter(
|
|
2596
2687
|
(t) => t !== "Skill"
|
|
@@ -2606,7 +2697,7 @@ async function streamText({
|
|
|
2606
2697
|
if (usage2) {
|
|
2607
2698
|
usageSteps.push({
|
|
2608
2699
|
stepIndex: stepIndexOffset + internalStepIndex,
|
|
2609
|
-
model:
|
|
2700
|
+
model: resolvedModel ?? "unknown",
|
|
2610
2701
|
inputTokens: usage2.inputTokens ?? 0,
|
|
2611
2702
|
outputTokens: usage2.outputTokens ?? 0,
|
|
2612
2703
|
totalTokens: usage2.totalTokens ?? 0,
|
|
@@ -2701,17 +2792,15 @@ async function streamText({
|
|
|
2701
2792
|
allPendingApprovals.push(...iterPendingApprovals);
|
|
2702
2793
|
break;
|
|
2703
2794
|
}
|
|
2704
|
-
|
|
2705
|
-
persistPartsPromise,
|
|
2706
|
-
agent2.storage.session.get(sessionId).then((s) => {
|
|
2707
|
-
if (!s) {
|
|
2708
|
-
throw new SessionNotFoundError({ id: sessionId });
|
|
2709
|
-
}
|
|
2710
|
-
return s;
|
|
2711
|
-
})
|
|
2712
|
-
]);
|
|
2795
|
+
await persistPartsPromise;
|
|
2713
2796
|
allParts.push(...newPartRecords);
|
|
2714
|
-
|
|
2797
|
+
uiMessages = assembleUIMessages({
|
|
2798
|
+
messages: messagesResult,
|
|
2799
|
+
parts: allParts,
|
|
2800
|
+
until: createdAt,
|
|
2801
|
+
includeQueued: true,
|
|
2802
|
+
excludeSubToolParts: true
|
|
2803
|
+
});
|
|
2715
2804
|
}
|
|
2716
2805
|
} finally {
|
|
2717
2806
|
pollController.abort();
|
|
@@ -2878,6 +2967,22 @@ function createThrottledEmitStatus(agent2) {
|
|
|
2878
2967
|
};
|
|
2879
2968
|
return throttled;
|
|
2880
2969
|
}
|
|
2970
|
+
async function resolveOption(value, args) {
|
|
2971
|
+
if (value === void 0) {
|
|
2972
|
+
return void 0;
|
|
2973
|
+
}
|
|
2974
|
+
if (typeof value === "function") {
|
|
2975
|
+
return await value(args);
|
|
2976
|
+
}
|
|
2977
|
+
return value;
|
|
2978
|
+
}
|
|
2979
|
+
async function resolveSystem(input, args) {
|
|
2980
|
+
const result = await resolveOption(input, args);
|
|
2981
|
+
if (!result) {
|
|
2982
|
+
return null;
|
|
2983
|
+
}
|
|
2984
|
+
return Array.isArray(result) ? result.filter(Boolean).join("\n") : result;
|
|
2985
|
+
}
|
|
2881
2986
|
var BASE_SYSTEM_PROMPT = "You are an AI assistant with basic tools to interact with your environment. Explore and work freely.";
|
|
2882
2987
|
function joinPromptSections(...sections) {
|
|
2883
2988
|
return sections.filter((s) => s?.trim()).join("\n\n");
|
|
@@ -2921,12 +3026,6 @@ function getActiveRuns() {
|
|
|
2921
3026
|
return g[ACTIVE_RUNS_KEY];
|
|
2922
3027
|
}
|
|
2923
3028
|
async function send(sessionContext, input, opts) {
|
|
2924
|
-
const {
|
|
2925
|
-
interruptIfStreaming: __,
|
|
2926
|
-
context: ___,
|
|
2927
|
-
abortSignal: ____,
|
|
2928
|
-
...sessionUpdates
|
|
2929
|
-
} = opts ?? {};
|
|
2930
3029
|
if (opts?.interruptIfStreaming) {
|
|
2931
3030
|
const lastPart = typeof opts.interruptIfStreaming === "object" ? opts.interruptIfStreaming.lastPart : void 0;
|
|
2932
3031
|
await interrupt(sessionContext, { lastPart });
|
|
@@ -2941,7 +3040,7 @@ async function send(sessionContext, input, opts) {
|
|
|
2941
3040
|
try: () => initSessionStep({
|
|
2942
3041
|
sessionContext,
|
|
2943
3042
|
sessionId: sessionContext.sessionId,
|
|
2944
|
-
|
|
3043
|
+
sandboxId: opts?.sandboxId,
|
|
2945
3044
|
input
|
|
2946
3045
|
}),
|
|
2947
3046
|
catch: (e) => {
|
|
@@ -2960,7 +3059,6 @@ async function send(sessionContext, input, opts) {
|
|
|
2960
3059
|
assistantMessageId,
|
|
2961
3060
|
createdAt: assistantMessageCreatedAt,
|
|
2962
3061
|
context: opts?.context ?? {},
|
|
2963
|
-
sessionUpdates,
|
|
2964
3062
|
lastPartIndex: existingPartCount,
|
|
2965
3063
|
workflowRunId
|
|
2966
3064
|
};
|
|
@@ -3003,7 +3101,6 @@ async function runLoop({
|
|
|
3003
3101
|
assistantMessageId,
|
|
3004
3102
|
createdAt,
|
|
3005
3103
|
context,
|
|
3006
|
-
sessionUpdates,
|
|
3007
3104
|
writable,
|
|
3008
3105
|
lastPartIndex: initialPartIndex
|
|
3009
3106
|
}) {
|
|
@@ -3032,7 +3129,6 @@ async function runLoop({
|
|
|
3032
3129
|
sessionId: sessionContext.sessionId,
|
|
3033
3130
|
context,
|
|
3034
3131
|
createdAt,
|
|
3035
|
-
sessionUpdates,
|
|
3036
3132
|
writable,
|
|
3037
3133
|
lastPartIndex,
|
|
3038
3134
|
stepIndexOffset: usageSteps.length,
|
|
@@ -3072,7 +3168,7 @@ async function runLoop({
|
|
|
3072
3168
|
async function initSessionStep({
|
|
3073
3169
|
sessionContext,
|
|
3074
3170
|
sessionId,
|
|
3075
|
-
|
|
3171
|
+
sandboxId,
|
|
3076
3172
|
input
|
|
3077
3173
|
}) {
|
|
3078
3174
|
"use step";
|
|
@@ -3134,22 +3230,21 @@ async function initSessionStep({
|
|
|
3134
3230
|
}
|
|
3135
3231
|
const existingPartCount = reuseAssistant ? newParts.filter((p) => p.messageId === assistantMessageId).length : 0;
|
|
3136
3232
|
let session = await sessionContext.agent.storage.session.get(sessionId);
|
|
3233
|
+
const now = Date.now();
|
|
3137
3234
|
if (!session) {
|
|
3138
|
-
const defaults = sessionContext.agent.sessionDefaults;
|
|
3139
|
-
const skills = sessionUpdates.skills ?? defaults.skills ?? null;
|
|
3140
3235
|
session = {
|
|
3141
3236
|
id: sessionId,
|
|
3142
|
-
|
|
3143
|
-
updatedAt: Date.now(),
|
|
3237
|
+
sandboxId: sandboxId ?? null,
|
|
3144
3238
|
lastMessageId: null,
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
sandboxId: sessionUpdates.sandboxId ?? null,
|
|
3148
|
-
activeTools: sessionUpdates.activeTools ?? defaults.activeTools ?? null,
|
|
3149
|
-
generation: sessionUpdates.generation ?? defaults.generation ?? null,
|
|
3150
|
-
skills: skills ? normalizeSkills(skills) : null
|
|
3239
|
+
createdAt: now,
|
|
3240
|
+
updatedAt: now
|
|
3151
3241
|
};
|
|
3152
3242
|
await sessionContext.agent.storage.session.set(session.id, session);
|
|
3243
|
+
} else if (sandboxId && sandboxId !== session.sandboxId) {
|
|
3244
|
+
session = { ...session, sandboxId, updatedAt: now };
|
|
3245
|
+
await sessionContext.agent.storage.session.update(session.id, {
|
|
3246
|
+
sandboxId
|
|
3247
|
+
});
|
|
3153
3248
|
}
|
|
3154
3249
|
await all({
|
|
3155
3250
|
async saveMessages() {
|
|
@@ -3435,24 +3530,22 @@ var StreamError = class extends errore3.createTaggedError({
|
|
|
3435
3530
|
|
|
3436
3531
|
// src/session/update.ts
|
|
3437
3532
|
async function update(sessionContext, opts) {
|
|
3438
|
-
|
|
3439
|
-
const
|
|
3440
|
-
Object.entries(
|
|
3441
|
-
...rawUpdates,
|
|
3442
|
-
...skills !== void 0 ? { skills: skills ? normalizeSkills(skills) : null } : {}
|
|
3443
|
-
}).filter(([, value]) => value !== void 0)
|
|
3533
|
+
"use step";
|
|
3534
|
+
const updates = Object.fromEntries(
|
|
3535
|
+
Object.entries(opts).filter(([, value]) => value !== void 0)
|
|
3444
3536
|
);
|
|
3445
|
-
if (Object.keys(
|
|
3537
|
+
if (Object.keys(updates).length === 0) {
|
|
3446
3538
|
return;
|
|
3447
3539
|
}
|
|
3448
3540
|
await sessionContext.agent.storage.session.update(sessionContext.sessionId, {
|
|
3449
|
-
...
|
|
3541
|
+
...updates,
|
|
3450
3542
|
updatedAt: Date.now()
|
|
3451
3543
|
});
|
|
3452
3544
|
}
|
|
3453
3545
|
|
|
3454
3546
|
// src/session/usage.ts
|
|
3455
3547
|
async function usage(sessionContext) {
|
|
3548
|
+
"use step";
|
|
3456
3549
|
const messages = await sessionContext.agent.storage.message.listBySession(
|
|
3457
3550
|
sessionContext.sessionId
|
|
3458
3551
|
);
|
|
@@ -3475,7 +3568,11 @@ function sessionHandle(agent2, id) {
|
|
|
3475
3568
|
history: history.bind(null, sessionContext),
|
|
3476
3569
|
interrupt: interrupt.bind(null, sessionContext),
|
|
3477
3570
|
usage: usage.bind(null, sessionContext),
|
|
3478
|
-
update: update.bind(null, sessionContext)
|
|
3571
|
+
update: update.bind(null, sessionContext),
|
|
3572
|
+
sandbox: lazySandboxHandle(agent2, async () => {
|
|
3573
|
+
const record = await agent2.storage.session.get(sessionId);
|
|
3574
|
+
return record?.sandboxId ?? sessionId;
|
|
3575
|
+
})
|
|
3479
3576
|
};
|
|
3480
3577
|
}
|
|
3481
3578
|
|
|
@@ -3601,10 +3698,6 @@ var Agent = class {
|
|
|
3601
3698
|
get tools() {
|
|
3602
3699
|
return { ...builtInTools, ...this.options.tools };
|
|
3603
3700
|
}
|
|
3604
|
-
get sessionDefaults() {
|
|
3605
|
-
const { model, system, generation, activeTools, skills } = this.options;
|
|
3606
|
-
return { model, system, generation, activeTools, skills };
|
|
3607
|
-
}
|
|
3608
3701
|
get hooks() {
|
|
3609
3702
|
return this.options.hooks ?? {};
|
|
3610
3703
|
}
|
|
@@ -3627,4 +3720,4 @@ export {
|
|
|
3627
3720
|
agent,
|
|
3628
3721
|
builtinToolNames
|
|
3629
3722
|
};
|
|
3630
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FnZW50L2NsaWVudC50cyIsICIuLi9zcmMvc2FuZGJveC9oYW5kbGUudHMiLCAiLi4vc3JjL2FnZW50L2lzLXZlcmNlbC50cyIsICIuLi9zcmMvZXJyb3JzLnRzIiwgIi4uL3NyYy9zYW5kYm94L3NldHVwLnRzIiwgIi4uL3NyYy9zYW5kYm94L2V4ZWMudHMiLCAiLi4vc3JjL3NhbmRib3gvZ2V0LWRvbWFpbi50cyIsICIuLi9zcmMvc2FuZGJveC9nZXQtc3RhdHVzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2tpbGwudHMiLCAiLi4vc3JjL3NhbmRib3gvcmVhZC1maWxlLnRzIiwgIi4uL3NyYy9zYW5kYm94L3NuYXBzaG90LnRzIiwgIi4uL3NyYy9zYW5kYm94L3N0YXJ0LnRzIiwgIi4uL3NyYy9zYW5kYm94L3N0b3AudHMiLCAiLi4vc3JjL3NhbmRib3gvdXBkYXRlLW5ldHdvcmstcG9saWN5LnRzIiwgIi4uL3NyYy9zYW5kYm94L3dyaXRlLWZpbGVzLnRzIiwgIi4uL3NyYy9zZXNzaW9uL2hhbmRsZS50cyIsICIuLi9zcmMvdXRpbHMvdWkudHMiLCAiLi4vc3JjL3V0aWxzL3VzYWdlLnRzIiwgIi4uL3NyYy9zZXNzaW9uL2hpc3RvcnkudHMiLCAiLi4vc3JjL3Nlc3Npb24vaW50ZXJydXB0LnRzIiwgIi4uL3NyYy9zZXNzaW9uL3NlbmQudHMiLCAiLi4vc3JjL3NraWxscy9wYXJzZXIudHMiLCAiLi4vc3JjL3Nlc3Npb24vYWktbG9vcC9zdHJlYW0tdGV4dC50cyIsICIuLi9zcmMvc2tpbGxzL2Rpc2NvdmVyLnRzIiwgIi4uL3NyYy9za2lsbHMvcmVzb2x2ZS1ob3N0LnRzIiwgIi4uL3NyYy9za2lsbHMvcmVzb2x2ZS1pbmxpbmUudHMiLCAiLi4vc3JjL3NraWxscy9yZXNvbHZlLXJlbW90ZS50cyIsICIuLi9zcmMvc2tpbGxzL3Jlc29sdmUudHMiLCAiLi4vc3JjL3Rvb2xzL2luZGV4LnRzIiwgIi4uL3NyYy90b29scy9qYXZhc2NyaXB0LnRzIiwgIi4uL3NyYy90b29scy9uZWVkcy1hcHByb3ZhbC50cyIsICIuLi9zcmMvdXRpbHMvcHJvbXB0LWNhY2hlLnRzIiwgIi4uL3NyYy9zZXNzaW9uL3N0cmVhbS50cyIsICIuLi9zcmMvc2Vzc2lvbi91cGRhdGUudHMiLCAiLi4vc3JjL3Nlc3Npb24vdXNhZ2UudHMiLCAiLi4vc3JjL2FnZW50L3JlZ2lzdHJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5TW9kZWxJZCwgSW5mZXJVSVRvb2xzLCBUb29sU2V0LCBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEJpbmRpbmcgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4uL3NhbmRib3gvaGFuZGxlXCI7XG5pbXBvcnQgeyBzYW5kYm94SGFuZGxlIH0gZnJvbSBcIi4uL3NhbmRib3gvaGFuZGxlXCI7XG5pbXBvcnQgeyB0eXBlIFNlc3Npb25Db250ZXh0LCBzZXNzaW9uSGFuZGxlIH0gZnJvbSBcIi4uL3Nlc3Npb24vaGFuZGxlXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsSW5wdXQgfSBmcm9tIFwiLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2UsIHR5cGUgU3RvcmFnZUlucHV0LCB0b1N0b3JhZ2UgfSBmcm9tIFwiLi4vc3RvcmFnZS9hZGFwdGVyXCI7XG5pbXBvcnQgeyBrdlN0b3JhZ2VGYWxsYmFjayB9IGZyb20gXCIuLi9zdG9yYWdlL2JpbmRpbmdzL2t2XCI7XG5pbXBvcnQgeyBsb2NhbFN0b3JhZ2UgfSBmcm9tIFwiLi4vc3RvcmFnZS9lbnRyeVwiO1xuaW1wb3J0IHsgc2hvdWxkRmFsbGJhY2tUb0tWMiB9IGZyb20gXCIuLi9zdG9yYWdlL3Nob3VsZC1mYWxsYmFjay1rdjJcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbiB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgYnVpbHRJblRvb2xzIH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEFnZW50RGF0YVR5cGVzLFxuICB0eXBlIEFnZW50SG9va3MsXG4gIGdldEFnZW50LFxuICB0eXBlIE5lZWRzQXBwcm92YWxNYXAsXG4gIHJlZ2lzdGVyQWdlbnQsXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTZXNzaW9uIERlZmF1bHRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBTZXNzaW9uRGVmYXVsdHM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldD4gPSB7XG4gIG1vZGVsPzogR2F0ZXdheU1vZGVsSWQ7XG4gIHN5c3RlbT86IHN0cmluZztcbiAgZ2VuZXJhdGlvbj86IFNlc3Npb25bXCJnZW5lcmF0aW9uXCJdO1xuICBhY3RpdmVUb29scz86IChFeHRyYWN0PGtleW9mIFRvb2xzLCBzdHJpbmc+IHwgQnVpbHRJblRvb2xOYW1lKVtdO1xuICBza2lsbHM/OiBTa2lsbElucHV0W107XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWdlbnQgT3B0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHR5cGUgQWdlbnRPcHRpb25zPFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGRlZmF1bHQgYWxsb3dzIHR5cGUtZXJhc2VkIHVzYWdlXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IGFueSxcbiAgVFNhbmRib3hCaW5kaW5ncyBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSA9IFNhbmRib3hCaW5kaW5nLFxuICBUQ29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPiA9IFNlc3Npb25EZWZhdWx0czxUb29scz4gJiB7XG4gIHN0b3JhZ2U/OiBTdG9yYWdlSW5wdXQ7XG4gIHNhbmRib3g/OiBUU2FuZGJveEJpbmRpbmdzO1xuICB0b29scz86IFRvb2xzO1xuICBob29rcz86IEFnZW50SG9va3M7XG4gIG5lZWRzQXBwcm92YWw/OiBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPjtcbiAgY29udGV4dFNjaGVtYT86IHouWm9kVHlwZTxUQ29udGV4dD47XG4gIGxvZ2dpbmc/OiBPbWl0PExvZ2dpbmdDb25maWcsIFwibmFtZVwiPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbnRlcm5hbCBjb250ZXh0IGNhY2hlcyAoaGlkZGVuIGZyb20gcHVibGljIEFQSSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IHNlc3Npb25Db250ZXh0c01hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgU2Vzc2lvbkNvbnRleHQ+PigpO1xuY29uc3Qgc2FuZGJveENvbnRleHRzTWFwID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBTYW5kYm94Q29udGV4dD4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uQ29udGV4dHMoXG4gIGFnZW50OiBBbnlBZ2VudFxuKTogTWFwPHN0cmluZywgU2Vzc2lvbkNvbnRleHQ+IHtcbiAgbGV0IG1hcCA9IHNlc3Npb25Db250ZXh0c01hcC5nZXQoYWdlbnQpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBzZXNzaW9uQ29udGV4dHNNYXAuc2V0KGFnZW50LCBtYXApO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW5kYm94Q29udGV4dHMoXG4gIGFnZW50OiBBbnlBZ2VudFxuKTogTWFwPHN0cmluZywgU2FuZGJveENvbnRleHQ+IHtcbiAgbGV0IG1hcCA9IHNhbmRib3hDb250ZXh0c01hcC5nZXQoYWdlbnQpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBzYW5kYm94Q29udGV4dHNNYXAuc2V0KGFnZW50LCBtYXApO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBDbGFzcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBpbnRlbnRpb25hbGx5IGVyYXNlZCBcdTIwMTMgdXNpbmcgYGFueWAgYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyB3aXRoIHRvb2wtdHlwZWQgbWV0aG9kcyBsaWtlIGBzZW5kYFxuZXhwb3J0IHR5cGUgQW55QWdlbnQgPSBBZ2VudDxhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgdHlwZSBJbmZlclNlc3Npb248QWdlbnQgZXh0ZW5kcyBBbnlBZ2VudCA9IEFueUFnZW50PiA9IFJldHVyblR5cGU8XG4gIEFnZW50W1wic2Vzc2lvblwiXVxuPjtcbmV4cG9ydCB0eXBlIFNlc3Npb25TZW5kQXJnczxcbiAgQWdlbnQgZXh0ZW5kcyBBbnlBZ2VudCxcbiAgU2Vzc2lvbiBleHRlbmRzIEluZmVyU2Vzc2lvbjxBZ2VudD4gPSBJbmZlclNlc3Npb248QWdlbnQ+LFxuPiA9IFBhcmFtZXRlcnM8U2Vzc2lvbltcInNlbmRcIl0+O1xuXG5leHBvcnQgY2xhc3MgQWdlbnQ8XG4gIFRNZXNzYWdlTWV0YWRhdGEgPSB1bmtub3duLFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQgPSBUb29sU2V0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBvcHRpb25zOiBBZ2VudE9wdGlvbnM8VG9vbHMsIFRTYW5kYm94QmluZGluZ3MsIFRDb250ZXh0PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEFnZW50T3B0aW9uczxUb29scywgVFNhbmRib3hCaW5kaW5ncywgVENvbnRleHQ+XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSAoc2Vzc2lvbkhhbmRsZTxUb29scywgVENvbnRleHQ+KS5iaW5kKFxuICAgICAgbnVsbCxcbiAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBBbnlBZ2VudFxuICAgICk7XG4gICAgdGhpcy5zYW5kYm94ID0gKHNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4pLmJpbmQoXG4gICAgICBudWxsLFxuICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEFueUFnZW50XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogQW55QWdlbnQpIHtcbiAgICByZXR1cm4geyBuYW1lOiBpbnN0YW5jZS5uYW1lIH07XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX0RFU0VSSUFMSVpFXShkYXRhOiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldEFnZW50KGRhdGEubmFtZSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlZFN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZSB7XG4gICAgaWYgKHRoaXMuX3Jlc29sdmVkU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkU3RvcmFnZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVkU3RvcmFnZSA9IHRvU3RvcmFnZSh0aGlzLm9wdGlvbnMuc3RvcmFnZSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWRTdG9yYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgICBjb25maWc6IHsgLi4udGhpcy5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IHRoaXMubmFtZSB9LFxuICAgICAgc3Vic3lzdGVtOiBcInN0b3JhZ2VcIixcbiAgICB9KTtcblxuICAgIGlmIChzaG91bGRGYWxsYmFja1RvS1YyKCkpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgTm8gc3RvcmFnZSBhZGFwdGVyIGNvbmZpZ3VyZWQgXHUyMDE0IHVzaW5nIEtWMiAobmFtZXNwYWNlOiBcIiR7dGhpcy5uYW1lfVwiKS5gXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVzb2x2ZWRTdG9yYWdlID0gdG9TdG9yYWdlKFxuICAgICAgICBrdlN0b3JhZ2VGYWxsYmFjayh7IHByZWZpeDogdGhpcy5uYW1lIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkU3RvcmFnZTtcbiAgICB9XG5cbiAgICBsb2cud2FybihcbiAgICAgIFwiTm8gc3RvcmFnZSBhZGFwdGVyIGNvbmZpZ3VyZWQgXHUyMDE0IHVzaW5nIGxvY2FsU3RvcmFnZSgpLiBEYXRhIHdpbGwgbm90IHBlcnNpc3QgYWNyb3NzIHJlc3RhcnRzLlwiXG4gICAgKTtcbiAgICB0aGlzLl9yZXNvbHZlZFN0b3JhZ2UgPSB0b1N0b3JhZ2UobG9jYWxTdG9yYWdlKCkpO1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZFN0b3JhZ2U7XG4gIH1cblxuICBnZXQgdG9vbHMoKSB7XG4gICAgcmV0dXJuIHsgLi4uYnVpbHRJblRvb2xzLCAuLi50aGlzLm9wdGlvbnMudG9vbHMgfSBhcyB0eXBlb2YgYnVpbHRJblRvb2xzICZcbiAgICAgIFRvb2xzO1xuICB9XG5cbiAgZ2V0IHNlc3Npb25EZWZhdWx0cygpOiBTZXNzaW9uRGVmYXVsdHMge1xuICAgIGNvbnN0IHsgbW9kZWwsIHN5c3RlbSwgZ2VuZXJhdGlvbiwgYWN0aXZlVG9vbHMsIHNraWxscyB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHJldHVybiB7IG1vZGVsLCBzeXN0ZW0sIGdlbmVyYXRpb24sIGFjdGl2ZVRvb2xzLCBza2lsbHMgfTtcbiAgfVxuXG4gIGdldCBob29rcygpOiBBZ2VudEhvb2tzIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhvb2tzID8/IHt9O1xuICB9XG5cbiAgcmVhZG9ubHkgc2Vzc2lvbjtcblxuICByZWFkb25seSBzYW5kYm94O1xuXG4gIC8qKiBQaGFudG9tIHByb3BlcnR5IGZvciB0eXBlIGluZmVyZW5jZS4gVXNlIGB0eXBlb2YgbXlBZ2VudC4kVUlNZXNzYWdlYCB0byBnZXQgdGhlIHR5cGVkIFVJTWVzc2FnZS4gKi9cbiAgZGVjbGFyZSByZWFkb25seSAkVUlNZXNzYWdlOiBVSU1lc3NhZ2U8XG4gICAgVE1lc3NhZ2VNZXRhZGF0YSxcbiAgICBBZ2VudERhdGFUeXBlcyxcbiAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICA+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdlbnQ8XG4gIFRNZXNzYWdlTWV0YWRhdGEgPSB1bmtub3duLFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQgPSBUb29sU2V0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+KG5hbWU6IHN0cmluZywgb3B0aW9ucz86IEFnZW50T3B0aW9uczxUb29scywgVFNhbmRib3hCaW5kaW5ncywgVENvbnRleHQ+KSB7XG4gIGNvbnN0IGluc3RhbmNlID0gbmV3IEFnZW50PFxuICAgIFRNZXNzYWdlTWV0YWRhdGEsXG4gICAgVG9vbHMsXG4gICAgVFNhbmRib3hCaW5kaW5ncyxcbiAgICBUQ29udGV4dFxuICA+KG5hbWUsIG9wdGlvbnMpO1xuICByZWdpc3RlckFnZW50KG5hbWUsIGluc3RhbmNlKTtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBSZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHJlZ2lzdHJ5IHNvIGV4aXN0aW5nIGltcG9ydHMgZnJvbSBcIi4vYWdlbnQvY2xpZW50XCIga2VlcCB3b3JraW5nLlxuZXhwb3J0IHtcbiAgdHlwZSBBZ2VudERhdGFUeXBlcyxcbiAgdHlwZSBBZ2VudEhvb2tzLFxuICBBZ2VudFN0YXR1cyxcbiAgZ2V0QWdlbnQsXG4gIHR5cGUgSW5mZXJVSU1lc3NhZ2UsXG4gIHR5cGUgTmVlZHNBcHByb3ZhbE1hcCxcbiAgcmVnaXN0ZXJBZ2VudCxcbiAgdHlwZSBUeXBlZFVJTWVzc2FnZSxcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbiIsICJpbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgeyBnZXRTYW5kYm94Q29udGV4dHMgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hCaW5kaW5nLCBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIi4vZXhlY1wiO1xuaW1wb3J0IHsgZ2V0RG9tYWluIH0gZnJvbSBcIi4vZ2V0LWRvbWFpblwiO1xuaW1wb3J0IHsgZ2V0U3RhdHVzIH0gZnJvbSBcIi4vZ2V0LXN0YXR1c1wiO1xuaW1wb3J0IHsga2lsbCB9IGZyb20gXCIuL2tpbGxcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIi4vcmVhZC1maWxlXCI7XG5pbXBvcnQgeyBzZXR1cCB9IGZyb20gXCIuL3NldHVwXCI7XG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gXCIuL3NuYXBzaG90XCI7XG5pbXBvcnQgeyBzdGFydCB9IGZyb20gXCIuL3N0YXJ0XCI7XG5pbXBvcnQgeyBzdG9wIH0gZnJvbSBcIi4vc3RvcFwiO1xuaW1wb3J0IHsgdXBkYXRlTmV0d29ya1BvbGljeSB9IGZyb20gXCIuL3VwZGF0ZS1uZXR3b3JrLXBvbGljeVwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlcyB9IGZyb20gXCIuL3dyaXRlLWZpbGVzXCI7XG5cbmV4cG9ydCB0eXBlIFNhbmRib3hDb250ZXh0ID0ge1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIHNhbmRib3hJZDogc3RyaW5nO1xuICBfcGVuZGluZ1NldHVwPzogUHJvbWlzZTxTYW5kYm94SW5zdGFuY2U+O1xuICBfY3dkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2FuZGJveE9wdGlvbnMgPSB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNhbmRib3hIYW5kbGU8XG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10sXG4+KGFnZW50OiBBbnlBZ2VudCwgaWQ/OiBzdHJpbmcgfCBTYW5kYm94T3B0aW9ucykge1xuICBjb25zdCBzYW5kYm94SWQgPVxuICAgIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogKGlkPy5pZCA/PyBgc2FuZGJveF8ke3VsaWQoKX1gKTtcblxuICBjb25zdCBjb250ZXh0cyA9IGdldFNhbmRib3hDb250ZXh0cyhhZ2VudCk7XG4gIGxldCBzYW5kYm94Q29udGV4dCA9IGNvbnRleHRzLmdldChzYW5kYm94SWQpO1xuICBpZiAoIXNhbmRib3hDb250ZXh0KSB7XG4gICAgc2FuZGJveENvbnRleHQgPSB7IGFnZW50LCBzYW5kYm94SWQgfTtcbiAgICBjb250ZXh0cy5zZXQoc2FuZGJveElkLCBzYW5kYm94Q29udGV4dCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkOiBzYW5kYm94SWQsXG4gICAgZ2V0IGN3ZCgpIHtcbiAgICAgIHJldHVybiBzYW5kYm94Q29udGV4dCEuX2N3ZCA/PyBcIi5cIjtcbiAgICB9LFxuICAgIHNldHVwOiAoc2V0dXA8VFNhbmRib3hCaW5kaW5ncz4pLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIGV4ZWM6IGV4ZWMuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgcmVhZEZpbGU6IHJlYWRGaWxlLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHdyaXRlRmlsZXM6IHdyaXRlRmlsZXMuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgZ2V0RG9tYWluOiBnZXREb21haW4uYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgdXBkYXRlTmV0d29ya1BvbGljeTogdXBkYXRlTmV0d29ya1BvbGljeS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBzdGFydDogc3RhcnQuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgc3RvcDogc3RvcC5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBraWxsOiBraWxsLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHNuYXBzaG90OiBzbmFwc2hvdC5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBnZXRTdGF0dXM6IGdldFN0YXR1cy5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgfTtcbn1cbiIsICJleHBvcnQgY29uc3QgaXNWZXJjZWwgPSBhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBnZXRWZXJjZWxPaWRjVG9rZW4gfSA9IGF3YWl0IGltcG9ydChcIkB2ZXJjZWwvb2lkY1wiKTtcbiAgICByZXR1cm4gQm9vbGVhbihhd2FpdCBnZXRWZXJjZWxPaWRjVG9rZW4oKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbiIsICJpbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25Ob3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBmYWlsZWQ6ICRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94Tm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveE5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTYW5kYm94ICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlQ29uZmxpY3RFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RvcmFnZUNvbmZsaWN0RXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94RXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgTWVzc2FnZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIk1lc3NhZ2VOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiTWVzc2FnZSAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuIiwgImltcG9ydCB7IGlzVmVyY2VsIH0gZnJvbSBcIi4uL2FnZW50L2lzLXZlcmNlbFwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yLCBTYW5kYm94Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNhbmRib3hCaW5kaW5nLFxuICBTYW5kYm94SW5zdGFuY2UsXG4gIFNhbmRib3hTZXR1cEZpZWxkcyxcbiAgV2l0aENvbmZpZyxcbn0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBCdWlsdEluQmluZGluZ3MgfSBmcm9tIFwiLi9iaW5kaW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5jb25zdCBQT0xMX0lOVEVSVkFMX01TID0gNTA7XG5jb25zdCBQT0xMX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG50eXBlIFNldHVwQ29tbW9uRmllbGRzID0gUGFydGlhbDxTYW5kYm94U2V0dXBGaWVsZHM+ICYge1xuICBjd2Q/OiBzdHJpbmc7XG4gIHJ1bj86IChzYW5kYm94OiBTYW5kYm94SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD47XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufTtcblxudHlwZSBUb0JpbmRpbmdVbmlvbjxUIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdPiA9XG4gIFQgZXh0ZW5kcyBTYW5kYm94QmluZGluZ1tdID8gVFtudW1iZXJdIDogVDtcblxudHlwZSBTZXR1cE9wdHNGb3JCaW5kaW5nPEIgZXh0ZW5kcyBTYW5kYm94QmluZGluZz4gPVxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IC5cbiAgQiBleHRlbmRzIFNhbmRib3hCaW5kaW5nPGluZmVyIFQsIGluZmVyIEMsIGFueT5cbiAgICA/IHsgdHlwZTogVCB9ICYgU2V0dXBDb21tb25GaWVsZHMgJiBXaXRoQ29uZmlnPEM+XG4gICAgOiBuZXZlcjtcblxudHlwZSBJc0RlZmF1bHQ8VCBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXT4gPVxuICBTYW5kYm94QmluZGluZyBleHRlbmRzIFQgPyB0cnVlIDogZmFsc2U7XG5cbmV4cG9ydCB0eXBlIFNldHVwT3B0czxcbiAgVFNhbmRib3hCaW5kaW5ncyBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSxcbj4gPVxuICB8IFNldHVwT3B0c0ZvckJpbmRpbmc8XG4gICAgICBJc0RlZmF1bHQ8VFNhbmRib3hCaW5kaW5ncz4gZXh0ZW5kcyB0cnVlXG4gICAgICAgID8gQnVpbHRJbkJpbmRpbmdzXG4gICAgICAgIDogVG9CaW5kaW5nVW5pb248VFNhbmRib3hCaW5kaW5ncz5cbiAgICA+XG4gIHwgKFNldHVwQ29tbW9uRmllbGRzICYgeyB0eXBlPzogbmV2ZXIgfSk7XG5cbmV4cG9ydCB0eXBlIFNldHVwUmVzdWx0ID0ge1xuICBkb25lOiBQcm9taXNlPFNhbmRib3hJbnN0YW5jZT47XG59O1xuXG5mdW5jdGlvbiBpc1NpbmdsZUJpbmRpbmcoXG4gIHNhbmRib3g6IFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXVxuKTogc2FuZGJveCBpcyBTYW5kYm94QmluZGluZyB7XG4gIHJldHVybiAhQXJyYXkuaXNBcnJheShzYW5kYm94KTtcbn1cblxuLyoqIEF1dG8tZGV0ZWN0IHRoZSBkZWZhdWx0IGJpbmRpbmc6IHZlcmNlbCBcdTIxOTIgZG9ja2VyIFx1MjE5MiBsb2NhbCBjYXNjYWRlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGVmYXVsdEJpbmRpbmcoKTogUHJvbWlzZTxTYW5kYm94QmluZGluZz4ge1xuICBpZiAoYXdhaXQgaXNWZXJjZWwoKSkge1xuICAgIGNvbnN0IHsgdmVyY2VsU2FuZGJveCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9iaW5kaW5ncy92ZXJjZWxcIik7XG4gICAgcmV0dXJuIHZlcmNlbFNhbmRib3goKTtcbiAgfVxuXG4gIGlmIChhd2FpdCBpc0RvY2tlckF2YWlsYWJsZSgpKSB7XG4gICAgY29uc3QgeyBkb2NrZXJTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL2JpbmRpbmdzL2RvY2tlclwiKTtcbiAgICByZXR1cm4gZG9ja2VyU2FuZGJveCgpO1xuICB9XG5cbiAgY29uc3QgeyBsb2NhbFNhbmRib3ggfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvbG9jYWxcIik7XG4gIHJldHVybiBsb2NhbFNhbmRib3goKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNEb2NrZXJBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBleGVjU3luYyB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICAgIGV4ZWNTeW5jKFwiZG9ja2VyIHNhbmRib3ggLS1oZWxwXCIsIHsgc3RkaW86IFwiaWdub3JlXCIsIHRpbWVvdXQ6IDUwMDAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQmluZGluZyhcbiAgc2FuZGJveDogU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdIHwgdW5kZWZpbmVkLFxuICB0eXBlPzogc3RyaW5nXG4pOiBQcm9taXNlPHsgYmluZGluZzogU2FuZGJveEJpbmRpbmc7IGJpbmRpbmdOYW1lOiBzdHJpbmcgfT4ge1xuICBpZiAoIXNhbmRib3gpIHtcbiAgICBjb25zdCBiaW5kaW5nID0gYXdhaXQgZ2V0RGVmYXVsdEJpbmRpbmcoKTtcbiAgICByZXR1cm4geyBiaW5kaW5nLCBiaW5kaW5nTmFtZTogYmluZGluZy50eXBlIH07XG4gIH1cbiAgaWYgKGlzU2luZ2xlQmluZGluZyhzYW5kYm94KSkge1xuICAgIHJldHVybiB7IGJpbmRpbmc6IHNhbmRib3gsIGJpbmRpbmdOYW1lOiBzYW5kYm94LnR5cGUgfTtcbiAgfVxuICBpZiAodHlwZSkge1xuICAgIGNvbnN0IG1hdGNoID0gc2FuZGJveC5maW5kKChiKSA9PiBiLnR5cGUgPT09IHR5cGUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICByZWFzb246IGBVbmtub3duIGJpbmRpbmcgdHlwZTogXCIke3R5cGV9XCIuIEF2YWlsYWJsZTogJHtzYW5kYm94Lm1hcCgoYikgPT4gYi50eXBlKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBiaW5kaW5nOiBtYXRjaCwgYmluZGluZ05hbWU6IG1hdGNoLnR5cGUgfTtcbiAgfVxuICBpZiAoc2FuZGJveC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIk5vIHNhbmRib3ggYmluZGluZ3MgY29uZmlndXJlZFwiIH0pO1xuICB9XG4gIHJldHVybiB7IGJpbmRpbmc6IHNhbmRib3hbMF0sIGJpbmRpbmdOYW1lOiBzYW5kYm94WzBdLnR5cGUgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdLFxuPihcbiAgY3R4OiBTYW5kYm94Q29udGV4dCxcbiAgb3B0cz86IFNldHVwT3B0czxUU2FuZGJveEJpbmRpbmdzPlxuKTogUHJvbWlzZTxTZXR1cFJlc3VsdD4ge1xuICBpZiAoY3R4Ll9wZW5kaW5nU2V0dXApIHtcbiAgICByZXR1cm4geyBkb25lOiBjdHguX3BlbmRpbmdTZXR1cCB9O1xuICB9XG5cbiAgY29uc3QgYWdlbnQgPSBjdHguYWdlbnQ7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7IC4uLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJzYW5kYm94OnNldHVwXCIsXG4gICAgY29udGV4dDogeyBzYW5kYm94SWQ6IGN0eC5zYW5kYm94SWQgfSxcbiAgfSk7XG5cbiAgY29uc3QgZG9uZVJlc29sdmVCaW5kaW5nID0gbG9nLnRpbWUoXCJyZXNvbHZlIGJpbmRpbmdcIiwge1xuICAgIHJlcXVlc3RlZFR5cGU6IG9wdHM/LnR5cGUsXG4gIH0pO1xuICBjb25zdCB7IGJpbmRpbmcsIGJpbmRpbmdOYW1lIH0gPSBhd2FpdCByZXNvbHZlQmluZGluZyhcbiAgICBhZ2VudC5vcHRpb25zLnNhbmRib3gsXG4gICAgb3B0cz8udHlwZVxuICApO1xuICBkb25lUmVzb2x2ZUJpbmRpbmcoKTtcblxuICBpZiAob3B0cz8uY3dkKSB7XG4gICAgY3R4Ll9jd2QgPSBvcHRzLmN3ZDtcbiAgfVxuXG4gIGNvbnN0IHNldHVwTG9nID0gbG9nLndpdGhDb250ZXh0KHtcbiAgICBiaW5kaW5nOiBiaW5kaW5nTmFtZSxcbiAgICB2ZXJzaW9uOiBvcHRzPy52ZXJzaW9uLFxuICB9KTtcblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQ29uZnVzaW5nVm9pZFR5cGU6IC5cbiAgbGV0IHJlc29sdmVCbG9ja2luZ1Byb21pc2UgPSAodmFsdWU6IHZvaWQpID0+IHZhbHVlO1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5QmxvY2tTdGF0ZW1lbnRzOiAuXG4gIGxldCByZWplY3RCbG9ja2luZ1Byb21pc2UgPSAoX3JlYXNvbj86IGFueSkgPT4ge307XG4gIGNvbnN0IGJsb2NraW5nUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXNvbHZlQmxvY2tpbmdQcm9taXNlID0gcmVzb2x2ZTtcbiAgICByZWplY3RCbG9ja2luZ1Byb21pc2UgPSByZWplY3Q7XG4gIH0pO1xuXG4gIGN0eC5fcGVuZGluZ1NldHVwID0gKGFzeW5jICgpID0+IHtcbiAgICBsZXQgc2xlZXBPbGRJbnN0YW5jZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkb25lUGVuZGluZ1NldHVwID0gc2V0dXBMb2cudGltZShcInBlbmRpbmcgc2V0dXBcIik7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZG9uZVN0b3JhZ2VHZXQgPSBzZXR1cExvZy50aW1lKFwic3RvcmFnZS5zYW5kYm94LmdldFwiKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gICAgICBkb25lU3RvcmFnZUdldCgpO1xuXG4gICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25NYXRjaGVzID1cbiAgICAgICAgICAhb3B0cz8udmVyc2lvbiB8fCByZWNvcmQuc2V0dXA/LnZlcnNpb24gPT09IG9wdHMudmVyc2lvbjtcblxuICAgICAgICBpZiAodmVyc2lvbk1hdGNoZXMgJiYgcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcbiAgICAgICAgICBjb25zdCBkb25lQ29ubmVjdEV4aXN0aW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwiY29ubmVjdCBleGlzdGluZyBzYW5kYm94XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNldHVwU3RhdGU6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiByZWNvcmQuc2V0dXAubWV0YWRhdGEsXG4gICAgICAgICAgICBzaWduYWw6IG9wdHM/LnNpZ25hbCxcbiAgICAgICAgICAgIGxvZzogc2V0dXBMb2csXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZG9uZUNvbm5lY3RFeGlzdGluZygpO1xuICAgICAgICAgIGN0eC5fY3dkID0gaW5zdGFuY2UuY3dkO1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZXJzaW9uTWF0Y2hlcyAmJiAhcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcbiAgICAgICAgICBjb25zdCBkb25lUG9sbFVudGlsUmVhZHkgPSBzZXR1cExvZy50aW1lKFwicG9sbCB1bnRpbCByZWFkeVwiKTtcbiAgICAgICAgICBhd2FpdCBwb2xsVW50aWxSZWFkeShjdHgsIG9wdHM/LnNpZ25hbCk7XG4gICAgICAgICAgZG9uZVBvbGxVbnRpbFJlYWR5KCk7XG5cbiAgICAgICAgICBjb25zdCBkb25lU3RvcmFnZUdldFBvc3RQb2xsID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwic3RvcmFnZS5zYW5kYm94LmdldCAocG9zdC1wb2xsKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZWFkeSA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gICAgICAgICAgZG9uZVN0b3JhZ2VHZXRQb3N0UG9sbCgpO1xuXG4gICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGN0eC5zYW5kYm94SWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRvbmVDb25uZWN0RXhpc3RpbmcgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICAgICAgXCJjb25uZWN0IGV4aXN0aW5nIHNhbmRib3hcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc2V0dXBTdGF0ZTogXCJwb3N0LXBvbGxcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgYmluZGluZy5jb25uZWN0KHtcbiAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlYWR5LnNldHVwLm1ldGFkYXRhLFxuICAgICAgICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgICAgICAgICBsb2c6IHNldHVwTG9nLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRvbmVDb25uZWN0RXhpc3RpbmcoKTtcbiAgICAgICAgICBjdHguX2N3ZCA9IGluc3RhbmNlLmN3ZDtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVjb3JkLnNldHVwLm1ldGFkYXRhKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSW5zdGFuY2VNZXRhZGF0YSA9IHJlY29yZC5zZXR1cC5tZXRhZGF0YTtcbiAgICAgICAgICBzbGVlcE9sZEluc3RhbmNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVTdG9wT2xkSW5zdGFuY2UgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICAgICAgICBcInN0b3Agb2xkIHNhbmRib3ggaW5zdGFuY2VcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9sZCA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG9sZEluc3RhbmNlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbG9nOiBzZXR1cExvZyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGF3YWl0IG9sZC5zdG9wKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgZG9uZVN0b3BPbGRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lU3RvcE9sZEluc3RhbmNlKCk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc2V0dXBfOiBTYW5kYm94W1wic2V0dXBcIl0gPSB7XG4gICAgICAgIGJpbmRpbmc6IGJpbmRpbmdOYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRzPy52ZXJzaW9uID8/IHJlY29yZD8uc2V0dXA/LnZlcnNpb24gPz8gbnVsbCxcbiAgICAgICAgbmV0d29ya1BvbGljeTpcbiAgICAgICAgICBvcHRzPy5uZXR3b3JrUG9saWN5ID8/IHJlY29yZD8uc2V0dXA/Lm5ldHdvcmtQb2xpY3kgPz8gbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmV3UmVjb3JkOiBTYW5kYm94ID0ge1xuICAgICAgICBpZDogY3R4LnNhbmRib3hJZCxcbiAgICAgICAgc2V0dXA6IHNldHVwXyxcbiAgICAgICAgY3JlYXRlZEF0OiByZWNvcmQ/LmNyZWF0ZWRBdCA/PyBub3csXG4gICAgICAgIGxhc3RBY3RpdmVBdDogbm93LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZG9uZVN0b3JhZ2VTZXRQZW5kaW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgXCJzdG9yYWdlLnNhbmRib3guc2V0IChzZXR1cCBwZW5kaW5nKVwiXG4gICAgICApO1xuICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LnNldChjdHguc2FuZGJveElkLCBuZXdSZWNvcmQpO1xuICAgICAgZG9uZVN0b3JhZ2VTZXRQZW5kaW5nKCk7XG5cbiAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcblxuICAgICAgY29uc3QgZG9uZUJpbmRpbmdDcmVhdGUgPSBzZXR1cExvZy50aW1lKFwiYmluZGluZy5jcmVhdGVcIik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiaW5kaW5nLmNyZWF0ZSh7XG4gICAgICAgIGN3ZDogY3R4Ll9jd2QgPz8gXCIuXCIsXG4gICAgICAgIGFnZW50LFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG9wdHMgaXMgYSB1bmlvbjsgY29uZmlnIGV4aXN0cyBvbiBiaW5kaW5nLXNwZWNpZmljIGJyYW5jaGVzXG4gICAgICAgIHNldHVwOiB7IC4uLnNldHVwXywgcnVuOiBvcHRzPy5ydW4sIGNvbmZpZzogKG9wdHMgYXMgYW55KT8uY29uZmlnIH0sXG4gICAgICAgIHJlY29yZDogbmV3UmVjb3JkLFxuICAgICAgICBzaWduYWw6IG9wdHM/LnNpZ25hbCxcbiAgICAgICAgbG9nOiBzZXR1cExvZyxcbiAgICAgIH0pO1xuICAgICAgZG9uZUJpbmRpbmdDcmVhdGUoKTtcblxuICAgICAgc2V0dXBfLmNvbXBsZXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHNldHVwXy5tZXRhZGF0YSA9IHJlc3VsdC5tZXRhZGF0YTtcblxuICAgICAgY29uc3QgZG9uZVN0b3JhZ2VVcGRhdGVDb21wbGV0ZSA9IHNldHVwTG9nLnRpbWUoXG4gICAgICAgIFwic3RvcmFnZS5zYW5kYm94LnVwZGF0ZSAoc2V0dXAgY29tcGxldGUpXCJcbiAgICAgICk7XG4gICAgICBhd2FpdCBhZ2VudC5zdG9yYWdlLnNhbmRib3gudXBkYXRlKGN0eC5zYW5kYm94SWQsIHtcbiAgICAgICAgc2V0dXA6IHNldHVwXyxcbiAgICAgICAgbGFzdEFjdGl2ZUF0OiBEYXRlLm5vdygpLFxuICAgICAgfSk7XG4gICAgICBkb25lU3RvcmFnZVVwZGF0ZUNvbXBsZXRlKCk7XG5cbiAgICAgIGN0eC5fY3dkID0gcmVzdWx0Lmluc3RhbmNlLmN3ZDtcbiAgICAgIHJldHVybiByZXN1bHQuaW5zdGFuY2U7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjdHguX3BlbmRpbmdTZXR1cCA9IHVuZGVmaW5lZDtcbiAgICAgIHJlamVjdEJsb2NraW5nUHJvbWlzZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBkb25lRmluYWxpemUgPSBzZXR1cExvZy50aW1lKFwiZmluYWxpemUgc2V0dXBcIik7XG4gICAgICBhd2FpdCBzbGVlcE9sZEluc3RhbmNlO1xuICAgICAgZG9uZUZpbmFsaXplKCk7XG4gICAgICBkb25lUGVuZGluZ1NldHVwKCk7XG4gICAgfVxuICB9KSgpO1xuXG4gIGNvbnN0IGRvbmVXYWl0Rm9yVW5ibG9jayA9IHNldHVwTG9nLnRpbWUoXCJ3YWl0IGZvciBzZXR1cCB1bmJsb2NrXCIpO1xuICBhd2FpdCBibG9ja2luZ1Byb21pc2U7XG4gIGRvbmVXYWl0Rm9yVW5ibG9jaygpO1xuICByZXR1cm4geyBkb25lOiBjdHguX3BlbmRpbmdTZXR1cCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShcbiAgY3R4OiBTYW5kYm94Q29udGV4dCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8U2FuZGJveEluc3RhbmNlPiB7XG4gIGNvbnN0IGFnZW50ID0gY3R4LmFnZW50O1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpyZXNvbHZlXCIsXG4gICAgY29udGV4dDogeyBzYW5kYm94SWQ6IGN0eC5zYW5kYm94SWQgfSxcbiAgfSk7XG5cbiAgaWYgKGN0eC5fcGVuZGluZ1NldHVwKSB7XG4gICAgcmV0dXJuIGF3YWl0IGN0eC5fcGVuZGluZ1NldHVwO1xuICB9XG5cbiAgbGV0IHJlY29yZCA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICBjb25zdCB7IGRvbmUgfSA9IGF3YWl0IHNldHVwKGN0eCwgeyBzaWduYWwgfSk7XG4gICAgcmV0dXJuIGF3YWl0IGRvbmU7XG4gIH1cblxuICBpZiAoIXJlY29yZC5zZXR1cD8uY29tcGxldGVkQXQpIHtcbiAgICBhd2FpdCBwb2xsVW50aWxSZWFkeShjdHgsIHNpZ25hbCk7XG4gICAgcmVjb3JkID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LmdldChjdHguc2FuZGJveElkKTtcbiAgfVxuXG4gIGlmICghcmVjb3JkKSB7XG4gICAgdGhyb3cgbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGN0eC5zYW5kYm94SWQgfSk7XG4gIH1cblxuICBjb25zdCB7IGJpbmRpbmcgfSA9IGF3YWl0IHJlc29sdmVCaW5kaW5nKFxuICAgIGN0eC5hZ2VudC5vcHRpb25zLnNhbmRib3gsXG4gICAgcmVjb3JkLnNldHVwLmJpbmRpbmdcbiAgKTtcblxuICBhZ2VudC5zdG9yYWdlLnNhbmRib3hcbiAgICAudXBkYXRlKGN0eC5zYW5kYm94SWQsIHsgbGFzdEFjdGl2ZUF0OiBEYXRlLm5vdygpIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgbG9nLmVycm9yKFwiRmFpbGVkIHRvIHVwZGF0ZSBzYW5kYm94IGxhc3RBY3RpdmVBdFwiLCB7IGVycm9yIH0pO1xuICAgIH0pO1xuXG4gIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgYmluZGluZy5jb25uZWN0KHtcbiAgICBhZ2VudCxcbiAgICBtZXRhZGF0YTogcmVjb3JkLnNldHVwLm1ldGFkYXRhLFxuICAgIHNpZ25hbCxcbiAgICBsb2csXG4gIH0pO1xuICBjdHguX2N3ZCA9IGluc3RhbmNlLmN3ZDtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwb2xsVW50aWxSZWFkeShcbiAgY3R4OiBTYW5kYm94Q29udGV4dCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBQT0xMX1RJTUVPVVRfTVM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGN0eC5hZ2VudC5zdG9yYWdlLnNhbmRib3guZ2V0KGN0eC5zYW5kYm94SWQpO1xuICAgIGlmIChyZWNvcmQ/LnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfSU5URVJWQUxfTVMpKTtcbiAgfVxuXG4gIHRocm93IG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgIHJlYXNvbjogYFRpbWVkIG91dCB3YWl0aW5nIGZvciBzYW5kYm94IFwiJHtjdHguc2FuZGJveElkfVwiIHNldHVwIHRvIGNvbXBsZXRlYCxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWMoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJleGVjXCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LmV4ZWMoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvbWFpbihcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImdldERvbWFpblwiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5nZXREb21haW4oLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YXR1cyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImdldFN0YXR1c1wiXT5cbikge1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5nZXRTdGF0dXMoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGwoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJraWxsXCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LmtpbGwoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wicmVhZEZpbGVcIl0+XG4pIHtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYngucmVhZEZpbGUoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNuYXBzaG90KFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic25hcHNob3RcIl0+XG4pIHtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYnguc25hcHNob3QoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic3RhcnRcIl0+XG4pIHtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYnguc3RhcnQoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3AoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJzdG9wXCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnN0b3AoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU5ldHdvcmtQb2xpY3koXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJ1cGRhdGVOZXR3b3JrUG9saWN5XCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnVwZGF0ZU5ldHdvcmtQb2xpY3koLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZXMoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJ3cml0ZUZpbGVzXCJdPlxuKSB7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LndyaXRlRmlsZXMoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgeyBnZXRTZXNzaW9uQ29udGV4dHMgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgeyBoaXN0b3J5IH0gZnJvbSBcIi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgaW50ZXJydXB0IH0gZnJvbSBcIi4vaW50ZXJydXB0XCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcIi4vc2VuZFwiO1xuaW1wb3J0IHsgc3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtXCI7XG5pbXBvcnQgeyB1cGRhdGUgfSBmcm9tIFwiLi91cGRhdGVcIjtcbmltcG9ydCB7IHVzYWdlIH0gZnJvbSBcIi4vdXNhZ2VcIjtcblxudHlwZSBTZXNzaW9uT3B0aW9ucyA9IHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZXNzaW9uQ29udGV4dCA9IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXNzaW9uSGFuZGxlPFRvb2xzIGV4dGVuZHMgVG9vbFNldCwgVENvbnRleHQ+KFxuICBhZ2VudDogQW55QWdlbnQsXG4gIGlkPzogc3RyaW5nIHwgU2Vzc2lvbk9wdGlvbnNcbikge1xuICBjb25zdCBzZXNzaW9uSWQgPVxuICAgIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogKGlkPy5pZCA/PyBgc2Vzc2lvbl8ke3VsaWQoKX1gKTtcblxuICBjb25zdCBjb250ZXh0cyA9IGdldFNlc3Npb25Db250ZXh0cyhhZ2VudCk7XG4gIGxldCBzZXNzaW9uQ29udGV4dCA9IGNvbnRleHRzLmdldChzZXNzaW9uSWQpO1xuICBpZiAoIXNlc3Npb25Db250ZXh0KSB7XG4gICAgc2Vzc2lvbkNvbnRleHQgPSB7IGFnZW50LCBzZXNzaW9uSWQgfTtcbiAgICBjb250ZXh0cy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgc2VuZDogKHNlbmQ8VG9vbHMsIFRDb250ZXh0PikuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgc3RyZWFtOiBzdHJlYW0uYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgaGlzdG9yeTogKGhpc3Rvcnk8VG9vbHM+KS5iaW5kKG51bGwsIHNlc3Npb25Db250ZXh0KSxcbiAgICBpbnRlcnJ1cHQ6IGludGVycnVwdC5iaW5kKG51bGwsIHNlc3Npb25Db250ZXh0KSxcbiAgICB1c2FnZTogdXNhZ2UuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgdXBkYXRlOiAodXBkYXRlPFRvb2xzPikuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBJbmZlclVJVG9vbHMsXG4gIFJlYXNvbmluZ1VJUGFydCxcbiAgVGV4dFVJUGFydCxcbiAgVG9vbFNldCxcbiAgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnREYXRhVHlwZXMgfSBmcm9tIFwiLi4vYWdlbnQvcmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbi8qKiBTdWItdG9vbCBwYXJ0cyAoZnJvbSBKYXZhU2NyaXB0IG1ldGEtdG9vbCkgdXNlIHRoaXMgdG9vbENhbGxJZCBwcmVmaXguICovXG5mdW5jdGlvbiBpc1N1YlRvb2xQYXJ0KHBhcnQ6IFBhcnQpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBhcnQucGFydCBhcyB7IHRvb2xDYWxsSWQ/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIHR5cGVvZiBwPy50b29sQ2FsbElkID09PSBcInN0cmluZ1wiICYmIHAudG9vbENhbGxJZC5zdGFydHNXaXRoKFwianNfdGNfXCIpO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbWluZ0NvbnRlbnQoXG4gIHBhcnQ6IHVua25vd25cbik6IHBhcnQgaXMgVGV4dFVJUGFydCB8IFJlYXNvbmluZ1VJUGFydCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBwYXJ0ICE9PSBudWxsICYmXG4gICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiIHx8IHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmdcIilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SW50ZXJydXB0Q3V0b2ZmKHtcbiAgcGFydHMsXG4gIGxhc3RQYXJ0LFxufToge1xuICBwYXJ0czogUGFydFtdO1xuICBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH07XG59KTogUGFydFtdIHtcbiAgcmV0dXJuIHBhcnRzXG4gICAgLmZpbHRlcigocCkgPT4gcC5pbmRleCA8PSBsYXN0UGFydC5pbmRleClcbiAgICAubWFwKChwKSA9PiB7XG4gICAgICBpZiAocC5pbmRleCAhPT0gbGFzdFBhcnQuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIE9ubHkgcmVwbGFjZSBjb250ZW50IGZvciBzdHJlYW1pbmcgcGFydHMgKHRleHQsIHJlYXNvbmluZykgd2hlcmUgdGhlXG4gICAgICAgKiBjbGllbnQncyB0cnVuY2F0ZWQgdmVyc2lvbiBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHNlcnZlcidzIGZ1bGxcbiAgICAgICAqIHZlcnNpb24uIEZvciBzdGF0ZWZ1bCBwYXJ0cyAodG9vbHMpLCB0aGUgc2VydmVyJ3MgdmVyc2lvbiBpc1xuICAgICAgICogYXV0aG9yaXRhdGl2ZSBcdTIwMTQgaXQgbWF5IGhhdmUgZXZvbHZlZCAoZS5nLiBhcHByb3ZhbC1yZXF1ZXN0ZWQgXHUyMTkyXG4gICAgICAgKiBvdXRwdXQtZGVuaWVkKSBhZnRlciB0aGUgY2xpZW50IHNuYXBzaG90IHdhcyB0YWtlbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzU3RyZWFtaW5nQ29udGVudChsYXN0UGFydC5wYXJ0KSkge1xuICAgICAgICByZXR1cm4geyAuLi5wLCBwYXJ0OiBsYXN0UGFydC5wYXJ0IH0gYXMgUGFydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVSU1lc3NhZ2VzPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4ob3B0czoge1xuICBtZXNzYWdlczogTWVzc2FnZVtdO1xuICBwYXJ0czogUGFydFtdO1xuICB1bnRpbD86IG51bWJlcjtcbiAgaW5jbHVkZVF1ZXVlZD86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGZpbHRlcnMgb3V0IHN1Yi10b29sIHBhcnRzIHNvIHRoZSBMTE0gZG9lc24ndCBzZWUgdGhlbS4gKi9cbiAgZXhjbHVkZVN1YlRvb2xQYXJ0cz86IGJvb2xlYW47XG59KSB7XG4gIHR5cGUgVHlwZWRVSU1lc3NhZ2UgPSBVSU1lc3NhZ2U8dW5rbm93biwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUb29scz4+O1xuXG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gU29ydCBieSBjcmVhdGVkQXQgc28gbWVzc2FnZXMgYXJlIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgcmVnYXJkbGVzcyBvZlxuICAvLyBob3cgdGhlIHN0b3JhZ2UgbGF5ZXIgcmV0dXJucyB0aGVtIChlLmcuIGxvY2FsIEZTIHJlYWRzIGluIHJlYWRkaXIgb3JkZXIpLlxuICBmaWx0ZXJlZCA9IFsuLi5maWx0ZXJlZF0uc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkQXQgLSBiLmNyZWF0ZWRBdCk7XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBtZXNzYWdlSWQgPSBTdHJpbmcocGFydC5tZXNzYWdlSWQpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQobWVzc2FnZUlkLCBleGlzdGluZyk7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRcbiAgICAubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlSWQgPSBTdHJpbmcobS5pZCk7XG4gICAgICBsZXQgbWVzc2FnZVBhcnRzID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCkgPz8gW107XG4gICAgICBtZXNzYWdlUGFydHMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICBpZiAobS5pbnRlcnJ1cHRlZExhc3RQYXJ0ICE9IG51bGwpIHtcbiAgICAgICAgbWVzc2FnZVBhcnRzID0gYXBwbHlJbnRlcnJ1cHRDdXRvZmYoe1xuICAgICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMsXG4gICAgICAgICAgbGFzdFBhcnQ6IG0uaW50ZXJydXB0ZWRMYXN0UGFydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHJvbGU6IG0ucm9sZSxcbiAgICAgICAgcGFydHM6IG1lc3NhZ2VQYXJ0cy5tYXAoKHApID0+IHAucGFydCksXG4gICAgICAgIC4uLihtLm1ldGFkYXRhICE9IG51bGwgPyB7IG1ldGFkYXRhOiBtLm1ldGFkYXRhIH0gOiB7fSksXG4gICAgICB9IGFzIFR5cGVkVUlNZXNzYWdlO1xuICAgIH0pXG4gICAgLmZpbHRlcigobSkgPT4gbS5wYXJ0cy5sZW5ndGggPiAwKTtcbn1cbiIsICJleHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVSZWFkVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlV3JpdGVUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBVc2FnZVN1bW1hcnkgPSB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICB0b3RhbFRva2VuczogbnVtYmVyO1xuICBjYWNoZVJlYWRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVXcml0ZVRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdUb2tlbnM6IG51bWJlcjtcbiAgc3RlcENvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBTZXNzaW9uVXNhZ2UgPSB7XG4gIHRvdGFsOiBVc2FnZVN1bW1hcnkgJiB7IG1lc3NhZ2VDb3VudDogbnVtYmVyIH07XG4gIGJ5TWVzc2FnZUlkOiBSZWNvcmQ8c3RyaW5nLCBVc2FnZVN1bW1hcnkgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2Vzc2lvblVzYWdlKFxuICBtZXNzYWdlczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNhZ2U6IHsgc3RlcHM6IFN0ZXBVc2FnZVtdOyBzdW1tYXJ5OiBVc2FnZVN1bW1hcnkgfSB8IG51bGw7XG4gIH0+XG4pOiBTZXNzaW9uVXNhZ2Uge1xuICBjb25zdCBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD4gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgYnlNZXNzYWdlSWRbbS5pZF0gPSBtLnVzYWdlPy5zdW1tYXJ5ID8/IG51bGw7XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXMgPSBtZXNzYWdlc1xuICAgIC5tYXAoKG0pID0+IG0udXNhZ2U/LnN1bW1hcnkpXG4gICAgLmZpbHRlcigocyk6IHMgaXMgVXNhZ2VTdW1tYXJ5ID0+IHMgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdG90YWwgPSB7XG4gICAgbW9kZWw6IHN1bW1hcmllc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICB0b3RhbFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnRvdGFsVG9rZW5zLCAwKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVJlYWRUb2tlbnMsIDApLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVdyaXRlVG9rZW5zLCAwKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5yZWFzb25pbmdUb2tlbnMsIDApLFxuICAgIHN0ZXBDb3VudDogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnN0ZXBDb3VudCwgMCksXG4gICAgbWVzc2FnZUNvdW50OiBzdW1tYXJpZXMubGVuZ3RoLFxuICB9O1xuXG4gIHJldHVybiB7IHRvdGFsLCBieU1lc3NhZ2VJZCB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgYXNzZW1ibGVVSU1lc3NhZ2VzIH0gZnJvbSBcIi4uL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlU2Vzc2lvblVzYWdlLCB0eXBlIFNlc3Npb25Vc2FnZSB9IGZyb20gXCIuLi91dGlscy91c2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5leHBvcnQgdHlwZSBIaXN0b3J5UmVzdWx0ID0ge1xuICBtZXNzYWdlczogUmV0dXJuVHlwZTx0eXBlb2YgYXNzZW1ibGVVSU1lc3NhZ2VzPjtcbiAgc3RyZWFtaW5nTWVzc2FnZUlkOiBzdHJpbmcgfCBudWxsO1xuICB1c2FnZTogU2Vzc2lvblVzYWdlO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0XG4pIHtcbiAgY29uc3QgW3Nlc3Npb24sIG1lc3NhZ2VzLCBwYXJ0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQpLFxuICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKFxuICAgICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICAgKSxcbiAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQpLFxuICBdKTtcblxuICBjb25zdCBsYXN0QXNzaXN0YW50ID1cbiAgICBtZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uaWQgPT09IHNlc3Npb24/Lmxhc3RNZXNzYWdlSWQgJiYgbS5yb2xlID09PSBcImFzc2lzdGFudFwiXG4gICAgKSA/PyBtZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikuYXQoLTEpO1xuXG4gIGNvbnN0IGlzU3RyZWFtaW5nID1cbiAgICBsYXN0QXNzaXN0YW50Py5jb21wbGV0ZWRBdCA9PT0gbnVsbCAmJlxuICAgIGxhc3RBc3Npc3RhbnQ/LmludGVycnVwdGVkQXQgPT09IG51bGw7XG4gIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nID8gbGFzdEFzc2lzdGFudC5pZCA6IG51bGw7XG4gIGNvbnN0IHZpc2libGVVbnRpbCA9IGxhc3RBc3Npc3RhbnQ/LmNyZWF0ZWRBdDtcblxuICBjb25zdCBhc3NlbWJsZWQgPSBhc3NlbWJsZVVJTWVzc2FnZXM8VG9vbHM+KHtcbiAgICBtZXNzYWdlcyxcbiAgICBwYXJ0cyxcbiAgICBpbmNsdWRlUXVldWVkOiB2aXNpYmxlVW50aWwgIT09IHVuZGVmaW5lZCxcbiAgICB1bnRpbDogdmlzaWJsZVVudGlsLFxuICB9KTtcblxuICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXMpO1xuXG4gIHJldHVybiB7IG1lc3NhZ2VzOiBhc3NlbWJsZWQsIHN0cmVhbWluZ01lc3NhZ2VJZCwgdXNhZ2UgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5leHBvcnQgdHlwZSBJbnRlcnJ1cHRPcHRpb25zID0ge1xuICBsYXN0UGFydD86IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHBhcnQ6IHVua25vd247XG4gIH07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW50ZXJydXB0KFxuICBzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQsXG4gIG9wdHM/OiBJbnRlcnJ1cHRPcHRpb25zXG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKFxuICAgIHNlc3Npb25Db250ZXh0LnNlc3Npb25JZFxuICApO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGxldCBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMgPSBtZXNzYWdlcy5maWx0ZXIoXG4gICAgKG0pID0+XG4gICAgICBtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgIG0uY29tcGxldGVkQXQgPT09IG51bGwgJiZcbiAgICAgIG0uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbFxuICApO1xuXG4gIGlmIChwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgTUFYX1JFVFJPQUNUSVZFX01TID0gNV8wMDA7XG4gICAgY29uc3QgbGF0ZXN0ID0gbWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgICAgIG0uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbCAmJlxuICAgICAgICAgIG0uY29tcGxldGVkQXQgIT09IG51bGwgJiZcbiAgICAgICAgICBub3cgLSBtLmNvbXBsZXRlZEF0IDwgTUFYX1JFVFJPQUNUSVZFX01TXG4gICAgICApXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5jcmVhdGVkQXQgLSBhLmNyZWF0ZWRBdClcbiAgICAgIC5hdCgwKTtcbiAgICBpZiAobGF0ZXN0KSB7XG4gICAgICBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMgPSBbbGF0ZXN0XTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMubWFwKChtKSA9PlxuICAgICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLnNldChtLmlkLCB7XG4gICAgICAgIC4uLm0sXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG5vdyxcbiAgICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogb3B0cz8ubGFzdFBhcnQgPz8gbnVsbCxcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIGNvbnN0IG1lc3NhZ2VJZHMgPSBuZXcgU2V0KHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcy5tYXAoKG0pID0+IG0uaWQpKTtcbiAgaWYgKG1lc3NhZ2VJZHMuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5wYXJ0Lmxpc3RCeVNlc3Npb24oXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG5cbiAgZm9yIChjb25zdCBwIG9mIGFsbFBhcnRzKSB7XG4gICAgaWYgKCFtZXNzYWdlSWRzLmhhcyhwLm1lc3NhZ2VJZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwLnBhcnQgJiZcbiAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICBcImFwcHJvdmFsXCIgaW4gcC5wYXJ0XG4gICAgKSB7XG4gICAgICBjb25zdCBhcHByb3ZhbCA9IChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsO1xuICAgICAgaWYgKGFwcHJvdmFsPy5pZCkge1xuICAgICAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIHtcbiAgICAgICAgICAuLi5wLFxuICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgIC4uLnAucGFydCxcbiAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICAgIGFwcHJvdmFsOiB7XG4gICAgICAgICAgICAgIC4uLmFwcHJvdmFsLFxuICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJpbnRlcnJ1cHRlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRmluaXNoUmVhc29uLCBUb29sU2V0LCBVSU1lc3NhZ2UsIFVJTWVzc2FnZUNodW5rIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiYmV0dGVyLWFsbFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHR5cGUgeyBUeXBlZFVJTWVzc2FnZSB9IGZyb20gXCIuLi9hZ2VudC9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgbm9ybWFsaXplU2tpbGxzIH0gZnJvbSBcIi4uL3NraWxscy9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0IH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB0eXBlIHsgU3RlcFVzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL3VzYWdlXCI7XG5pbXBvcnQge1xuICB0eXBlIFN0cmVhbVRleHRSZXN1bHQsXG4gIHN0cmVhbVRleHQsXG4gIHN0cmVhbVRleHRTdGVwLFxufSBmcm9tIFwiLi9haS1sb29wL3N0cmVhbS10ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyBpbnRlcnJ1cHQgfSBmcm9tIFwiLi9pbnRlcnJ1cHRcIjtcbmltcG9ydCB0eXBlIHsgVXBkYXRlT3B0aW9ucyB9IGZyb20gXCIuL3VwZGF0ZVwiO1xuXG5jb25zdCBERUZBVUxUX1NURVBfVEhST1VHSFBVVCA9IDEwMDtcblxuZXhwb3J0IHR5cGUgQXBwcm92YWxEYXRhID0ge1xuICBhcHByb3ZhbElkOiBzdHJpbmc7XG4gIGFwcHJvdmVkOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59O1xuXG50eXBlIE1lc3NhZ2VEYXRhPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4gPVxuICB8IFVJTWVzc2FnZVxuICB8IHtcbiAgICAgIHJvbGU/OiBUeXBlZFVJTWVzc2FnZTx1bmtub3duLCBUb29scz5bXCJyb2xlXCJdO1xuICAgICAgcGFydHM6IFR5cGVkVUlNZXNzYWdlPHVua25vd24sIFRvb2xzPltcInBhcnRzXCJdO1xuICAgICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgICBpZD86IHN0cmluZztcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBTZW5kSW5wdXQ8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9XG4gIHwgc3RyaW5nXG4gIHwgTWVzc2FnZURhdGE8VG9vbHM+XG4gIHwgeyB0eXBlOiBcIm1lc3NhZ2VcIjsgbWVzc2FnZTogTWVzc2FnZURhdGE8VG9vbHM+IH1cbiAgfCB7IHR5cGU6IFwiYXBwcm92YWxcIjsgYXBwcm92YWw6IEFwcHJvdmFsRGF0YSB9O1xuXG5leHBvcnQgdHlwZSBTZW5kT3B0aW9uczxUb29scyBleHRlbmRzIFRvb2xTZXQsIFRDb250ZXh0PiA9IHtcbiAgaW50ZXJydXB0SWZTdHJlYW1pbmc/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgeyBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH0gfTtcbiAgY29udGV4dD86IFRDb250ZXh0O1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xufSAmIFVwZGF0ZU9wdGlvbnM8VG9vbHM+O1xuXG5leHBvcnQgdHlwZSBTZW5kUmVzdWx0ID0ge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgZG9uZTogdHJ1ZSB8IFByb21pc2U8dHJ1ZT47XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVSdW4gPSB7XG4gIGNodW5rczogVUlNZXNzYWdlQ2h1bmtbXTtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPjtcbiAgZG9uZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlc29sdmVzIHdoZW4gYSBuZXcgY2h1bmsgaXMgYXZhaWxhYmxlLiBSZXBsYWNlZCBhZnRlciBlYWNoIG5vdGlmaWNhdGlvbi4gKi9cbiAgb25DaHVuazogUHJvbWlzZTx2b2lkPjtcbn07XG5cbmNvbnN0IEFDVElWRV9SVU5TX0tFWSA9IFN5bWJvbC5mb3IoXCJleHBlcmltZW50YWwtYWdlbnQ6YWN0aXZlUnVuc1wiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVJ1bnMoKTogTWFwPHN0cmluZywgQWN0aXZlUnVuPiB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIE1hcDxzdHJpbmcsIEFjdGl2ZVJ1bj4gfCB1bmRlZmluZWQ+O1xuICBpZiAoIWdbQUNUSVZFX1JVTlNfS0VZXSkge1xuICAgIGdbQUNUSVZFX1JVTlNfS0VZXSA9IG5ldyBNYXAoKTtcbiAgfVxuICByZXR1cm4gZ1tBQ1RJVkVfUlVOU19LRVldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZDxUb29scyBleHRlbmRzIFRvb2xTZXQsIFRDb250ZXh0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0LFxuICBpbnB1dDogU2VuZElucHV0PFRvb2xzPiB8IFNlbmRJbnB1dDxUb29scz5bXSxcbiAgb3B0cz86IFNlbmRPcHRpb25zPFRvb2xzLCBUQ29udGV4dD5cbik6IFByb21pc2U8U2VuZFJlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgaW50ZXJydXB0SWZTdHJlYW1pbmc6IF9fLFxuICAgIGNvbnRleHQ6IF9fXyxcbiAgICBhYm9ydFNpZ25hbDogX19fXyxcbiAgICAuLi5zZXNzaW9uVXBkYXRlc1xuICB9ID0gb3B0cyA/PyB7fTtcblxuICBpZiAob3B0cz8uaW50ZXJydXB0SWZTdHJlYW1pbmcpIHtcbiAgICBjb25zdCBsYXN0UGFydCA9XG4gICAgICB0eXBlb2Ygb3B0cy5pbnRlcnJ1cHRJZlN0cmVhbWluZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMuaW50ZXJydXB0SWZTdHJlYW1pbmcubGFzdFBhcnRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgYXdhaXQgaW50ZXJydXB0KHNlc3Npb25Db250ZXh0LCB7IGxhc3RQYXJ0IH0pO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dXcml0YWJsZSxcbiAgICBleGlzdGluZ1BhcnRDb3VudCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgfSA9IGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgdHJ5OiAoKSA9PlxuICAgICAgaW5pdFNlc3Npb25TdGVwPFRvb2xzPih7XG4gICAgICAgIHNlc3Npb25Db250ZXh0LFxuICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgc2Vzc2lvblVwZGF0ZXMsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSksXG4gICAgY2F0Y2g6IChlKSA9PiB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU2VuZEVycm9yKHtcbiAgICAgICAgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgcmVhc29uOiBTdHJpbmcoZSksXG4gICAgICAgIGNhdXNlOiBlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgbG9vcE9wdHMgPSB7XG4gICAgc2Vzc2lvbkNvbnRleHQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIGNyZWF0ZWRBdDogYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgICBjb250ZXh0OiAob3B0cz8uY29udGV4dCA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc2Vzc2lvblVwZGF0ZXMsXG4gICAgbGFzdFBhcnRJbmRleDogZXhpc3RpbmdQYXJ0Q291bnQsXG4gICAgd29ya2Zsb3dSdW5JZCxcbiAgfTtcblxuICBpZiAod29ya2Zsb3dXcml0YWJsZSkge1xuICAgIGF3YWl0IHJ1bkxvb3A8VG9vbHM+KHsgLi4ubG9vcE9wdHMsIHdyaXRhYmxlOiB3b3JrZmxvd1dyaXRhYmxlIH0pO1xuICAgIHJldHVybiB7IGFzc2lzdGFudE1lc3NhZ2VJZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgY29uc3QgY2h1bmtzOiBVSU1lc3NhZ2VDaHVua1tdID0gW107XG4gIGxldCBub3RpZnlDaHVuazogKCkgPT4gdm9pZDtcbiAgbGV0IG9uQ2h1bmsgPSBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4ge1xuICAgIG5vdGlmeUNodW5rID0gcjtcbiAgfSk7XG5cbiAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV3JpdGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+KHtcbiAgICB3cml0ZShjaHVuaykge1xuICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgY29uc3QgcHJldiA9IG5vdGlmeUNodW5rO1xuICAgICAgb25DaHVuayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgICAgIG5vdGlmeUNodW5rID0gcjtcbiAgICAgIH0pO1xuICAgICAgcHJldigpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGRvbmUgPSBydW5Mb29wPFRvb2xzPih7IC4uLmxvb3BPcHRzLCB3cml0YWJsZSB9KTtcblxuICBjb25zdCBhY3RpdmVSdW46IEFjdGl2ZVJ1biA9IHtcbiAgICBjaHVua3MsXG4gICAgd3JpdGFibGUsXG4gICAgZG9uZSxcbiAgICBnZXQgb25DaHVuaygpIHtcbiAgICAgIHJldHVybiBvbkNodW5rO1xuICAgIH0sXG4gIH07XG4gIGNvbnN0IGFjdGl2ZVJ1bnMgPSBnZXRBY3RpdmVSdW5zKCk7XG4gIGFjdGl2ZVJ1bnMuc2V0KGFzc2lzdGFudE1lc3NhZ2VJZCwgYWN0aXZlUnVuKTtcbiAgZG9uZS5maW5hbGx5KCgpID0+IGFjdGl2ZVJ1bnMuZGVsZXRlKGFzc2lzdGFudE1lc3NhZ2VJZCkpO1xuXG4gIHJldHVybiB7IGFzc2lzdGFudE1lc3NhZ2VJZCwgZG9uZTogZG9uZS50aGVuKCgpID0+IHRydWUpIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFJIExvb3BcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuYXN5bmMgZnVuY3Rpb24gcnVuTG9vcDxUb29scyBleHRlbmRzIFRvb2xTZXQ+KHtcbiAgd29ya2Zsb3dSdW5JZCxcbiAgc2Vzc2lvbkNvbnRleHQsXG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgY3JlYXRlZEF0LFxuICBjb250ZXh0LFxuICBzZXNzaW9uVXBkYXRlcyxcbiAgd3JpdGFibGUsXG4gIGxhc3RQYXJ0SW5kZXg6IGluaXRpYWxQYXJ0SW5kZXgsXG59OiB7XG4gIHdvcmtmbG93UnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0O1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBudW1iZXI7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBzZXNzaW9uVXBkYXRlcz86IFVwZGF0ZU9wdGlvbnM8VG9vbHM+O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWdlbnQgPSBzZXNzaW9uQ29udGV4dC5hZ2VudDtcblxuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwiYWktbG9vcFwiLFxuICB9KTtcbiAgY29uc3QgbXNnTG9nID0gbG9nLndpdGhDb250ZXh0KHtcbiAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgfSk7XG4gIGNvbnN0IGRvbmVNZXNzYWdlID0gbXNnTG9nLnRpbWUoXCJvbk1lc3NhZ2VcIik7XG5cbiAgbGV0IGZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uIHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdFBhcnRJbmRleCA9IGluaXRpYWxQYXJ0SW5kZXg7XG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKGZpbmlzaFJlYXNvbiAhPT0gXCJzdG9wXCIpIHtcbiAgICAgIGNvbnN0IHN0cmVhbVRleHRGbiA9IHdvcmtmbG93UnVuSWRcbiAgICAgICAgPyBzdHJlYW1UZXh0U3RlcDxUb29scz5cbiAgICAgICAgOiBzdHJlYW1UZXh0PFRvb2xzPjtcbiAgICAgIGNvbnN0IHRocm91Z2hwdXQgPSB3b3JrZmxvd1J1bklkID8gNSA6IERFRkFVTFRfU1RFUF9USFJPVUdIUFVUO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFN0cmVhbVRleHRSZXN1bHQgPSBhd2FpdCBzdHJlYW1UZXh0Rm4oe1xuICAgICAgICBzdGVwVGhyb3VnaHB1dDogdGhyb3VnaHB1dCxcbiAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgc2Vzc2lvblVwZGF0ZXMsXG4gICAgICAgIHdyaXRhYmxlLFxuICAgICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgICBzdGVwSW5kZXhPZmZzZXQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgICBkaXNjb3ZlcmVkU2tpbGxzLFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmlzaFJlYXNvbiA9IHJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICBsYXN0UGFydEluZGV4ID0gcmVzdWx0Lmxhc3RQYXJ0SW5kZXg7XG4gICAgICB1c2FnZVN0ZXBzLnB1c2goLi4ucmVzdWx0LnVzYWdlU3RlcHMpO1xuICAgICAgZGlzY292ZXJlZFNraWxscyA9IHJlc3VsdC5kaXNjb3ZlcmVkU2tpbGxzO1xuXG4gICAgICBpZiAocmVzdWx0Lm1heFN0ZXBzICE9IG51bGwgJiYgdXNhZ2VTdGVwcy5sZW5ndGggPj0gcmVzdWx0Lm1heFN0ZXBzKSB7XG4gICAgICAgIG1zZ0xvZy5pbmZvKFwicmVhY2hlZCBtYXhTdGVwcyBsaW1pdFwiLCB7IG1heFN0ZXBzOiByZXN1bHQubWF4U3RlcHMgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2dMb2cuaW5mbyhcInBlbmRpbmcgYXBwcm92YWxzLCBzdG9wcGluZyBsb29wXCIsIHtcbiAgICAgICAgICBjb3VudDogcmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoLFxuICAgICAgICAgIHRvb2xzOiByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHApID0+IHAudG9vbE5hbWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9uZU1lc3NhZ2UoeyB0b3RhbFN0ZXBzOiB1c2FnZVN0ZXBzLmxlbmd0aCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbXNnTG9nLmVycm9yKFwiQUkgbG9vcCBmYWlsZWRcIiwge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gICAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICBzZXNzaW9uQ29udGV4dCxcbiAgICAgIHdyaXRhYmxlLFxuICAgICAgdXNhZ2VTdGVwcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBTdGVwc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5hc3luYyBmdW5jdGlvbiBpbml0U2Vzc2lvblN0ZXA8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHNlc3Npb25Db250ZXh0LFxuICBzZXNzaW9uSWQsXG4gIHNlc3Npb25VcGRhdGVzLFxuICBpbnB1dCxcbn06IHtcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc2Vzc2lvblVwZGF0ZXM6IFVwZGF0ZU9wdGlvbnM8VG9vbFNldD47XG4gIGlucHV0OiBTZW5kSW5wdXQ8VG9vbHM+IHwgU2VuZElucHV0PFRvb2xzPltdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgbGV0IHdvcmtmbG93UnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHdvcmtmbG93V3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IHsgZ2V0V29ya2Zsb3dNZXRhZGF0YSwgZ2V0V3JpdGFibGUgfSA9IGF3YWl0IGltcG9ydChcIndvcmtmbG93XCIpO1xuICAgIHdvcmtmbG93UnVuSWQgPSBnZXRXb3JrZmxvd01ldGFkYXRhKCkud29ya2Zsb3dSdW5JZDtcbiAgICB3b3JrZmxvd1dyaXRhYmxlID0gZ2V0V3JpdGFibGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gd29ya2Zsb3cgbm90IGluc3RhbGxlZFxuICB9XG5cbiAgY29uc3QgbmV3TWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICBjb25zdCBuZXdQYXJ0czogUGFydFtdID0gW107XG4gIGNvbnN0IG5ld0FwcHJvdmFsczogQXBwcm92YWxEYXRhW10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIGlucHV0KSB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2UsIHBhcnRzLCBhcHByb3ZhbHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICAgIGlucHV0OiBpLFxuICAgICAgICBkZWZhdWx0Um9sZTogXCJ1c2VyXCIsXG4gICAgICB9KTtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIG5ld01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICAgIG5ld0FwcHJvdmFscy5wdXNoKC4uLmFwcHJvdmFscyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMsIGFwcHJvdmFscyB9ID0gdG9NZXNzYWdlQW5kUGFydHMoe1xuICAgICAgaW5wdXQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICB9KTtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgbmV3TWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICB9XG4gICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgbmV3QXBwcm92YWxzLnB1c2goLi4uYXBwcm92YWxzKTtcbiAgfVxuXG4gIGNvbnN0IGxhc3ROZXdNZXNzYWdlID0gbmV3TWVzc2FnZXMuYXQoLTEpO1xuICBjb25zdCByZXVzZUFzc2lzdGFudCA9IGxhc3ROZXdNZXNzYWdlPy5yb2xlID09PSBcImFzc2lzdGFudFwiO1xuXG4gIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VJZCA9IHJldXNlQXNzaXN0YW50XG4gICAgPyBsYXN0TmV3TWVzc2FnZS5pZFxuICAgIDogYG1lc3NhZ2VfJHt1bGlkKCl9YDtcbiAgY29uc3QgYmFzZVRpbWUgPSBEYXRlLm5vdygpO1xuICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0ID0gYmFzZVRpbWUgKyBuZXdNZXNzYWdlcy5sZW5ndGg7XG5cbiAgaWYgKCFyZXVzZUFzc2lzdGFudCkge1xuICAgIG5ld01lc3NhZ2VzLnB1c2goe1xuICAgICAgaWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNyZWF0ZWRBdDogYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkTGFzdFBhcnQ6IG51bGwsXG4gICAgICB1c2FnZTogbnVsbCxcbiAgICAgIHdvcmtmbG93UnVuSWQ6IG51bGwsXG4gICAgICBtZXRhZGF0YTogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nUGFydENvdW50ID0gcmV1c2VBc3Npc3RhbnRcbiAgICA/IG5ld1BhcnRzLmZpbHRlcigocCkgPT4gcC5tZXNzYWdlSWQgPT09IGFzc2lzdGFudE1lc3NhZ2VJZCkubGVuZ3RoXG4gICAgOiAwO1xuXG4gIGxldCBzZXNzaW9uID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICBpZiAoIXNlc3Npb24pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHNlc3Npb25Db250ZXh0LmFnZW50LnNlc3Npb25EZWZhdWx0cztcbiAgICBjb25zdCBza2lsbHMgPSBzZXNzaW9uVXBkYXRlcy5za2lsbHMgPz8gZGVmYXVsdHMuc2tpbGxzID8/IG51bGw7XG4gICAgc2Vzc2lvbiA9IHtcbiAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICBsYXN0TWVzc2FnZUlkOiBudWxsLFxuICAgICAgc3lzdGVtOiBzZXNzaW9uVXBkYXRlcy5zeXN0ZW0gPz8gZGVmYXVsdHMuc3lzdGVtID8/IG51bGwsXG4gICAgICBtb2RlbDogc2Vzc2lvblVwZGF0ZXMubW9kZWwgPz8gZGVmYXVsdHMubW9kZWwgPz8gbnVsbCxcbiAgICAgIHNhbmRib3hJZDogc2Vzc2lvblVwZGF0ZXMuc2FuZGJveElkID8/IG51bGwsXG4gICAgICBhY3RpdmVUb29sczogc2Vzc2lvblVwZGF0ZXMuYWN0aXZlVG9vbHMgPz8gZGVmYXVsdHMuYWN0aXZlVG9vbHMgPz8gbnVsbCxcbiAgICAgIGdlbmVyYXRpb246IHNlc3Npb25VcGRhdGVzLmdlbmVyYXRpb24gPz8gZGVmYXVsdHMuZ2VuZXJhdGlvbiA/PyBudWxsLFxuICAgICAgc2tpbGxzOiBza2lsbHMgPyBub3JtYWxpemVTa2lsbHMoc2tpbGxzKSA6IG51bGwsXG4gICAgfTtcbiAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uc2V0KHNlc3Npb24uaWQsIHNlc3Npb24pO1xuICB9XG5cbiAgYXdhaXQgYWxsKHtcbiAgICBhc3luYyBzYXZlTWVzc2FnZXMoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3TWVzc2FnZXMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UuZ2V0KG0uaWQpO1xuICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2Uuc2V0KG0uaWQsIHtcbiAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGJhc2VUaW1lICsgaSxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6XG4gICAgICAgICAgICAgIG0uaWQgPT09IGFzc2lzdGFudE1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgID8gKHdvcmtmbG93UnVuSWQgPz8gbnVsbClcbiAgICAgICAgICAgICAgICA6IG0ud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyBzYXZlUGFydHMoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3UGFydHMubWFwKGFzeW5jIChwKSA9PlxuICAgICAgICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5zZXQocC5pZCwgcClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc29sdmVBcHByb3ZhbHMoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3QXBwcm92YWxzLm1hcChhc3luYyAoYSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnRJZCA9IGFwcHJvdmFsUGFydElkKGEuYXBwcm92YWxJZCk7XG4gICAgICAgICAgY29uc3QgcGFydCA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5nZXQocGFydElkKTtcbiAgICAgICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHByb3ZhbE5vdEZvdW5kRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBhcHByb3ZhbElkOiBhLmFwcHJvdmFsSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChwYXJ0SWQsIHtcbiAgICAgICAgICAgIC4uLnBhcnQsXG4gICAgICAgICAgICBwYXJ0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcnQucGFydCxcbiAgICAgICAgICAgICAgc3RhdGU6IGEuYXBwcm92ZWQgPyBcImFwcHJvdmFsLXJlc3BvbmRlZFwiIDogXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGEuYXBwcm92YWxJZCxcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogYS5hcHByb3ZlZCxcbiAgICAgICAgICAgICAgICByZWFzb246IGEucmVhc29uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBhcyB0eXBlb2YgcGFydC5wYXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICAgIGFzeW5jIHVwZGF0ZVNlc3Npb24oKSB7XG4gICAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uc2V0KHNlc3Npb24uaWQsIHtcbiAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgbGFzdE1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dXcml0YWJsZSxcbiAgICBleGlzdGluZ1BhcnRDb3VudCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgc2Vzc2lvbkNvbnRleHQsXG4gIHdyaXRhYmxlLFxuICB1c2FnZVN0ZXBzLFxufToge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHtcbiAgICAgIC4uLnNlc3Npb25Db250ZXh0LmFnZW50Lm9wdGlvbnMubG9nZ2luZyxcbiAgICAgIG5hbWU6IHNlc3Npb25Db250ZXh0LmFnZW50Lm5hbWUsXG4gICAgfSxcbiAgICBzdWJzeXN0ZW06IFwiYWktbG9vcFwiLFxuICB9KTtcbiAgY29uc3QgbXNnTG9nID0gbG9nLndpdGhDb250ZXh0KHtcbiAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgfSk7XG5cbiAgY29uc3QgdXNhZ2UgPVxuICAgIHVzYWdlU3RlcHMubGVuZ3RoID4gMFxuICAgICAgPyB7XG4gICAgICAgICAgc3RlcHM6IHVzYWdlU3RlcHMsXG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgbW9kZWw6IHVzYWdlU3RlcHNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKChhLCBzKSA9PiBhICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKChhLCBzKSA9PiBhICsgcy5vdXRwdXRUb2tlbnMsIDApLFxuICAgICAgICAgICAgdG90YWxUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKChhLCBzKSA9PiBhICsgcy50b3RhbFRva2VucywgMCksXG4gICAgICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYSwgcykgPT4gYSArIHMuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY2FjaGVXcml0ZVRva2VuczogdXNhZ2VTdGVwcy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhLCBzKSA9PiBhICsgcy5jYWNoZVdyaXRlVG9rZW5zLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcmVhc29uaW5nVG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGEsIHMpID0+IGEgKyBzLnJlYXNvbmluZ1Rva2VucyxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0ZXBDb3VudDogdXNhZ2VTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2UudXBkYXRlKGFzc2lzdGFudE1lc3NhZ2VJZCwge1xuICAgICAgY29tcGxldGVkQXQ6IERhdGUubm93KCksXG4gICAgICB1c2FnZSxcbiAgICB9KSxcbiAgICB3cml0YWJsZS5jbG9zZSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCksXG4gIF0pO1xuXG4gIG1zZ0xvZy5pbmZvKFwibWVzc2FnZSBjb21wbGV0ZWRcIiwge1xuICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLmxlbmd0aCxcbiAgICB0b3RhbFRva2VuczogdXNhZ2U/LnN1bW1hcnkudG90YWxUb2tlbnMsXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBVdGlsc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxQYXJ0SWQoYXBwcm92YWxJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBwYXJ0XyR7YXBwcm92YWxJZH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGF5QWN0aXZlUnVuKFxuICBhY3RpdmU6IEFjdGl2ZVJ1bixcbiAgc3RhcnRJbmRleCA9IDBcbik6IFJlYWRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPiB7XG4gIGxldCBjdXJzb3IgPSBzdGFydEluZGV4O1xuICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgLy8gRHJhaW4gYW55IGJ1ZmZlcmVkIGNodW5rc1xuICAgICAgd2hpbGUgKGN1cnNvciA8IGFjdGl2ZS5jaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShhY3RpdmUuY2h1bmtzW2N1cnNvcisrXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgZm9yIGVpdGhlciBhIG5ldyBjaHVuayBvciBjb21wbGV0aW9uXG4gICAgICB3aGlsZSAoIWNhbmNlbGxlZCAmJiBjdXJzb3IgPj0gYWN0aXZlLmNodW5rcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBhY3RpdmUub25DaHVuay50aGVuKCgpID0+IFwiY2h1bmtcIiBhcyBjb25zdCksXG4gICAgICAgICAgYWN0aXZlLmRvbmUudGhlbigoKSA9PiBcImRvbmVcIiBhcyBjb25zdCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIERyYWluIG5ldyBjaHVua3NcbiAgICAgICAgd2hpbGUgKGN1cnNvciA8IGFjdGl2ZS5jaHVua3MubGVuZ3RoKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGFjdGl2ZS5jaHVua3NbY3Vyc29yKytdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IFwiZG9uZVwiKSB7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKCkge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9NZXNzYWdlQW5kUGFydHM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHNlc3Npb25JZCxcbiAgaWQsXG4gIGlucHV0LFxuICBkZWZhdWx0Um9sZSxcbn06IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbnB1dDogU2VuZElucHV0PFRvb2xzPjtcbiAgZGVmYXVsdFJvbGU6IFVJTWVzc2FnZVtcInJvbGVcIl07XG59KToge1xuICBtZXNzYWdlOiBNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICBwYXJ0czogUGFydFtdO1xuICBhcHByb3ZhbHM6IEFwcHJvdmFsRGF0YVtdO1xufSB7XG4gIGxldCBtZXNzYWdlSWQgPSBpZCA/PyBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwcm92YWxzOiBbXSxcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICByb2xlOiBkZWZhdWx0Um9sZSxcbiAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICAgIGludGVycnVwdGVkTGFzdFBhcnQ6IG51bGwsXG4gICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgICB3b3JrZmxvd1J1bklkOiBudWxsLFxuICAgICAgICBtZXRhZGF0YTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBwYXJ0czogW1xuICAgICAgICB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICBpZDogYHBhcnRfJHttZXNzYWdlSWR9XzBgLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIHBhcnQ6IHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGlucHV0IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbiAgaWYgKFwidHlwZVwiIGluIGlucHV0ICYmIGlucHV0LnR5cGUgPT09IFwiYXBwcm92YWxcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB1bmRlZmluZWQsXG4gICAgICBwYXJ0czogW10sXG4gICAgICBhcHByb3ZhbHM6IFtpbnB1dC5hcHByb3ZhbF0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1zZyA9XG4gICAgXCJ0eXBlXCIgaW4gaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gXCJtZXNzYWdlXCIgPyBpbnB1dC5tZXNzYWdlIDogaW5wdXQ7XG4gIGlmIChcImlkXCIgaW4gbXNnICYmIG1zZy5pZCkge1xuICAgIG1lc3NhZ2VJZCA9IG1zZy5pZDtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IG1ldGFkYXRhID1cbiAgICBcIm1ldGFkYXRhXCIgaW4gbXNnICYmIG1zZy5tZXRhZGF0YSAhPSBudWxsXG4gICAgICA/IChtc2cubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IG51bGw7XG4gIHJldHVybiB7XG4gICAgYXBwcm92YWxzOiBbXSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBudWxsLFxuICAgICAgdXNhZ2U6IG51bGwsXG4gICAgICB3b3JrZmxvd1J1bklkOiBudWxsLFxuICAgICAgcm9sZTogbXNnLnJvbGUgPz8gZGVmYXVsdFJvbGUsXG4gICAgICBtZXRhZGF0YSxcbiAgICB9LFxuICAgIHBhcnRzOiBtc2cucGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYXAgPSBwYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9O1xuICAgICAgY29uc3QgaWQgPSBhcC5hcHByb3ZhbD8uaWRcbiAgICAgICAgPyBhcHByb3ZhbFBhcnRJZChhcC5hcHByb3ZhbC5pZClcbiAgICAgICAgOiBgcGFydF8ke21lc3NhZ2VJZH1fJHtpbmRleH1gO1xuICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIGlkLCBpbmRleCwgcGFydCB9O1xuICAgIH0pLFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFcnJvcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGNsYXNzIFNlbmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2VuZCBmYWlsZWQgZm9yIHNlc3Npb24gJGlkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgQXBwcm92YWxOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJBcHByb3ZhbE5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJBcHByb3ZhbCAkYXBwcm92YWxJZCBub3QgZm91bmQgaW4gc2Vzc2lvbiAkaWRcIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyBTa2lsbEVudHJ5LCBTa2lsbElucHV0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBQYXJzZWQgZnJvbnRtYXR0ZXIgZnJvbSBhIFNLSUxMLm1kIGZpbGUuXG4gKi9cbmV4cG9ydCB0eXBlIFNraWxsRnJvbnRtYXR0ZXIgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn07XG5cbi8qKlxuICogUGFyc2VzIFlBTUwgZnJvbnRtYXR0ZXIgZnJvbSBhIFNLSUxMLm1kIGZpbGUgY29udGVudC5cbiAqIEZyb250bWF0dGVyIG11c3QgYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBkZWxpbWl0ZWQgYnkgYC0tLWAgbWFya2Vycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgbWFya2Rvd25cbiAqIC0tLVxuICogbmFtZTogY3N2XG4gKiBkZXNjcmlwdGlvbjogQW5hbHl6ZSBDU1YgZGF0YVxuICogLS0tXG4gKiAjIENTViBTa2lsbFxuICogLi4uXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyBQYXJzZWQgbmFtZSBhbmQgZGVzY3JpcHRpb24sIG9yIG51bGwgaWYgZnJvbnRtYXR0ZXIgaXMgbWlzc2luZy9pbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNraWxsRnJvbnRtYXR0ZXIoXG4gIGNvbnRlbnQ6IHN0cmluZ1xuKTogU2tpbGxGcm9udG1hdHRlciB8IG51bGwge1xuICBjb25zdCB0cmltbWVkID0gY29udGVudC50cmltKCk7XG5cbiAgaWYgKCF0cmltbWVkLnN0YXJ0c1dpdGgoXCItLS1cIikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGVuZE1hcmtlckluZGV4ID0gdHJpbW1lZC5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICBpZiAoZW5kTWFya2VySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmcm9udG1hdHRlckJsb2NrID0gdHJpbW1lZC5zbGljZSgzLCBlbmRNYXJrZXJJbmRleCkudHJpbSgpO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVNpbXBsZVlhbWwoZnJvbnRtYXR0ZXJCbG9jayk7XG5cbiAgaWYgKCEocGFyc2VkLm5hbWUgJiYgcGFyc2VkLmRlc2NyaXB0aW9uKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBTdHJpbmcocGFyc2VkLm5hbWUpLFxuICAgIGRlc2NyaXB0aW9uOiBTdHJpbmcocGFyc2VkLmRlc2NyaXB0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgc2ltcGxlIFlBTUwga2V5LXZhbHVlIHBhaXJzIChzaW5nbGUtbGluZSB2YWx1ZXMgb25seSkuXG4gKiBUaGlzIGF2b2lkcyBhZGRpbmcgYSBmdWxsIFlBTUwgcGFyc2VyIGRlcGVuZGVuY3kgZm9yIGJhc2ljIGZyb250bWF0dGVyLlxuICovXG5mdW5jdGlvbiBwYXJzZVNpbXBsZVlhbWwoeWFtbDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiB5YW1sLnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWRMaW5lIHx8IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvbkluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB0cmltbWVkTGluZS5zbGljZSgwLCBjb2xvbkluZGV4KS50cmltKCk7XG4gICAgbGV0IHZhbHVlID0gdHJpbW1lZExpbmUuc2xpY2UoY29sb25JbmRleCArIDEpLnRyaW0oKTtcblxuICAgIC8vIFJlbW92ZSBzdXJyb3VuZGluZyBxdW90ZXMgaWYgcHJlc2VudFxuICAgIGlmIChcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgKHZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiJ1wiKSlcbiAgICApIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgIH1cblxuICAgIGlmIChrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxscyhcbiAgc2tpbGxzOiBTa2lsbElucHV0W10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTa2lsbEVudHJ5W10ge1xuICBpZiAoIXNraWxscyB8fCBza2lsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHNraWxscy5tYXAoKHNraWxsKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBza2lsbCAhPT0gXCJvYmplY3RcIiB8fCBza2lsbCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkludmFsaWQgc2tpbGxzIGVudHJ5OiBleHBlY3RlZCBhbiBvYmplY3Qgd2l0aCBhIGB0eXBlYCBmaWVsZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwidHlwZVwiIGluIHNraWxsICYmIHNraWxsLnR5cGUpIHtcbiAgICAgIHJldHVybiBza2lsbCBhcyBTa2lsbEVudHJ5O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNraWxscyBlbnRyeTogZXhwZWN0ZWQgYHR5cGVgLlwiKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBGaW5pc2hSZWFzb24sXG4gIFRvb2xTZXQsXG4gIFVJTWVzc2FnZSxcbiAgVUlNZXNzYWdlU3RyZWFtV3JpdGVyLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7XG4gIGNvbnZlcnRUb01vZGVsTWVzc2FnZXMsXG4gIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSxcbiAgc3RlcENvdW50SXMsXG4gIHN0cmVhbVRleHQgYXMgc3RyZWFtVGV4dEFpLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRTdGF0dXMsIEFueUFnZW50LCBUeXBlZFVJTWVzc2FnZSB9IGZyb20gXCIuLi8uLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB7IFNlc3Npb25Ob3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgZGlzY292ZXJTa2lsbHNJblNhbmRib3ggfSBmcm9tIFwiLi4vLi4vc2tpbGxzL2Rpc2NvdmVyXCI7XG5pbXBvcnQgeyByZXNvbHZlU2tpbGxJbnB1dHNUb1NhbmRib3hEaXJzIH0gZnJvbSBcIi4uLy4uL3NraWxscy9yZXNvbHZlXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuLi8uLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUGFydCB9IGZyb20gXCIuLi8uLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgZ2V0VG9vbHMsIHR5cGUgVG9vbENvbnRleHQgfSBmcm9tIFwiLi4vLi4vdG9vbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm9tcHQtY2FjaGVcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuLi8uLi91dGlscy91aVwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXNhZ2VcIjtcbmltcG9ydCB7IGFwcHJvdmFsUGFydElkIH0gZnJvbSBcIi4uL3NlbmRcIjtcbmltcG9ydCB0eXBlIHsgVXBkYXRlT3B0aW9ucyB9IGZyb20gXCIuLi91cGRhdGVcIjtcblxuY29uc3QgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMgPSAyNTA7XG5cbmZ1bmN0aW9uIHBvbGxGb3JJbnRlcnJ1cHQoe1xuICBhZ2VudCxcbiAgbWVzc2FnZUlkLFxuICBzaWduYWwsXG4gIGFib3J0Q29udHJvbGxlcixcbn06IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59KToge1xuICBmaXJzdENoZWNrOiBQcm9taXNlPHZvaWQ+O1xuICBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmOiB7IGN1cnJlbnQ6IHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9IHwgbnVsbCB9O1xufSB7XG4gIGxldCByZXNvbHZlRmlyc3RDaGVjazogKCkgPT4gdm9pZDtcbiAgY29uc3QgZmlyc3RDaGVjayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZUZpcnN0Q2hlY2sgPSByZXNvbHZlO1xuICB9KTtcbiAgY29uc3QgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiA9IHtcbiAgICBjdXJyZW50OiBudWxsIGFzIHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9IHwgbnVsbCxcbiAgfTtcblxuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwiYWktbG9vcFwiLFxuICB9KTtcblxuICBjb25zdCBwb2xsID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgICB3aGlsZSAoIXNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmdldChtZXNzYWdlSWQpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlICR7bWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgbG9nLmluZm8oXCJpbnRlcnJ1cHQgZGV0ZWN0ZWRcIiwgeyBtZXNzYWdlSWQgfSk7XG4gICAgICAgIGludGVycnVwdGVkTGFzdFBhcnRSZWYuY3VycmVudCA9IG1lc3NhZ2UuaW50ZXJydXB0ZWRMYXN0UGFydDtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9O1xufVxuXG50eXBlIFN0cmVhbVRleHRPcHRpb25zPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4gPSB7XG4gIHN0ZXBUaHJvdWdocHV0OiBudW1iZXI7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNlc3Npb25VcGRhdGVzPzogVXBkYXRlT3B0aW9uczxUb29scz47XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbiAgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgU3RyZWFtVGV4dFJlc3VsdCA9IHtcbiAgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb247XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG4gIHBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXTtcbiAgbWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRleHQ8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHN0ZXBUaHJvdWdocHV0LFxuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGFnZW50LFxuICBzZXNzaW9uSWQsXG4gIGNvbnRleHQsXG4gIGNyZWF0ZWRBdCxcbiAgc2Vzc2lvblVwZGF0ZXMsXG4gIHdyaXRhYmxlLFxuICBsYXN0UGFydEluZGV4LFxuICBzdGVwSW5kZXhPZmZzZXQsXG4gIGRpc2NvdmVyZWRTa2lsbHMsXG59OiBTdHJlYW1UZXh0T3B0aW9uczxUb29scz4pOiBQcm9taXNlPFN0cmVhbVRleHRSZXN1bHQ+IHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcExvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICB9KTtcbiAgY29uc3QgZG9uZVN0ZXAgPSBzdGVwTG9nLnRpbWUoXCJzdHJlYW1UZXh0XCIpO1xuXG4gIGNvbnN0IHRocm90dGxlZEVtaXRTdGF0dXMgPSBjcmVhdGVUaHJvdHRsZWRFbWl0U3RhdHVzKGFnZW50KTtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHBvbGxDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9ID0gcG9sbEZvckludGVycnVwdCh7XG4gICAgYWdlbnQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgc2lnbmFsOiBwb2xsQ29udHJvbGxlci5zaWduYWwsXG4gICAgYWJvcnRDb250cm9sbGVyLFxuICB9KTtcblxuICBjb25zdCBkb25lTG9hZCA9IHN0ZXBMb2cudGltZShcImxvYWQgc2Vzc2lvbiArIG1lc3NhZ2VzICsgcGFydHMgKyBzYW5kYm94XCIpO1xuICBjb25zdCBbLCBtZXNzYWdlc1Jlc3VsdCwgcGFydHNSZXN1bHQsIHsgc2Vzc2lvbiwgc2FuZGJveCB9XSA9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmlyc3RDaGVjayxcbiAgICAgIGFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICBhZ2VudC5zdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihzZXNzaW9uSWQpLFxuICAgICAgYWdlbnQuc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpLnRoZW4oYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwZW5kaW5nVXBkYXRlOiBQcm9taXNlPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChzZXNzaW9uVXBkYXRlcykge1xuICAgICAgICAgIGNvbnN0IGRpZmY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2Vzc2lvblVwZGF0ZXMpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgdmFsdWUgIT09IChzZXNzaW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZGlmZltrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNlc3Npb24sIGRpZmYpO1xuICAgICAgICAgICAgcGVuZGluZ1VwZGF0ZSA9IGFnZW50XG4gICAgICAgICAgICAgIC5zZXNzaW9uKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgLnVwZGF0ZShkaWZmIGFzIHR5cGVvZiBzZXNzaW9uVXBkYXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGFnZW50LnNhbmRib3goc2Vzc2lvbi5zYW5kYm94SWQgPz8gc2Vzc2lvbi5pZCk7XG4gICAgICAgIGF3YWl0IHBlbmRpbmdVcGRhdGU7XG5cbiAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbiwgc2FuZGJveCB9O1xuICAgICAgfSksXG4gICAgXSk7XG4gIGRvbmVMb2FkKCk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgICAgZGlzY292ZXJlZFNraWxscyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc2V0U3RhcnRlZFByb21pc2UgPVxuICAgIGxhc3RQYXJ0SW5kZXggPT09IDBcbiAgICAgID8gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmdNZXNzYWdlcyA9IG1lc3NhZ2VzUmVzdWx0LmZpbHRlcihcbiAgICAgICAgICAgIChtKSA9PiBtLmNyZWF0ZWRBdCA8PSBjcmVhdGVkQXQgJiYgbS5zdGFydGVkQXQgPT09IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwZW5kaW5nTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBwZW5kaW5nTWVzc2FnZXMubWFwKChtKSA9PlxuICAgICAgICAgICAgICAgIGFnZW50LnN0b3JhZ2UubWVzc2FnZS51cGRhdGUobS5pZCwge1xuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIGNvbnN0IGFsbFBhcnRzID0gWy4uLnBhcnRzUmVzdWx0XTtcbiAgY29uc3QgbmV4dFBhcnRJbmRleFJlZiA9IHtcbiAgICBjdXJyZW50OiBNYXRoLm1heChcbiAgICAgIGxhc3RQYXJ0SW5kZXgsXG4gICAgICAuLi5hbGxQYXJ0c1xuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLm1lc3NhZ2VJZCA9PT0gYXNzaXN0YW50TWVzc2FnZUlkKVxuICAgICAgICAubWFwKChwKSA9PiBwLmluZGV4ICsgMSksXG4gICAgICAwXG4gICAgKSxcbiAgfTtcblxuICBjb25zdCBza2lsbHNSZWY6IHsgY3VycmVudDogU2tpbGxTdW1tYXJ5W10gfSA9IHtcbiAgICBjdXJyZW50OiBkaXNjb3ZlcmVkU2tpbGxzID8/IFtdLFxuICB9O1xuXG4gIC8vIHNraWxscyBkaXNjb3ZlcnkgXHUyMDE0IGZpcnN0IGl0ZXJhdGlvbiBvbmx5XG4gIGlmIChsYXN0UGFydEluZGV4ID09PSAwICYmICFkaXNjb3ZlcmVkU2tpbGxzKSB7XG4gICAgY29uc3Qgc2tpbGxzRGlycyA9IHNlc3Npb24uc2tpbGxzPy5sZW5ndGhcbiAgICAgID8gYXdhaXQgcmVzb2x2ZVNraWxsSW5wdXRzVG9TYW5kYm94RGlycyh7XG4gICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICBza2lsbHM6IHNlc3Npb24uc2tpbGxzLFxuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgfSlcbiAgICAgIDogW107XG4gICAgaWYgKHNraWxsc0RpcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZG9uZVNraWxscyA9IHN0ZXBMb2cudGltZShcImRpc2NvdmVyIHNraWxsc1wiLCB7IHNraWxsc0RpcnMgfSk7XG4gICAgICBza2lsbHNSZWYuY3VycmVudCA9IGF3YWl0IGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94KHtcbiAgICAgICAgYWdlbnQsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIHNraWxsc0RpcnMsXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgIH0pO1xuICAgICAgZG9uZVNraWxscyh7IGNvdW50OiBza2lsbHNSZWYuY3VycmVudC5sZW5ndGggfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElubmVyIGxvb3A6IHJ1biB1cCB0byBgc3RlcFRocm91Z2hwdXRgIHNlcXVlbnRpYWwgTExNIGNhbGxzLlxuICAgKiBQYXJ0cyBhcmUgcGVyc2lzdGVkIGFmdGVyIGVhY2ggY2FsbCBzbyBwcm9ncmVzcyBpc24ndCBsb3N0LlxuICAgKiBTZXNzaW9uIGlzIHJlLWZldGNoZWQgYmV0d2VlbiBpdGVyYXRpb25zIChjb25maWcgbWF5IGNoYW5nZSksXG4gICAqIHBhcmFsbGVsaXplZCB3aXRoIHBhcnQgcGVyc2lzdGVuY2Ugb24gbm9uLWZpbmFsIGl0ZXJhdGlvbnMuXG4gICAqL1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuICBsZXQgaW50ZXJuYWxTdGVwSW5kZXggPSAwO1xuICBsZXQgbG9vcEZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uID0gXCJ1bmtub3duXCIgYXMgRmluaXNoUmVhc29uO1xuICBsZXQgd2FzQWJvcnRlZCA9IGZhbHNlO1xuICBjb25zdCBhbGxQZW5kaW5nQXBwcm92YWxzOiB7IGFwcHJvdmFsSWQ6IHN0cmluZzsgdG9vbE5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGN1cnJlbnRNYXhTdGVwczogbnVtYmVyIHwgdW5kZWZpbmVkID0gc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhTdGVwcztcbiAgbGV0IGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbjtcblxuICB0cnkge1xuICAgIGZvciAobGV0IGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IHN0ZXBUaHJvdWdocHV0OyBpdGVyYXRpb24rKykge1xuICAgICAgY3VycmVudE1heFN0ZXBzID0gY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8ubWF4U3RlcHM7XG5cbiAgICAgIGlmICghY3VycmVudFNlc3Npb24ubW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2Vzc2lvbiBtb2RlbCBpcyBub3Qgc2V0XCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGVwUGFydHM6IFVJTWVzc2FnZVtcInBhcnRzXCJdID0gW107XG4gICAgICBsZXQgc3RyZWFtVGV4dEZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uIHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHdyaXRlciB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHJhd1Rvb2xzLCB0b29sc1dpdGhOZWVkc0FwcHJvdmFsLCB0b29sQ29udGV4dCB9ID0gZ2V0VG9vbHMoe1xuICAgICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICAgICAgc2tpbGxzUmVmLFxuICAgICAgICAgICAgICB3cml0ZXIsXG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcixcbiAgICAgICAgICAgICAgbmV4dFBhcnRJbmRleFJlZixcbiAgICAgICAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHN0ZXBMb2csXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gcHJvY2VzcyBhcHByb3ZhbHMgb25jZSAoZmlyc3QgaXRlcmF0aW9uIG9ubHkpXG4gICAgICAgICAgICBpZiAoaXRlcmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NBcHByb3ZhbHMoe1xuICAgICAgICAgICAgICAgIGFsbFBhcnRzLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzUmVzdWx0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICByYXdUb29scyxcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdG9vbENvbnRleHQsXG4gICAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgICAgc3RlcExvZyxcbiAgICAgICAgICAgICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzLFxuICAgICAgICAgICAgICAgIHdyaXRlcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICAgICAgICB3cml0ZXIsXG4gICAgICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcInRoaW5raW5nXCIgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBpdGVyUmVzdWx0ID0gc3RyZWFtVGV4dEFpKHtcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LCBjb250ZW50OiBcIi5cIiB9XSxcbiAgICAgICAgICAgICAgdG9vbHM6IHRvb2xzV2l0aE5lZWRzQXBwcm92YWwsXG4gICAgICAgICAgICAgIG1vZGVsOiBjdXJyZW50U2Vzc2lvbi5tb2RlbCEsXG4gICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBzdG9wV2hlbjogc3RlcENvdW50SXMoMSksXG4gICAgICAgICAgICAgIHRlbXBlcmF0dXJlOiBjdXJyZW50U2Vzc2lvbi5nZW5lcmF0aW9uPy50ZW1wZXJhdHVyZSxcbiAgICAgICAgICAgICAgdG9wSzogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8udG9wSyxcbiAgICAgICAgICAgICAgdG9wUDogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8udG9wUCxcbiAgICAgICAgICAgICAgZnJlcXVlbmN5UGVuYWx0eTogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8uZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgICAgICAgICAgcHJlc2VuY2VQZW5hbHR5OiBjdXJyZW50U2Vzc2lvbi5nZW5lcmF0aW9uPy5wcmVzZW5jZVBlbmFsdHksXG4gICAgICAgICAgICAgIG1heE91dHB1dFRva2VuczogY3VycmVudFNlc3Npb24uZ2VuZXJhdGlvbj8ubWF4T3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBjdXJyZW50U2Vzc2lvbi5nZW5lcmF0aW9uPy5oZWFkZXJzLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDoge1xuICAgICAgICAgICAgICAgIHNlc3Npb246IGN1cnJlbnRTZXNzaW9uLFxuICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgc3RvcmFnZTogYWdlbnQuc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB9IHNhdGlzZmllcyBUb29sQ29udGV4dCxcbiAgICAgICAgICAgICAgcHJlcGFyZVN0ZXA6IGFzeW5jICh7IG1vZGVsIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBza2lsbHNDb250ZXh0ID0gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsc1JlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjd2RQcm9tcHQgPSBgWW91ciB3b3JraW5nIGRpcmVjdG9yeSBpcyAke3NhbmRib3guY3dkfS4gQWxsIGZpbGUgcGF0aHMgc2hvdWxkIGJlIGFic29sdXRlLmA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3lzdGVtSGVhZGVyID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgQkFTRV9TWVNURU1fUFJPTVBULFxuICAgICAgICAgICAgICAgICAgY3dkUHJvbXB0LFxuICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24uc3lzdGVtXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzeXN0ZW1Db250ZXh0ID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgc2tpbGxzQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgIGN3ZFByb21wdFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1aU1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgICAgICAgICAgIHVudGlsOiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZE1lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgICAgICAgICAgIHVpTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICB7IGlnbm9yZUluY29tcGxldGVUb29sQ2FsbHM6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE1lc3NhZ2VzID0gW1xuICAgICAgICAgICAgICAgICAgLi4uKHN5c3RlbUhlYWRlci50cmltKClcbiAgICAgICAgICAgICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1IZWFkZXIgfV1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAuLi4oc3lzdGVtQ29udGV4dC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1Db250ZXh0IH1dXG4gICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgLi4uY29udmVydGVkTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdENhY2hpbmcgPSBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgICBtb2RlbDogdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IG1vZGVsTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlVG9vbHMgPSBjdXJyZW50U2Vzc2lvbi5hY3RpdmVUb29scyA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHNraWxsc1JlZi5jdXJyZW50Lmxlbmd0aCA9PT0gMCAmJiBhY3RpdmVUb29scykge1xuICAgICAgICAgICAgICAgICAgYWN0aXZlVG9vbHMgPSBhY3RpdmVUb29scy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICh0KSA9PiB0ICE9PSAoXCJTa2lsbFwiIHNhdGlzZmllcyBCdWlsdEluVG9vbE5hbWUpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlczogcHJvbXB0Q2FjaGluZy5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcHJvbXB0Q2FjaGluZy5wcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICBhY3RpdmVUb29scyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblN0ZXBGaW5pc2g6ICh7IHVzYWdlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodXNhZ2UpIHtcbiAgICAgICAgICAgICAgICAgIHVzYWdlU3RlcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBJbmRleDogc3RlcEluZGV4T2Zmc2V0ICsgaW50ZXJuYWxTdGVwSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsOiBjdXJyZW50U2Vzc2lvbi5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsVG9rZW5zOiB1c2FnZS50b3RhbFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZVJlYWRUb2tlbnM6XG4gICAgICAgICAgICAgICAgICAgICAgdXNhZ2UuaW5wdXRUb2tlbkRldGFpbHM/LmNhY2hlUmVhZFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZVdyaXRlVG9rZW5zOlxuICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVdyaXRlVG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbmluZ1Rva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5vdXRwdXRUb2tlbkRldGFpbHM/LnJlYXNvbmluZ1Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGludGVybmFsU3RlcEluZGV4Kys7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd3JpdGVyLm1lcmdlKFxuICAgICAgICAgICAgICBpdGVyUmVzdWx0LnRvVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZU1lc3NhZ2VJZDogKCkgPT4gYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgIG9uRmluaXNoOiAoeyBtZXNzYWdlcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBQYXJ0cy5wdXNoKC4uLm0ucGFydHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHN0cmVhbVRleHRGaW5pc2hSZWFzb24gPSBhd2FpdCBpdGVyUmVzdWx0LmZpbmlzaFJlYXNvbjtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBzdHJlYW0ucGlwZVRvKHdyaXRhYmxlLCB7XG4gICAgICAgICAgcHJldmVudENsb3NlOiB0cnVlLFxuICAgICAgICAgIHByZXZlbnRBYm9ydDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIHdhc0Fib3J0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHdhc0Fib3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIGludGVycnVwdGVkIHRvb2wgcGFydHNcbiAgICAgIGlmICh3YXNBYm9ydGVkKSB7XG4gICAgICAgIGNvbnN0IHRlcm1pbmFsU3RhdGVzID0gbmV3IFNldChbXG4gICAgICAgICAgXCJvdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgXCJvdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICBcIm91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICBcImRvbmVcIixcbiAgICAgICAgXSk7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBzdGVwUGFydHMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBcInR5cGVcIiBpbiBwYXJ0ICYmXG4gICAgICAgICAgICB0eXBlb2YgcGFydC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBwYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpICYmXG4gICAgICAgICAgICBcInN0YXRlXCIgaW4gcGFydCAmJlxuICAgICAgICAgICAgIXRlcm1pbmFsU3RhdGVzLmhhcyhwYXJ0LnN0YXRlIGFzIHN0cmluZylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIChwYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9IFwib3V0cHV0LWVycm9yXCI7XG4gICAgICAgICAgICAocGFydCBhcyB7IGVycm9yVGV4dD86IHN0cmluZyB9KS5lcnJvclRleHQgPSBcImludGVycnVwdGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBpbnRlcnJ1cHRlZCBsYXN0UGFydCB0cnVuY2F0aW9uXG4gICAgICBjb25zdCBsYXN0UGFydCA9IGludGVycnVwdGVkTGFzdFBhcnRSZWYuY3VycmVudDtcblxuICAgICAgY29uc3QgbmV3UGFydFJlY29yZHMgPSBzdGVwUGFydHNcbiAgICAgICAgLm1hcCgodWlQYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBuZXh0UGFydEluZGV4UmVmLmN1cnJlbnQgKyBpO1xuICAgICAgICAgIGlmIChsYXN0UGFydCAhPSBudWxsICYmIGluZGV4ID4gbGFzdFBhcnQuaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB1c2VDbGllbnRQYXJ0ID0gbGFzdFBhcnQgIT0gbnVsbCAmJiBpbmRleCA9PT0gbGFzdFBhcnQuaW5kZXg7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IChcbiAgICAgICAgICAgIHVzZUNsaWVudFBhcnQgPyBsYXN0UGFydC5wYXJ0IDogdWlQYXJ0XG4gICAgICAgICAgKSBhcyBUeXBlZFVJTWVzc2FnZTxUb29scz5bXCJwYXJ0c1wiXVtudW1iZXJdO1xuICAgICAgICAgIGNvbnN0IHBhcnRJZCA9XG4gICAgICAgICAgICBcImFwcHJvdmFsXCIgaW4gY29udGVudCAmJiBjb250ZW50LmFwcHJvdmFsPy5pZFxuICAgICAgICAgICAgICA/IGFwcHJvdmFsUGFydElkKGNvbnRlbnQuYXBwcm92YWwuaWQpXG4gICAgICAgICAgICAgIDogYHBhcnRfJHthc3Npc3RhbnRNZXNzYWdlSWR9XyR7aW5kZXh9YDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBwYXJ0OiBjb250ZW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKHIpOiByIGlzIE5vbk51bGxhYmxlPHR5cGVvZiByPiA9PiByICE9PSBudWxsKTtcblxuICAgICAgY29uc3QgcGVyc2lzdFBhcnRzUHJvbWlzZSA9IFByb21pc2UuYWxsKFxuICAgICAgICBuZXdQYXJ0UmVjb3Jkcy5tYXAoKHJlY29yZCkgPT5cbiAgICAgICAgICBhZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHJlY29yZC5pZCwgcmVjb3JkKVxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICBuZXh0UGFydEluZGV4UmVmLmN1cnJlbnQgPVxuICAgICAgICBsYXN0UGFydCAhPSBudWxsXG4gICAgICAgICAgPyBNYXRoLm1pbihcbiAgICAgICAgICAgICAgbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgc3RlcFBhcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgbGFzdFBhcnQuaW5kZXggKyAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBuZXh0UGFydEluZGV4UmVmLmN1cnJlbnQgKyBzdGVwUGFydHMubGVuZ3RoO1xuXG4gICAgICBjb25zdCBpdGVyUGVuZGluZ0FwcHJvdmFscyA9IHN0ZXBQYXJ0c1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChwKTogcCBpcyB0eXBlb2YgcCAmIHsgYXBwcm92YWw6IHsgaWQ6IHN0cmluZyB9IH0gPT5cbiAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwICYmXG4gICAgICAgICAgICBwLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICAgICAgICBcImFwcHJvdmFsXCIgaW4gcCAmJlxuICAgICAgICAgICAgISEocCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfSkuYXBwcm92YWw/LmlkXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBhcHByb3ZhbElkOiBwLmFwcHJvdmFsLmlkLFxuICAgICAgICAgIHRvb2xOYW1lOlxuICAgICAgICAgICAgXCJ0eXBlXCIgaW4gcCA/IFN0cmluZyhwLnR5cGUpLnJlcGxhY2UoXCJ0b29sLVwiLCBcIlwiKSA6IFwidW5rbm93blwiLFxuICAgICAgICB9KSk7XG5cbiAgICAgIGxvb3BGaW5pc2hSZWFzb24gPSB3YXNBYm9ydGVkXG4gICAgICAgID8gKFwic3RvcFwiIGFzIEZpbmlzaFJlYXNvbilcbiAgICAgICAgOiAoc3RyZWFtVGV4dEZpbmlzaFJlYXNvbiA/PyAoXCJ1bmtub3duXCIgYXMgRmluaXNoUmVhc29uKSk7XG5cbiAgICAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIGJyZWFrIG9yIGNvbnRpbnVlXG4gICAgICBjb25zdCBzaG91bGRCcmVhayA9XG4gICAgICAgIGl0ZXJQZW5kaW5nQXBwcm92YWxzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgbG9vcEZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIgfHxcbiAgICAgICAgd2FzQWJvcnRlZCB8fFxuICAgICAgICBsYXN0UGFydCAhPSBudWxsIHx8XG4gICAgICAgIChjdXJyZW50TWF4U3RlcHMgIT0gbnVsbCAmJlxuICAgICAgICAgIHN0ZXBJbmRleE9mZnNldCArIHVzYWdlU3RlcHMubGVuZ3RoID49IGN1cnJlbnRNYXhTdGVwcykgfHxcbiAgICAgICAgaXRlcmF0aW9uID49IHN0ZXBUaHJvdWdocHV0IC0gMTtcblxuICAgICAgaWYgKHNob3VsZEJyZWFrKSB7XG4gICAgICAgIGF3YWl0IHBlcnNpc3RQYXJ0c1Byb21pc2U7XG4gICAgICAgIGFsbFBhcnRzLnB1c2goLi4ubmV3UGFydFJlY29yZHMpO1xuICAgICAgICBhbGxQZW5kaW5nQXBwcm92YWxzLnB1c2goLi4uaXRlclBlbmRpbmdBcHByb3ZhbHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gTm9uLWZpbmFsIGl0ZXJhdGlvbjogcGVyc2lzdCBwYXJ0cyArIHJlLWZldGNoIHNlc3Npb24gaW4gcGFyYWxsZWxcbiAgICAgIGNvbnN0IFssIG5leHRTZXNzaW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcGVyc2lzdFBhcnRzUHJvbWlzZSxcbiAgICAgICAgYWdlbnQuc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpLnRoZW4oKHMpID0+IHtcbiAgICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICBhbGxQYXJ0cy5wdXNoKC4uLm5ld1BhcnRSZWNvcmRzKTtcbiAgICAgIGN1cnJlbnRTZXNzaW9uID0gbmV4dFNlc3Npb247XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGhyb3R0bGVkRW1pdFN0YXR1cy5kaXNwb3NlKCk7XG4gIH1cblxuICBpZiAoc2V0U3RhcnRlZFByb21pc2UpIHtcbiAgICBhd2FpdCBzZXRTdGFydGVkUHJvbWlzZTtcbiAgfVxuXG4gIGRvbmVTdGVwKHtcbiAgICBmaW5pc2hSZWFzb246IGxvb3BGaW5pc2hSZWFzb24sXG4gICAgd2FzQWJvcnRlZCxcbiAgICBpdGVyYXRpb25zOiBpbnRlcm5hbFN0ZXBJbmRleCxcbiAgICBwZW5kaW5nQXBwcm92YWxzOiBhbGxQZW5kaW5nQXBwcm92YWxzLmxlbmd0aCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2hSZWFzb246IGxvb3BGaW5pc2hSZWFzb24sXG4gICAgbGFzdFBhcnRJbmRleDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50LFxuICAgIHVzYWdlU3RlcHMsXG4gICAgcGVuZGluZ0FwcHJvdmFsczogYWxsUGVuZGluZ0FwcHJvdmFscyxcbiAgICBtYXhTdGVwczogY3VycmVudE1heFN0ZXBzLFxuICAgIGRpc2NvdmVyZWRTa2lsbHM6IHNraWxsc1JlZi5jdXJyZW50LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBTdGVwc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dFN0ZXA8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PihcbiAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2Ygc3RyZWFtVGV4dDxUb29scz4+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICByZXR1cm4gYXdhaXQgc3RyZWFtVGV4dCguLi5hcmdzKTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVXRpbHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0FwcHJvdmFscyh7XG4gIGFsbFBhcnRzLFxuICBtZXNzYWdlc1Jlc3VsdCxcbiAgY3JlYXRlZEF0LFxuICByYXdUb29scyxcbiAgYWJvcnRDb250cm9sbGVyLFxuICB0b29sQ29udGV4dCxcbiAgYWdlbnQsXG4gIHN0ZXBMb2csXG4gIHRocm90dGxlZEVtaXRTdGF0dXMsXG4gIHdyaXRlcixcbn06IHtcbiAgYWxsUGFydHM6IFBhcnRbXTtcbiAgbWVzc2FnZXNSZXN1bHQ6IFBhcmFtZXRlcnM8dHlwZW9mIGFzc2VtYmxlVUlNZXNzYWdlcz5bMF1bXCJtZXNzYWdlc1wiXTtcbiAgY3JlYXRlZEF0OiBudW1iZXI7XG4gIHJhd1Rvb2xzOiBUb29sU2V0O1xuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbiAgdG9vbENvbnRleHQ6IFRvb2xDb250ZXh0O1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIHN0ZXBMb2c6IExvZ2dlcjtcbiAgdGhyb3R0bGVkRW1pdFN0YXR1czogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlVGhyb3R0bGVkRW1pdFN0YXR1cz47XG4gIHdyaXRlcjogU3RyZWFtV3JpdGVyO1xufSkge1xuICAvLyBFeGVjdXRlIGFwcHJvdmVkIHRvb2xzIHNvIHRoZSBtb2RlbCBzZWVzIGNvbXBsZXRlIHRvb2wgY2FsbCArIHJlc3VsdCBwYWlyc1xuICBjb25zdCBhcHByb3ZlZFBhcnRzID0gYWxsUGFydHMuZmlsdGVyKFxuICAgIChwKSA9PlxuICAgICAgcC5wYXJ0ICYmXG4gICAgICBcInN0YXRlXCIgaW4gcC5wYXJ0ICYmXG4gICAgICAocC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXNwb25kZWRcIiAmJlxuICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IGFwcHJvdmFsPzogeyBhcHByb3ZlZDogYm9vbGVhbiB9IH0pLmFwcHJvdmFsPy5hcHByb3ZlZCA9PT1cbiAgICAgICAgdHJ1ZVxuICApO1xuXG4gIGlmIChhcHByb3ZlZFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICBzdGVwTG9nLmluZm8oXCJleGVjdXRpbmcgYXBwcm92ZWQgdG9vbHNcIiwge1xuICAgICAgY291bnQ6IGFwcHJvdmVkUGFydHMubGVuZ3RoLFxuICAgIH0pO1xuICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgd3JpdGVyLFxuICAgICAgc3RhdHVzOiB7IHR5cGU6IFwicHJvY2Vzc2luZy1hcHByb3ZhbHNcIiB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJlRXhlY01lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgIGFzc2VtYmxlVUlNZXNzYWdlcyh7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdCxcbiAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICB1bnRpbDogY3JlYXRlZEF0LFxuICAgICAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgfSksXG4gICAgICB7IGlnbm9yZUluY29tcGxldGVUb29sQ2FsbHM6IHRydWUgfVxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFwcHJvdmVkUGFydHMubWFwKGFzeW5jIChhcCkgPT4ge1xuICAgICAgICBpZiAoIWFwLnBhcnQudHlwZS5zdGFydHNXaXRoKFwidG9vbC1cIikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydCA9IGFwLnBhcnQgYXMgRXh0cmFjdDxcbiAgICAgICAgICBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdLFxuICAgICAgICAgIHsgdHlwZTogYHRvb2wtJHtzdHJpbmd9YCB9XG4gICAgICAgID47XG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gcGFydC50eXBlLnJlcGxhY2UoXCJ0b29sLVwiLCBcIlwiKTtcbiAgICAgICAgY29uc3QgdG9vbERlZiA9IHJhd1Rvb2xzW3Rvb2xOYW1lXTtcblxuICAgICAgICBpZiAodG9vbERlZj8uZXhlY3V0ZSAmJiBwYXJ0LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdG9vbE91dHB1dCA9IGF3YWl0IHRvb2xEZWYuZXhlY3V0ZShwYXJ0LmlucHV0LCB7XG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IHByZUV4ZWNNZXNzYWdlcyxcbiAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFydC5zdGF0ZSA9IFwib3V0cHV0LWF2YWlsYWJsZVwiO1xuICAgICAgICAgICAgcGFydC5vdXRwdXQgPSB0b29sT3V0cHV0O1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHRvb2xPdXRwdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1lcnJvclwiO1xuICAgICAgICAgICAgcGFydC5lcnJvclRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgZXJyb3JUZXh0OiBwYXJ0LmVycm9yVGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuc2V0KGFwLmlkLCB7IC4uLmFwLCBwYXJ0IH0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBBdXRvLWRlbnkgYW55IHJlbWFpbmluZyBhcHByb3ZhbC1yZXF1ZXN0ZWQgcGFydHMgc28gdGhlIG1vZGVsXG4gIC8vIHNlZXMgY29tcGxldGUgdG9vbCBjYWxsICsgZGVuaWVkIHJlc3VsdCBwYWlycyAobm90IG1pc3NpbmcgcmVzdWx0cykuXG4gIGNvbnN0IHBlbmRpbmdBcHByb3ZhbFBhcnRzID0gYWxsUGFydHMuZmlsdGVyKFxuICAgIChwKSA9PiAocC5wYXJ0IGFzIHsgc3RhdGU/OiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCJcbiAgKTtcbiAgaWYgKHBlbmRpbmdBcHByb3ZhbFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBlbmRpbmdBcHByb3ZhbFBhcnRzLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgICBjb25zdCBkZW5pZWQgPSB7XG4gICAgICAgICAgLi4ucCxcbiAgICAgICAgICBwYXJ0OiB7XG4gICAgICAgICAgICAuLi5wLnBhcnQsXG4gICAgICAgICAgICBzdGF0ZTogXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICBhcHByb3ZhbDoge1xuICAgICAgICAgICAgICAuLi4oKHAucGFydCBhcyB7IGFwcHJvdmFsPzogb2JqZWN0IH0pLmFwcHJvdmFsID8/IHt9KSxcbiAgICAgICAgICAgICAgYXBwcm92ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICByZWFzb246IFwiYXV0by1kZW5pZWQ6IG5ldyBtZXNzYWdlIHNlbnRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyB0eXBlb2YgcC5wYXJ0LFxuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuYXNzaWduKHAsIGRlbmllZCk7XG4gICAgICAgIGF3YWl0IGFnZW50LnN0b3JhZ2UucGFydC5zZXQocC5pZCwgZGVuaWVkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIFN0cmVhbVdyaXRlciA9IFVJTWVzc2FnZVN0cmVhbVdyaXRlcjtcblxuZnVuY3Rpb24gZW1pdFN0YXR1cyh7XG4gIHdyaXRlcixcbiAgc3RhdHVzLFxuICBhZ2VudCxcbn06IHtcbiAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gIHN0YXR1czogQWdlbnRTdGF0dXM7XG4gIGFnZW50OiBBbnlBZ2VudDtcbn0pIHtcbiAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJkYXRhLXN0YXR1c1wiLCBkYXRhOiBzdGF0dXMsIHRyYW5zaWVudDogdHJ1ZSB9KTtcbiAgYWdlbnQuaG9va3M/LnN0YXR1cz8uKHN0YXR1cyk7XG59XG5cbmNvbnN0IFNUQVRVU19USFJPVFRMRV9NUyA9IDUwMDtcblxuZnVuY3Rpb24gY3JlYXRlVGhyb3R0bGVkRW1pdFN0YXR1cyhhZ2VudDogQW55QWdlbnQpIHtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBsZXQgcGVuZGluZzoge1xuICAgIHdyaXRlcjogU3RyZWFtV3JpdGVyO1xuICAgIHN0YXR1czogQWdlbnRTdGF0dXM7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBmdW5jdGlvbiB0aHJvdHRsZWQoe1xuICAgIHdyaXRlcixcbiAgICBzdGF0dXMsXG4gIH06IHtcbiAgICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbiAgICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICB9KSB7XG4gICAgcGVuZGluZyA9IHsgd3JpdGVyLCBzdGF0dXMgfTtcbiAgICBpZiAodGltZXIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmx1c2goKTtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgZmx1c2goKTtcbiAgICAgIH1cbiAgICB9LCBTVEFUVVNfVEhST1RUTEVfTVMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgd3JpdGVyLCBzdGF0dXMgfSA9IHBlbmRpbmc7XG4gICAgcGVuZGluZyA9IG51bGw7XG4gICAgZW1pdFN0YXR1cyh7IHdyaXRlciwgc3RhdHVzLCBhZ2VudCB9KTtcbiAgfVxuXG4gIHRocm90dGxlZC5kaXNwb3NlID0gKCkgPT4ge1xuICAgIGlmICh0aW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZmx1c2goKTtcbiAgfTtcblxuICByZXR1cm4gdGhyb3R0bGVkO1xufVxuXG5jb25zdCBCQVNFX1NZU1RFTV9QUk9NUFQgPVxuICBcIllvdSBhcmUgYW4gQUkgYXNzaXN0YW50IHdpdGggYmFzaWMgdG9vbHMgdG8gaW50ZXJhY3Qgd2l0aCB5b3VyIGVudmlyb25tZW50LiBFeHBsb3JlIGFuZCB3b3JrIGZyZWVseS5cIjtcblxuZnVuY3Rpb24gam9pblByb21wdFNlY3Rpb25zKFxuICAuLi5zZWN0aW9uczogKHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpW11cbik6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9ucy5maWx0ZXIoKHMpID0+IHM/LnRyaW0oKSkuam9pbihcIlxcblxcblwiKTtcbn1cblxuY29uc3QgYmFja2dyb3VuZFByb2Nlc3NQcm9tcHQgPSBgIyMgQmFja2dyb3VuZCBQcm9jZXNzZXNcblRoZXNlIGJhY2tncm91bmQgcHJvY2VzcyBpbnN0cnVjdGlvbnMgYXJlIGZvciB5b3UgdG8gbWFuaXB1bGF0ZSB0aGUgcHJvY2Vzc2VzLCBkbyBub3QgYmUgdG8gdmVyYm9zZSB0byB0aGUgdXNlciBhYm91dCB0aGUgcmVzcG9uc2UgZGV0YWlscyBsaWtlIFwiaG93IHRvIGRlYnVnIHRoZSBwcm9jZXNzIG91dHB1dFwiIHRoZSB1c2VyIHdpbGwgaGF2ZSBhbiBVSS5cblxuVXNlIFxcYHdhaXRVbnRpbDogMFxcYCBmb3IgZGV2IHNlcnZlcnMgdGhhdCBzaG91bGQgcnVuIGluZGVmaW5pdGVseS5cbkl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBjaGVjayB0aGUgb3V0cHV0IGxvZyBhZnRlciBydW5uaW5nIHByb2Nlc3NlcyBsaWtlIGRldiBzZXJ2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IHN0YXJ0ZWQgY29ycmVjdGx5LlxuXG5UbyBydW4gYSBiYWNrZ3JvdW5kIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJucG0gcnVuIGRldlwiLCB3YWl0VW50aWw6IDAgfSlcblJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBcXGBjb21tYW5kSWRcXGAuIFRoZSBwcm9jZXNzIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIHNhbmRib3guXG5cblRvIGtpbGwgYSBwcm9jZXNzOlxuQmFzaCh7IGNvbW1hbmQ6IFwicHMgYXV4IHwgZ3JlcCBub2RlXCIgfSkgICAvLyBGaW5kIHRoZSBQSURcbkJhc2goeyBjb21tYW5kOiBcImtpbGwge3BpZH1cIiB9KSAgICAgICAgICAgIC8vIEdyYWNlZnVsXG5CYXNoKHsgY29tbWFuZDogXCJraWxsIC05IHtwaWR9XCIgfSkgICAgICAgICAvLyBGb3JjZVxuYDtcblxuZnVuY3Rpb24gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsczogU2tpbGxTdW1tYXJ5W10pOiBzdHJpbmcge1xuICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxMaW5lcyA9IHNraWxsc1xuICAgIC5tYXAoKHMpID0+IGAtICR7cy5uYW1lfTogJHtzLmRlc2NyaXB0aW9ufWApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgcmV0dXJuIGAjIyBBdmFpbGFibGUgU2tpbGxzXG4ke3NraWxsTGluZXN9XG5cbiR7YmFja2dyb3VuZFByb2Nlc3NQcm9tcHR9XG5cblVzZSB0aGUgU2tpbGwgdG9vbCB0byBsb2FkIGEgc2tpbGwncyBmdWxsIGluc3RydWN0aW9ucyBiZWZvcmUgZm9sbG93aW5nIGl0LmA7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCB0eXBlIExvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7IHBhcnNlU2tpbGxGcm9udG1hdHRlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIERpc2NvdmVycyBza2lsbHMgZnJvbSBkaXJlY3RvcmllcyBpbnNpZGUgdGhlIHNhbmRib3ggYnkgZmluZGluZyBhbmQgcGFyc2luZyBTS0lMTC5tZCBmaWxlcy5cbiAqIFNjYW5zIGVhY2ggZGlyZWN0b3J5IGZvciBzdWJkaXJlY3RvcmllcyBjb250YWluaW5nIFNLSUxMLm1kLCBleHRyYWN0cyBmcm9udG1hdHRlciBtZXRhZGF0YSxcbiAqIGFuZCByZXR1cm5zIHN1bW1hcmllcyBmb3IgdXNlIGluIHRoZSBzeXN0ZW0gcHJvbXB0LlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIHNraWxsIHN1bW1hcmllcyAoZGVkdXBsaWNhdGVkIGJ5IG5hbWUsIGZpcnN0IG9jY3VycmVuY2Ugd2lucylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94KG9wdHM6IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsc0RpcnM6IHN0cmluZ1tdO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxTa2lsbFN1bW1hcnlbXT4ge1xuICBjb25zdCB7IGFnZW50LCBzYW5kYm94LCBza2lsbHNEaXJzLCBzZXNzaW9uSWQgfSA9IG9wdHM7XG4gIGNvbnN0IGJhc2VMb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2tpbGxzXCIsXG4gIH0pO1xuICBjb25zdCBsb2cgPSBzZXNzaW9uSWQgPyBiYXNlTG9nLndpdGhDb250ZXh0KHsgc2Vzc2lvbklkIH0pIDogYmFzZUxvZztcbiAgY29uc3QgZG9uZSA9IGxvZy50aW1lKFwiZGlzY292ZXJTa2lsbHNJblNhbmRib3hcIik7XG5cbiAgY29uc3Qgc3VtbWFyaWVzOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuICBjb25zdCBzZWVuTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHNraWxsc0RpciBvZiBza2lsbHNEaXJzKSB7XG4gICAgY29uc3QgZGlyRG9uZSA9IGxvZy50aW1lKFwic2NhbiBkaXJlY3RvcnlcIiwgeyBkaXI6IHNraWxsc0RpciB9KTtcbiAgICBjb25zdCBkaXJTdW1tYXJpZXMgPSBhd2FpdCBkaXNjb3ZlclNraWxsc0luRGlyZWN0b3J5KHtcbiAgICAgIHNhbmRib3gsXG4gICAgICBza2lsbHNEaXIsXG4gICAgICBsb2csXG4gICAgfSk7XG4gICAgZGlyRG9uZSh7IGNvdW50OiBkaXJTdW1tYXJpZXMubGVuZ3RoIH0pO1xuXG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIGRpclN1bW1hcmllcykge1xuICAgICAgaWYgKCFzZWVuTmFtZXMuaGFzKHN1bW1hcnkubmFtZSkpIHtcbiAgICAgICAgc2Vlbk5hbWVzLmFkZChzdW1tYXJ5Lm5hbWUpO1xuICAgICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkb25lKHsgdG90YWxTa2lsbHM6IHN1bW1hcmllcy5sZW5ndGggfSk7XG5cbiAgcmV0dXJuIHN1bW1hcmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeShvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGxvZzogTG9nZ2VyO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGxvZyB9ID0gb3B0cztcbiAgY29uc3Qgc2tpbGxQYXRocyA9IGF3YWl0IGZpbmRTa2lsbEZpbGVzKHsgc2FuZGJveCwgc2tpbGxzRGlyLCBsb2cgfSk7XG5cbiAgaWYgKHNraWxsUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyaWVzOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc2tpbGxNZFBhdGggb2Ygc2tpbGxQYXRocykge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBhd2FpdCBwYXJzZVNraWxsRmlsZSh7IHNhbmRib3gsIHNraWxsTWRQYXRoLCBsb2cgfSk7XG4gICAgaWYgKHN1bW1hcnkpIHtcbiAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRTa2lsbEZpbGVzKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbHNEaXI6IHN0cmluZztcbiAgbG9nOiBMb2dnZXI7XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsc0RpciwgbG9nIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwiZmluZFwiLFxuICAgIGFyZ3M6IFtza2lsbHNEaXIsIFwiLW5hbWVcIiwgXCJTS0lMTC5tZFwiLCBcIi10eXBlXCIsIFwiZlwiXSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGxvZy53YXJuKFwiZmFpbGVkIHRvIHNjYW4gc2tpbGxzIGRpcmVjdG9yeVwiLCB7XG4gICAgICBkaXI6IHNraWxsc0RpcixcbiAgICAgIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBsb2cud2FybihcInNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGluYWNjZXNzaWJsZVwiLCB7IGRpcjogc2tpbGxzRGlyIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBzdGRvdXRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLmZpbHRlcigocCkgPT4gcC5sZW5ndGggPiAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VTa2lsbEZpbGUob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsTWRQYXRoOiBzdHJpbmc7XG4gIGxvZzogTG9nZ2VyO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5IHwgbnVsbD4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsTWRQYXRoLCBsb2cgfSA9IG9wdHM7XG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwiY2F0XCIsXG4gICAgYXJnczogW3NraWxsTWRQYXRoXSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGxvZy53YXJuKFwiZmFpbGVkIHRvIHJlYWQgc2tpbGwgZmlsZVwiLCB7XG4gICAgICBwYXRoOiBza2lsbE1kUGF0aCxcbiAgICAgIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGxvZy53YXJuKFwiY291bGQgbm90IHJlYWQgc2tpbGwgZmlsZVwiLCB7IHBhdGg6IHNraWxsTWRQYXRoIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTa2lsbEZyb250bWF0dGVyKHN0ZG91dCk7XG5cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICBsb2cud2FybihcImludmFsaWQgb3IgbWlzc2luZyBmcm9udG1hdHRlclwiLCB7IHBhdGg6IHNraWxsTWRQYXRoIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYXJzZWQubmFtZSxcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VkLmRlc2NyaXB0aW9uLFxuICAgIHNraWxsTWRQYXRoLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBIb3N0U2tpbGxJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhvcHRzOiB7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xuICByZWxhdGl2ZVByZWZpeD86IHN0cmluZztcbn0pOiBQcm9taXNlPHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBCdWZmZXIgfVtdPiB7XG4gIGNvbnN0IHsgcmVhZGRpciwgcmVhZEZpbGUsIHN0YXQgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcG9zaXg6IHBhdGhQb3NpeCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gIGNvbnN0IGZpbGVTdGF0ID0gYXdhaXQgc3RhdChvcHRzLmFic29sdXRlUGF0aCk7XG4gIGlmIChmaWxlU3RhdC5pc0ZpbGUoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShvcHRzLmFic29sdXRlUGF0aCk7XG4gICAgcmV0dXJuIFt7IHBhdGg6IG9wdHMucmVsYXRpdmVQcmVmaXggPz8gXCJTS0lMTC5tZFwiLCBjb250ZW50IH1dO1xuICB9XG5cbiAgaWYgKCFmaWxlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIob3B0cy5hYnNvbHV0ZVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3QgZmlsZXM6IHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBCdWZmZXIgfVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmV4dEFicyA9IHJlc29sdmUob3B0cy5hYnNvbHV0ZVBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IG5leHRSZWwgPSBvcHRzLnJlbGF0aXZlUHJlZml4XG4gICAgICA/IHBhdGhQb3NpeC5qb2luKG9wdHMucmVsYXRpdmVQcmVmaXgsIGVudHJ5Lm5hbWUpXG4gICAgICA6IGVudHJ5Lm5hbWU7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaChcbiAgICAgICAgLi4uKGF3YWl0IGNvbGxlY3RGaWxlcyh7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoOiBuZXh0QWJzLFxuICAgICAgICAgIHJlbGF0aXZlUHJlZml4OiBuZXh0UmVsLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBuZXh0UmVsLFxuICAgICAgICBjb250ZW50OiBhd2FpdCByZWFkRmlsZShuZXh0QWJzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhYmxlRGlyTmFtZShpbnB1dFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjcnlwdG9cIik7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUoaW5wdXRQYXRoKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTApO1xuICByZXR1cm4gYGhvc3QtJHtoYXNofWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlSG9zdFNraWxsKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbDogSG9zdFNraWxsSW5wdXQ7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyByZXNvbHZlLCBwb3NpeDogcGF0aFBvc2l4IH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG5cbiAgY29uc3QgaG9zdFBhdGggPSByZXNvbHZlKHByb2Nlc3MuY3dkKCksIG9wdHMuc2tpbGwucGF0aCk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgY29sbGVjdEZpbGVzKHsgYWJzb2x1dGVQYXRoOiBob3N0UGF0aCB9KTtcbiAgY29uc3QgZGlyTmFtZSA9IGF3YWl0IHN0YWJsZURpck5hbWUoaG9zdFBhdGgpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGhQb3NpeC5qb2luKFwiLmFnZW50XCIsIFwic2tpbGxzXCIsIFwiLm1hdGVyaWFsaXplZFwiLCBkaXJOYW1lKTtcblxuICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGRlc3RQYXRoO1xuICB9XG5cbiAgYXdhaXQgb3B0cy5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgIGZpbGVzLFxuICAgIGRlc3RQYXRoLFxuICB9KTtcblxuICByZXR1cm4gZGVzdFBhdGg7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IElubGluZVNraWxsSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5mdW5jdGlvbiBzbHVnaWZ5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgIC5yZXBsYWNlKC8oXi18LSQpL2csIFwiXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFibGVJbmxpbmVEaXJOYW1lKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjcnlwdG9cIik7XG4gIGNvbnN0IHNsdWcgPSBzbHVnaWZ5KG5hbWUpIHx8IFwiaW5saW5lLXNraWxsXCI7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUobmFtZSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xuICByZXR1cm4gYCR7c2x1Z30tJHtoYXNofWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxNYXJrZG93bihza2lsbDogSW5saW5lU2tpbGxJbnB1dCk6IHN0cmluZyB7XG4gIHJldHVybiBgLS0tXG5uYW1lOiAke3NraWxsLm5hbWV9XG5kZXNjcmlwdGlvbjogJHtza2lsbC5kZXNjcmlwdGlvbn1cbi0tLVxuXG4ke3NraWxsLmluc3RydWN0aW9ucy50cmltKCl9XG5gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUlubGluZVNraWxsKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbDogSW5saW5lU2tpbGxJbnB1dDtcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHBvc2l4OiBwYXRoUG9zaXggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcblxuICBjb25zdCBkaXJOYW1lID0gYXdhaXQgc3RhYmxlSW5saW5lRGlyTmFtZShvcHRzLnNraWxsLm5hbWUpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGhQb3NpeC5qb2luKFwiLmFnZW50XCIsIFwic2tpbGxzXCIsIFwiLm1hdGVyaWFsaXplZFwiLCBkaXJOYW1lKTtcblxuICBhd2FpdCBvcHRzLnNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZGVzdFBhdGgsXG4gICAgZmlsZXM6IFtcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJTS0lMTC5tZFwiLFxuICAgICAgICBjb250ZW50OiBidWlsZFNraWxsTWFya2Rvd24ob3B0cy5za2lsbCksXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIHJldHVybiBkZXN0UGF0aDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgR2l0U2tpbGxJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmZ1bmN0aW9uIHNoZWxsUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBgJ1xcXFwnJ2ApfSdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFibGVSZXBvRGlyTmFtZShza2lsbDogR2l0U2tpbGxJbnB1dCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjcnlwdG9cIik7XG4gIGNvbnN0IGhhc2hJbnB1dCA9IGAke3NraWxsLnJlcG99Ojoke3NraWxsLnJlZiA/PyBcIkhFQURcIn1gO1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKGhhc2hJbnB1dCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDEyKTtcbiAgcmV0dXJuIGBnaXQtJHtoYXNofWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUmVtb3RlU2tpbGwob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsOiBHaXRTa2lsbElucHV0O1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcG9zaXg6IHBhdGhQb3NpeCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gIGNvbnN0IGRpck5hbWUgPSBhd2FpdCBzdGFibGVSZXBvRGlyTmFtZShvcHRzLnNraWxsKTtcbiAgY29uc3QgY2xvbmVEaXIgPSBwYXRoUG9zaXguam9pbihcIi5hZ2VudFwiLCBcInNraWxsc1wiLCBcIi5tYXRlcmlhbGl6ZWRcIiwgZGlyTmFtZSk7XG4gIGNvbnN0IHF1b3RlZERpciA9IHNoZWxsUXVvdGUoY2xvbmVEaXIpO1xuICBjb25zdCBxdW90ZWRSZXBvID0gc2hlbGxRdW90ZShvcHRzLnNraWxsLnJlcG8pO1xuICBjb25zdCBxdW90ZWRSZWYgPSBzaGVsbFF1b3RlKG9wdHMuc2tpbGwucmVmID8/IFwiSEVBRFwiKTtcblxuICBjb25zdCBzeW5jQ29tbWFuZCA9IFtcbiAgICBcInNldCAtZXVvIHBpcGVmYWlsXCIsXG4gICAgYGlmIFsgISAtZCAke3F1b3RlZERpcn0vLmdpdCBdOyB0aGVuYCxcbiAgICBgICBybSAtcmYgJHtxdW90ZWREaXJ9YCxcbiAgICBgICBta2RpciAtcCAke3F1b3RlZERpcn1gLFxuICAgIGAgIGdpdCBjbG9uZSAtLWRlcHRoIDEgJHtxdW90ZWRSZXBvfSAke3F1b3RlZERpcn1gLFxuICAgIFwiZmlcIixcbiAgICBgaWYgWyAke3F1b3RlZFJlZn0gIT0gJ0hFQUQnIF07IHRoZW5gLFxuICAgIGAgIGdpdCAtQyAke3F1b3RlZERpcn0gZmV0Y2ggLS1kZXB0aCAxIG9yaWdpbiAke3F1b3RlZFJlZn1gLFxuICAgIGAgIGdpdCAtQyAke3F1b3RlZERpcn0gY2hlY2tvdXQgRkVUQ0hfSEVBRGAsXG4gICAgXCJmaVwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IG9wdHMuc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICBhcmdzOiBbXCItbGNcIiwgc3luY0NvbW1hbmRdLFxuICB9KTtcbiAgY29uc3QgeyBleGl0Q29kZSwgc3RkZXJyIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBtYXRlcmlhbGl6ZSBnaXQgc2tpbGwgZnJvbSAke29wdHMuc2tpbGwucmVwb306ICR7c3RkZXJyIHx8IFwidW5rbm93biBlcnJvclwifWBcbiAgICApO1xuICB9XG5cbiAgbGV0IHJlc29sdmVkRGlyID0gY2xvbmVEaXI7XG4gIGlmIChvcHRzLnNraWxsLnBhdGgpIHtcbiAgICByZXNvbHZlZERpciA9IHBhdGhQb3NpeC5qb2luKHJlc29sdmVkRGlyLCBvcHRzLnNraWxsLnBhdGgpO1xuICB9XG4gIGlmIChvcHRzLnNraWxsLm5hbWUpIHtcbiAgICByZXNvbHZlZERpciA9IHBhdGhQb3NpeC5qb2luKHJlc29sdmVkRGlyLCBvcHRzLnNraWxsLm5hbWUpO1xuICB9XG4gIHJldHVybiByZXNvbHZlZERpcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBub3JtYWxpemVTa2lsbHMgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB7IHJlc29sdmVIb3N0U2tpbGwgfSBmcm9tIFwiLi9yZXNvbHZlLWhvc3RcIjtcbmltcG9ydCB7IHJlc29sdmVJbmxpbmVTa2lsbCB9IGZyb20gXCIuL3Jlc29sdmUtaW5saW5lXCI7XG5pbXBvcnQgeyByZXNvbHZlUmVtb3RlU2tpbGwgfSBmcm9tIFwiLi9yZXNvbHZlLXJlbW90ZVwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbElucHV0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbElucHV0c1RvU2FuZGJveERpcnMob3B0czoge1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGxzOiBTa2lsbElucHV0W107XG4gIHNlc3Npb25JZD86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGJhc2VMb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5vcHRzLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogb3B0cy5hZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNraWxsc1wiLFxuICB9KTtcbiAgY29uc3QgbG9nID0gb3B0cy5zZXNzaW9uSWRcbiAgICA/IGJhc2VMb2cud2l0aENvbnRleHQoeyBzZXNzaW9uSWQ6IG9wdHMuc2Vzc2lvbklkIH0pXG4gICAgOiBiYXNlTG9nO1xuICBjb25zdCBlbnRyaWVzID0gbm9ybWFsaXplU2tpbGxzKG9wdHMuc2tpbGxzKTtcbiAgY29uc3QgcmVzb2x2ZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09IFwic2FuZGJveFwiKSB7XG4gICAgICByZXNvbHZlZC5wdXNoKGVudHJ5LnBhdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChlbnRyeS50eXBlID09PSBcImhvc3RcIikge1xuICAgICAgcmVzb2x2ZWQucHVzaChcbiAgICAgICAgYXdhaXQgcmVzb2x2ZUhvc3RTa2lsbCh7XG4gICAgICAgICAgc2FuZGJveDogb3B0cy5zYW5kYm94LFxuICAgICAgICAgIHNraWxsOiBlbnRyeSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09IFwiZ2l0XCIpIHtcbiAgICAgIHJlc29sdmVkLnB1c2goXG4gICAgICAgIGF3YWl0IHJlc29sdmVSZW1vdGVTa2lsbCh7XG4gICAgICAgICAgc2FuZGJveDogb3B0cy5zYW5kYm94LFxuICAgICAgICAgIHNraWxsOiBlbnRyeSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09IFwiaW5saW5lXCIpIHtcbiAgICAgIHJlc29sdmVkLnB1c2goXG4gICAgICAgIGF3YWl0IHJlc29sdmVJbmxpbmVTa2lsbCh7XG4gICAgICAgICAgc2FuZGJveDogb3B0cy5zYW5kYm94LFxuICAgICAgICAgIHNraWxsOiBlbnRyeSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbG9nLndhcm4oXCJ1bmtub3duIHNraWxsIHNvdXJjZSBlbnRyeSBlbmNvdW50ZXJlZFwiLCB7IGVudHJ5IH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgVG9vbFNldCxcbiAgdG9vbCxcbiAgdHlwZSBVSU1lc3NhZ2UsXG4gIHR5cGUgVUlNZXNzYWdlU3RyZWFtV3JpdGVyLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB7IERFRkFVTFRfV0FJVF9VTlRJTCB9IGZyb20gXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiO1xuaW1wb3J0IHsgYXBwcm92YWxQYXJ0SWQgfSBmcm9tIFwiLi4vc2Vzc2lvbi9zZW5kXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbiwgU3RvcmFnZSB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIHR5cGUgTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgY3JlYXRlSmF2YVNjcmlwdFRvb2wsIHR5cGUgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IGNoZWNrTmVlZHNBcHByb3ZhbCB9IGZyb20gXCIuL25lZWRzLWFwcHJvdmFsXCI7XG5cbmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7IGNvbmZpZzogeyBuYW1lOiBcInRvb2xzXCIgfSwgc3Vic3lzdGVtOiBcInRvb2xzXCIgfSk7XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSB7XG4gICAgcmV0dXJuIGAke2J5dGVzfWA7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX1LYDtcbiAgfVxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX1NYDtcbiAgfVxuICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9R2A7XG59XG5cbnR5cGUgU3RyZWFtV3JpdGVyID0gVUlNZXNzYWdlU3RyZWFtV3JpdGVyO1xuXG5leHBvcnQgdHlwZSBUb29sQ29udGV4dDxUQ29udGV4dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBjb250ZXh0OiBUQ29udGV4dDtcbn07XG5cbmZ1bmN0aW9uIGlzUmdOb3RGb3VuZEVycm9yKGVycjogRXJyb3IpOiBib29sZWFuIHtcbiAgY29uc3QgcGFydHMgPSBbZXJyLm1lc3NhZ2VdO1xuXG4gIGNvbnN0IGFueUVyciA9IGVyciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodHlwZW9mIGFueUVyci5yZWFzb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICBwYXJ0cy5wdXNoKGFueUVyci5yZWFzb24pO1xuICB9XG4gIGlmIChhbnlFcnIuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHBhcnRzLnB1c2goYW55RXJyLmNhdXNlLm1lc3NhZ2UpO1xuICAgIGNvbnN0IGFueUNhdXNlID0gYW55RXJyLmNhdXNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS50ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGFueUNhdXNlLnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1zZyA9IHBhcnRzLmpvaW4oXCIgXCIpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAoXG4gICAgbXNnLmluY2x1ZGVzKFwiZXhlY3V0YWJsZSBmaWxlIG5vdCBmb3VuZFwiKSB8fFxuICAgIG1zZy5pbmNsdWRlcyhcImV4ZWN1dGFibGVfbm90X2ZvdW5kXCIpIHx8XG4gICAgKG1zZy5pbmNsdWRlcyhcImVub2VudFwiKSAmJiBtc2cuaW5jbHVkZXMoXCJyZ1wiKSlcbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWx0SW5Ub29scyA9IHtcbiAgUmVhZDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlJlYWRzIGEgZmlsZSBhbmQgcmV0dXJucyBpdHMgY29udGVudHMgd2l0aCBtZXRhZGF0YS4gRm9yIGZpbGVzIG92ZXIgMjAwIGxpbmVzLCBhdXRvbWF0aWNhbGx5IHNob3dzIGZpcnN0IDEwMCBsaW5lcyB1bmxlc3MgYSBzcGVjaWZpYyBsaW5lIHJhbmdlIGlzIHByb3ZpZGVkLiBVc2Ugc3RhcnRMaW5lIGFuZCBlbmRMaW5lIHBhcmFtZXRlcnMgdG8gcmVhZCBzcGVjaWZpYyBwb3J0aW9ucyBvZiBsYXJnZSBmaWxlcy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZVwiKSxcbiAgICAgIHN0YXJ0TGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3RhcnRpbmcgbGluZSBudW1iZXIgKDEtaW5kZXhlZCkuIElmIHByb3ZpZGVkIHdpdGggZW5kTGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICAgIGVuZExpbmU6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkVuZGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkLCBpbmNsdXNpdmUpLiBJZiBwcm92aWRlZCB3aXRoIHN0YXJ0TGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJGaWxlIGNvbnRlbnRcIiksXG4gICAgICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgICAgICB0b3RhbExpbmVzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmaWxlXCIpLFxuICAgICAgICBsaW5lc1Nob3duOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGxpbmVzIGluY2x1ZGVkIGluIHRoaXMgcmVzcG9uc2VcIiksXG4gICAgICAgIHN0YXJ0TGluZTogei5udW1iZXIoKS5kZXNjcmliZShcIkZpcnN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBlbmRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTGFzdCBsaW5lIG51bWJlciBzaG93biAoMS1pbmRleGVkKVwiKSxcbiAgICAgICAgaXNQYWdpbmF0ZWQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciB0aGlzIGlzIGEgcGFydGlhbCB2aWV3IG9mIHRoZSBmaWxlXCIpLFxuICAgICAgICBmaWxlU2l6ZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5kZXNjcmliZShcIkh1bWFuLXJlYWRhYmxlIGZpbGUgc2l6ZSAoZS5nLiwgJzIuNUsnLCAnMS4yTScpXCIpLFxuICAgICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZVwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgR3JlcDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBmb3IgcGF0dGVybnMgaW4gZmlsZXMgdXNpbmcgcmlwZ3JlcC4gVXNlIHRoaXMgdG8gZmluZCBjb2RlIHBhdHRlcm5zLCBmdW5jdGlvbiBkZWZpbml0aW9ucywgaW1wb3J0cywgZXRjLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdHRlcm46IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlJlZ2V4IHBhdHRlcm4gdG8gc2VhcmNoIGZvciAocmlwZ3JlcCBzeW50YXgpXCIpLFxuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiQWJzb2x1dGUgcGF0aCB0byBzZWFyY2ggaW4gKGRlZmF1bHRzIHRvIHdvcmtpbmcgZGlyZWN0b3J5KS4gQ2FuIGJlIGEgZmlsZSBvciBkaXJlY3RvcnkuXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVUeXBlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJGaWxlIHR5cGUgdG8gZmlsdGVyIGJ5IChlLmcuLCAndHMnLCAnanMnLCAncHknLCAnbWQnKS4gVXNlcyByaXBncmVwJ3MgYnVpbHQtaW4gdHlwZSBmaWx0ZXJzLlwiXG4gICAgICAgICksXG4gICAgICBnbG9iOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIGZpbGVzIChlLmcuLCAnKi50c3gnLCAnc3JjLyoqLyoudHMnKVwiXG4gICAgICAgICksXG4gICAgICBjYXNlU2Vuc2l0aXZlOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciBzZWFyY2ggaXMgY2FzZS1zZW5zaXRpdmUgKGRlZmF1bHQ6IHRydWUpXCIpLFxuICAgICAgY29udGV4dExpbmVzOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJOdW1iZXIgb2YgY29udGV4dCBsaW5lcyB0byBzaG93IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBtYXRjaFwiXG4gICAgICAgICksXG4gICAgICBtYXhDb3VudDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBudW1iZXIgb2YgbWF0Y2hlcyBwZXIgZmlsZSAodXNlZnVsIGZvciBsaW1pdGluZyBvdXRwdXQpXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVzV2l0aE1hdGNoZXM6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiT25seSBzaG93IGZpbGUgcGF0aHMgdGhhdCBjb250YWluIG1hdGNoZXMsIG5vdCB0aGUgbWF0Y2hpbmcgbGluZXMgdGhlbXNlbHZlc1wiXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBtYXRjaGVzOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTZWFyY2ggcmVzdWx0cyB3aXRoIGZpbGUgcGF0aHMsIGxpbmUgbnVtYmVycywgYW5kIG1hdGNoaW5nIGNvbnRlbnRcIlxuICAgICAgICApLFxuICAgICAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgICAgICBtYXRjaENvdW50OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIG1hdGNoZXMgZm91bmRcIiksXG4gICAgICAgIGZpbGVDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBmaWxlcyBjb250YWluaW5nIG1hdGNoZXNcIiksXG4gICAgICAgIHNlYXJjaFBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRoYXQgd2FzIHNlYXJjaGVkXCIpLFxuICAgICAgICBwYXR0ZXJuOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0dGVybiB0aGF0IHdhcyBzZWFyY2hlZCBmb3JcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIExpc3Q6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWN1cnNpdmVseSBsaXN0IGRpcmVjdG9yeSBjb250ZW50cy4gVXNlIHRoaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29kZWJhc2Ugc3RydWN0dXJlLCBmaW5kIGZpbGVzLCBvciBleHBsb3JlIGRpcmVjdG9yaWVzLiBDb250cm9sIGRlcHRoIHRvIGJhbGFuY2UgZGV0YWlsIHZzLiBvdmVydmlldy4gRGVwdGggMSBzaG93cyBpbW1lZGlhdGUgY2hpbGRyZW4sIGRlcHRoIDIgaW5jbHVkZXMgc3ViZGlyZWN0b3JpZXMsIGV0Yy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIGxpc3QgKGRlZmF1bHRzIHRvIHdvcmtpbmcgZGlyZWN0b3J5KVwiKSxcbiAgICAgIGRlcHRoOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJNYXhpbXVtIGRlcHRoIHRvIHRyYXZlcnNlLiBDaG9vc2UgYmFzZWQgb24gY29udGV4dDogMS0yIGZvciBxdWljayBvdmVydmlldywgMy00IGZvciBkZXRhaWxlZCBleHBsb3JhdGlvbiwgNSsgZm9yIGNvbXByZWhlbnNpdmUgbWFwcGluZ1wiXG4gICAgICAgICksXG4gICAgICBpbmNsdWRlSGlkZGVuOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkluY2x1ZGUgaGlkZGVuIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAnLicpXCJcbiAgICAgICAgKSxcbiAgICAgIGZpbGVzT25seTogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXCJPbmx5IHNob3cgZmlsZXMsIG5vdCBkaXJlY3Rvcmllc1wiKSxcbiAgICAgIHBhdHRlcm46IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIkdsb2IgcGF0dGVybiB0byBmaWx0ZXIgcmVzdWx0cyAoZS5nLiwgJyoudHMnLCAnKnRlc3QqJylcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsaXN0aW5nOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJEaXJlY3RvcnkgdHJlZSBsaXN0aW5nIHNob3dpbmcgcGF0aHMgcmVsYXRpdmUgdG8gc2VhcmNoIHJvb3RcIlxuICAgICAgICApLFxuICAgICAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgICAgICB0b3RhbEl0ZW1zOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGl0ZW1zIGZvdW5kXCIpLFxuICAgICAgICB0b3RhbEZpbGVzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGZpbGVzIGZvdW5kXCIpLFxuICAgICAgICB0b3RhbERpcnM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgZGlyZWN0b3JpZXMgZm91bmRcIiksXG4gICAgICAgIHNlYXJjaFBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRoYXQgd2FzIGxpc3RlZFwiKSxcbiAgICAgICAgZGVwdGg6IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcIk1heGltdW0gZGVwdGggdXNlZCAoaWYgc3BlY2lmaWVkKVwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgV3JpdGU6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJXcml0ZSBjb250ZW50IHRvIGEgZmlsZS4gQ3JlYXRlcyBwYXJlbnQgZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseS4gT3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZVwiKSxcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDb250ZW50IHRvIHdyaXRlIHRvIHRoZSBmaWxlXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSB3cml0ZSBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgd3JpdHRlbiBmaWxlXCIpLFxuICAgICAgYnl0ZXNXcml0dGVuOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiB3cml0ZSBmYWlsZWRcIiksXG4gICAgfSksXG4gIH0pLFxuICBFZGl0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRWRpdCBhIGZpbGUgYnkgcmVwbGFjaW5nIGFuIGV4YWN0IHN0cmluZy4gRmFpbHMgaWYgb2xkX3N0cmluZyBpcyBub3QgZm91bmQgb3IgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyAobm90IHVuaXF1ZSkuIEZvciBtdWx0aXBsZSByZXBsYWNlbWVudHMsIGNhbGwgdGhpcyB0b29sIG11bHRpcGxlIHRpbWVzIHdpdGggdW5pcXVlIGNvbnRleHQuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIkFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcIiksXG4gICAgICBvbGRfc3RyaW5nOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJFeGFjdCBzdHJpbmcgdG8gZmluZCBhbmQgcmVwbGFjZSAobXVzdCBiZSB1bmlxdWUgaW4gZmlsZSlcIiksXG4gICAgICBuZXdfc3RyaW5nOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU3RyaW5nIHRvIHJlcGxhY2Ugb2xkX3N0cmluZyB3aXRoXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSBlZGl0IHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBlZGl0ZWQgZmlsZVwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIGVkaXQgZmFpbGVkXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgQmFzaDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV4ZWN1dGVzIGEgYmFzaCBjb21tYW5kLiBSZXR1cm5zIHN0ZG91dCBhbmQgc3RkZXJyIHNlcGFyYXRlbHkuIFVzZSB3YWl0VW50aWwgdG8gY29udHJvbCBob3cgbG9uZyB0byB3YWl0ICgwID0gcmV0dXJuIGltbWVkaWF0ZWx5LCBwcm9jZXNzIGtlZXBzIHJ1bm5pbmcpLiBMYXJnZSBvdXRwdXRzIGFyZSB0YWlsLXRydW5jYXRlZDsgZnVsbCBvdXRwdXQgaW4gb3V0cHV0RGlyLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIGNvbW1hbmQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJUaGUgc2hlbGwgY29tbWFuZCB0byBleGVjdXRlXCIpLFxuICAgICAgd2FpdFVudGlsOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgYE1heCBtcyB0byB3YWl0IGZvciBjb21wbGV0aW9uIChkZWZhdWx0OiAke0RFRkFVTFRfV0FJVF9VTlRJTH0pLiBVc2UgMCB0byByZXR1cm4gaW1tZWRpYXRlbHkgd2hpbGUgdGhlIHByb2Nlc3Mga2VlcHMgcnVubmluZy5gXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb21tYW5kSWQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkNvbW1hbmQgSUQuIFVzZSB0byByZWZlcmVuY2Ugb3Iga2lsbCBydW5uaW5nIHByb2Nlc3Nlcy5cIiksXG4gICAgICBzdGRvdXQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkNvbW1hbmQgc3Rkb3V0LiBUYWlsLXRydW5jYXRlZCBpZiBsYXJnZTsgZnVsbCBjb250ZW50IGluIG91dHB1dERpci9zdGRvdXQudHh0LlwiXG4gICAgICAgICksXG4gICAgICBzdGRlcnI6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkNvbW1hbmQgc3RkZXJyLiBUYWlsLXRydW5jYXRlZCBpZiBsYXJnZTsgZnVsbCBjb250ZW50IGluIG91dHB1dERpci9zdGRlcnIudHh0LlwiXG4gICAgICAgICksXG4gICAgICBleGl0Q29kZTogei5udW1iZXIoKS5kZXNjcmliZShcIkV4aXQgY29kZSAoLTEgaWYgc3RpbGwgcnVubmluZylcIiksXG4gICAgICBzdGF0dXM6IHpcbiAgICAgICAgLmVudW0oW1wicnVubmluZ1wiLCBcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiXSlcbiAgICAgICAgLmRlc2NyaWJlKFwiUHJvY2VzcyBzdGF0dXNcIiksXG4gICAgICBvdXRwdXREaXI6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlBhdGggdG8gb3V0cHV0IGRpcmVjdG9yeSBjb250YWluaW5nIHN0ZG91dC50eHQsIHN0ZGVyci50eHQsIGFuZCBtZXRhZGF0YS5qc29uLiBFbXB0eSBpZiBzdGlsbCBydW5uaW5nLlwiXG4gICAgICAgICksXG4gICAgfSksXG4gIH0pLFxuICBTa2lsbDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkxvYWQgYSBza2lsbCdzIGZ1bGwgaW5zdHJ1Y3Rpb25zIGJ5IG5hbWUuIENhbGwgdGhpcyBiZWZvcmUgZm9sbG93aW5nIGEgc2tpbGwuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIlNraWxsIG5hbWUgZnJvbSB0aGUgQXZhaWxhYmxlIFNraWxscyBsaXN0XCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLFxuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkZ1bGwgU0tJTEwubWQgY29udGVudFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBza2lsbCBkaXJlY3RvcnkgaW4gdGhlIHNhbmRib3hcIiksXG4gICAgfSksXG4gIH0pLFxuICBKYXZhU2NyaXB0OiB0b29sKHtcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBjb2RlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJKYXZhU2NyaXB0IGFzeW5jIGZ1bmN0aW9uIGJvZHkuIGBjdHhgIGlzIGluIHNjb3BlLiBNdXN0IHVzZSBgcmV0dXJuYCB0byBwcm9kdWNlIG91dHB1dC5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICB9KSxcbn0gc2F0aXNmaWVzIFRvb2xTZXQ7XG5cbmV4cG9ydCB0eXBlIEJ1aWx0SW5Ub29sTmFtZSA9IGtleW9mIHR5cGVvZiBidWlsdEluVG9vbHM7XG5leHBvcnQgY29uc3QgYnVpbHRpblRvb2xOYW1lcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgT2JqZWN0LmVudHJpZXMoYnVpbHRJblRvb2xzKS5tYXAoKFtuYW1lXSkgPT4gW25hbWUsIG5hbWVdKVxuKSBhcyB7IFtLIGluIEJ1aWx0SW5Ub29sTmFtZV06IEsgfTtcblxuY29uc3QgU0tJTExfTURfU1VGRklYID0gL1xcLz9TS0lMTFxcLm1kJC87XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb29scyh7XG4gIGFnZW50LFxuICBzZXNzaW9uLFxuICBza2lsbHNSZWYsXG4gIHdyaXRlcixcbiAgYWJvcnRDb250cm9sbGVyLFxuICBuZXh0UGFydEluZGV4UmVmLFxuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIHNlc3Npb25JZCxcbiAgc3RlcExvZyxcbiAgY29udGV4dCxcbn06IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBza2lsbHNSZWY6IHsgY3VycmVudDogU2tpbGxTdW1tYXJ5W10gfTtcbiAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuICBuZXh0UGFydEluZGV4UmVmOiB7IGN1cnJlbnQ6IG51bWJlciB9O1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0ZXBMb2c6IExvZ2dlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59KToge1xuICByYXdUb29sczogVG9vbFNldDtcbiAgdG9vbHNXaXRoTmVlZHNBcHByb3ZhbDogVG9vbFNldDtcbiAgdG9vbENvbnRleHQ6IFRvb2xDb250ZXh0O1xufSB7XG4gIGNvbnN0IHNhbmRib3ggPSBhZ2VudC5zYW5kYm94KHNlc3Npb24uc2FuZGJveElkID8/IHNlc3Npb24uaWQpO1xuICBjb25zdCByYXdUb29sczogVG9vbFNldCA9IHtcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5SZWFkXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuUmVhZCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIHN0YXJ0TGluZSwgZW5kTGluZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFwiUmVhZCBmYWlsZWRcIiwgeyBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBgRXJyb3I6IEZpbGUgbm90IGZvdW5kIC0gJHtmaWxlUGF0aH1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgdG90YWxMaW5lczogMCxcbiAgICAgICAgICAgICAgbGluZXNTaG93bjogMCxcbiAgICAgICAgICAgICAgc3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgICBlbmRMaW5lOiAwLFxuICAgICAgICAgICAgICBpc1BhZ2luYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiBcIjBcIixcbiAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsQ29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGZ1bGxDb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAvLyBBIHRyYWlsaW5nIG5ld2xpbmUgcHJvZHVjZXMgYW4gZW1wdHkgbGFzdCBlbGVtZW50IFx1MjAxNCByZW1vdmUgaXRcbiAgICAgICAgLy8gc28gbGluZSBjb3VudCBtYXRjaGVzIGB3YyAtbGAgLyBgYXdrICdFTkR7cHJpbnQgTlJ9J2AgYmVoYXZpb3IuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzLmF0KC0xKSA9PT0gXCJcIikge1xuICAgICAgICAgIGxpbmVzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsTGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZpbGVCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGZ1bGxDb250ZW50KTtcbiAgICAgICAgY29uc3QgZmlsZVNpemUgPSBmb3JtYXRGaWxlU2l6ZShmaWxlQnl0ZXMpO1xuXG4gICAgICAgIC8vIERldGVybWluZSByYW5nZVxuICAgICAgICBjb25zdCBQQUdFX1NJWkUgPSAxMDA7XG4gICAgICAgIGxldCBhY3R1YWxTdGFydDogbnVtYmVyO1xuICAgICAgICBsZXQgYWN0dWFsRW5kOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkICYmIGVuZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gc3RhcnRMaW5lO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBNYXRoLm1pbihzdGFydExpbmUgKyBQQUdFX1NJWkUgLSAxLCB0b3RhbExpbmVzKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gZW5kTGluZTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3RhbExpbmVzID4gMjAwKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IFBBR0VfU0laRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gdG90YWxMaW5lcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGxpbmUgcmFuZ2UgKDEtaW5kZXhlZClcbiAgICAgICAgY29uc3Qgc2xpY2VkTGluZXMgPSBsaW5lcy5zbGljZShhY3R1YWxTdGFydCAtIDEsIGFjdHVhbEVuZCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzbGljZWRMaW5lcy5qb2luKFwiXFxuXCIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHRvdGFsTGluZXMsXG4gICAgICAgICAgICBsaW5lc1Nob3duOiBNYXRoLm1heCgwLCBhY3R1YWxFbmQgLSBhY3R1YWxTdGFydCArIDEpLFxuICAgICAgICAgICAgc3RhcnRMaW5lOiBhY3R1YWxTdGFydCxcbiAgICAgICAgICAgIGVuZExpbmU6IGFjdHVhbEVuZCxcbiAgICAgICAgICAgIGlzUGFnaW5hdGVkOiBhY3R1YWxFbmQgPCB0b3RhbExpbmVzLFxuICAgICAgICAgICAgZmlsZVNpemUsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkdyZXBdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5HcmVwLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgcGF0dGVybixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIGdsb2IsXG4gICAgICAgIGNhc2VTZW5zaXRpdmUsXG4gICAgICAgIGNvbnRleHRMaW5lcyxcbiAgICAgICAgbWF4Q291bnQsXG4gICAgICAgIGZpbGVzV2l0aE1hdGNoZXMsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdGggPSBwYXRoID8/IFwiLlwiO1xuXG4gICAgICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgYXJncy5wdXNoKFwiLS1saW5lLW51bWJlclwiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1oZWFkaW5nXCIpO1xuICAgICAgICBhcmdzLnB1c2goXCItLWNvbG9yXCIsIFwibmV2ZXJcIik7XG5cbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLWlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLXR5cGVcIiwgZmlsZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdsb2IpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLWdsb2JcIiwgZ2xvYik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItQ1wiLCBTdHJpbmcoY29udGV4dExpbmVzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tbWF4LWNvdW50XCIsIFN0cmluZyhtYXhDb3VudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVzV2l0aE1hdGNoZXMpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLWZpbGVzLXdpdGgtbWF0Y2hlc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tXCIsIHBhdHRlcm4sIHNlYXJjaFBhdGgpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoeyBjb21tYW5kOiBcInJnXCIsIGFyZ3MgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yICYmIGlzUmdOb3RGb3VuZEVycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICBsb2cud2FybihcInJnIG5vdCBmb3VuZCwgaW5zdGFsbGluZyByaXBncmVwXCIpO1xuICAgICAgICAgIGNvbnN0IGluc3RhbGxSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFwiY29tbWFuZCAtdiByZyA+L2Rldi9udWxsIDI+JjEgJiYgZXhpdCAwXCIsXG4gICAgICAgICAgICAgICAgXCJkbmYgaW5zdGFsbCAteSByaXBncmVwIDI+L2Rldi9udWxsICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiKGFwdC1nZXQgdXBkYXRlIC1xcSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLXFxIHJpcGdyZXApIDI+L2Rldi9udWxsICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiYXBrIGFkZCAtLW5vLWNhY2hlIHJpcGdyZXAgMj4vZGV2L251bGwgJiYgZXhpdCAwXCIsXG4gICAgICAgICAgICAgICAgXCJjdXJsIC1zTCBodHRwczovL2dpdGh1Yi5jb20vQnVybnRTdXNoaS9yaXBncmVwL3JlbGVhc2VzL2Rvd25sb2FkLzE0LjEuMS9yaXBncmVwLTE0LjEuMS14ODZfNjQtdW5rbm93bi1saW51eC1tdXNsLnRhci5neiB8IHRhciB4eiAtQyAvdG1wICYmIGluc3RhbGwgL3RtcC9yaXBncmVwLTE0LjEuMS14ODZfNjQtdW5rbm93bi1saW51eC1tdXNsL3JnIC91c3IvbG9jYWwvYmluL3JnICYmIHJtIC1yZiAvdG1wL3JpcGdyZXAtMTQuMS4xLXg4Nl82NC11bmtub3duLWxpbnV4LW11c2xcIixcbiAgICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN1ZG86IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCEoaW5zdGFsbFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbE91dHB1dCA9IGF3YWl0IGluc3RhbGxSZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgaWYgKGluc3RhbGxPdXRwdXQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgICAgICAgbG9nLndhcm4oXCJyaXBncmVwIGluc3RhbGwgZmFpbGVkXCIsIHtcbiAgICAgICAgICAgICAgICBzdGRlcnI6IGluc3RhbGxPdXRwdXQuc3RkZXJyLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJyZ1wiLCBhcmdzIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yICYmIGlzUmdOb3RGb3VuZEVycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICBsb2cud2FybihcInJnIHVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gZ3JlcFwiKTtcbiAgICAgICAgICBjb25zdCBncmVwQXJncyA9IFtcIi1yblwiLCBcIi0tY29sb3I9bmV2ZXJcIl07XG4gICAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLWlcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb250ZXh0TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ3JlcEFyZ3MucHVzaChcIi1DXCIsIFN0cmluZyhjb250ZXh0TGluZXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItbVwiLCBTdHJpbmcobWF4Q291bnQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpbGVzV2l0aE1hdGNoZXMpIHtcbiAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItbFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGdsb2IpIHtcbiAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goYC0taW5jbHVkZT0ke2dsb2J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWxlVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICAgICAgICAgICAgICB0czogW1wiKi50c1wiLCBcIioudHN4XCIsIFwiKi5tdHNcIiwgXCIqLmN0c1wiXSxcbiAgICAgICAgICAgICAganM6IFtcIiouanNcIiwgXCIqLmpzeFwiLCBcIioubWpzXCIsIFwiKi5janNcIl0sXG4gICAgICAgICAgICAgIHB5OiBbXCIqLnB5XCJdLFxuICAgICAgICAgICAgICBydXN0OiBbXCIqLnJzXCJdLFxuICAgICAgICAgICAgICBnbzogW1wiKi5nb1wiXSxcbiAgICAgICAgICAgICAgamF2YTogW1wiKi5qYXZhXCJdLFxuICAgICAgICAgICAgICBtZDogW1wiKi5tZFwiXSxcbiAgICAgICAgICAgICAganNvbjogW1wiKi5qc29uXCJdLFxuICAgICAgICAgICAgICBjc3M6IFtcIiouY3NzXCJdLFxuICAgICAgICAgICAgICBodG1sOiBbXCIqLmh0bWxcIl0sXG4gICAgICAgICAgICAgIHlhbWw6IFtcIioueW1sXCIsIFwiKi55YW1sXCJdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0IG9mIGluY2x1ZGVNYXBbZmlsZVR5cGVdID8/IFtgKi4ke2ZpbGVUeXBlfWBdKSB7XG4gICAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goYC0taW5jbHVkZT0ke2V4dH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZ3JlcEFyZ3MucHVzaChcIi0tXCIsIHBhdHRlcm4sIHNlYXJjaFBhdGgpO1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgICAgICBjb21tYW5kOiBcImdyZXBcIixcbiAgICAgICAgICAgIGFyZ3M6IGdyZXBBcmdzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFwiR3JlcCBmYWlsZWRcIiwgeyBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcblxuICAgICAgICBpZiAoc3RkZXJyICYmICFzdGRlcnIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcIm5vIG1hdGNoZXNcIikpIHtcbiAgICAgICAgICBsb2cud2FybihcIkdyZXAgc3RkZXJyXCIsIHsgc3RkZXJyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ1bmNhdGUgb3V0cHV0IHRvIHByZXZlbnQgXCJpbnB1dCB0b28gbG9uZ1wiIGVycm9ycyAoNTBrIGNoYXJzIFx1MjI0OCAxMi41ayB0b2tlbnMpXG4gICAgICAgIGNvbnN0IE1BWF9HUkVQX09VVFBVVF9DSEFSUyA9IDUwXzAwMDtcbiAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gc3Rkb3V0O1xuICAgICAgICBsZXQgd2FzVHJ1bmNhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChmaW5hbE91dHB1dC5sZW5ndGggPiBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMpIHtcbiAgICAgICAgICBmaW5hbE91dHB1dCA9XG4gICAgICAgICAgICBmaW5hbE91dHB1dC5zbGljZSgwLCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMpICtcbiAgICAgICAgICAgIFwiXFxuXFxuW091dHB1dCB0cnVuY2F0ZWQgLSB1c2UgbW9yZSBzcGVjaWZpYyBwYXR0ZXJuIG9yIHBhdGhdXCI7XG4gICAgICAgICAgd2FzVHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVzID0gZmluYWxPdXRwdXRcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLmZpbHRlcigobCkgPT4gbC5sZW5ndGggPiAwKTtcbiAgICAgICAgY29uc3QgZmlsZUNvdW50ID0gZmlsZXNXaXRoTWF0Y2hlc1xuICAgICAgICAgID8gbGluZXMubGVuZ3RoXG4gICAgICAgICAgOiBuZXcgU2V0KFxuICAgICAgICAgICAgICBsaW5lc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGwpID0+ICFsLnN0YXJ0c1dpdGgoXCIgXCIpICYmIGwuaW5jbHVkZXMoXCI6XCIpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGwpID0+IGwuc3BsaXQoXCI6XCIpWzBdKVxuICAgICAgICAgICAgKS5zaXplO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgbWF0Y2hDb3VudDogZmlsZXNXaXRoTWF0Y2hlc1xuICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgOiBsaW5lcy5maWx0ZXIoKGwpID0+IGwuaW5jbHVkZXMoXCI6XCIpKS5sZW5ndGgsXG4gICAgICAgICAgICBmaWxlQ291bnQsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgcGF0dGVybixcbiAgICAgICAgICAgIHdhc1RydW5jYXRlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hdGNoZXM6IGZpbmFsT3V0cHV0IHx8IFwiKG5vIG1hdGNoZXMgZm91bmQpXCIsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkxpc3RdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5MaXN0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgZGVwdGgsIGluY2x1ZGVIaWRkZW4sIGZpbGVzT25seSwgcGF0dGVybiB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdGggPSBwYXRoID8/IFwiLlwiO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgc2V0IC1lXG4gICAgICAgICAgICBTRUFSQ0hfUEFUSD1cIiQxXCJcbiAgICAgICAgICAgIERFUFRIPVwiJDJcIlxuICAgICAgICAgICAgSU5DTFVERV9ISURERU49XCIkM1wiXG4gICAgICAgICAgICBGSUxFU19PTkxZPVwiJDRcIlxuICAgICAgICAgICAgUEFUVEVSTj1cIiQ1XCJcblxuICAgICAgICAgICAgIyBCdWlsZCBmaW5kIGNvbW1hbmQgYXJndW1lbnRzXG4gICAgICAgICAgICBGSU5EX0FSR1M9XCJcIlxuICAgICAgICAgICAgWyAtbiBcIiRERVBUSFwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgISAtcGF0aCAnKi8uKidcIlxuICAgICAgICAgICAgWyBcIiRGSUxFU19PTkxZXCIgPSBcInRydWVcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLXR5cGUgZlwiXG4gICAgICAgICAgICBbIC1uIFwiJFBBVFRFUk5cIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW5hbWUgJyRQQVRURVJOJ1wiXG5cbiAgICAgICAgICAgICMgR2V0IGxpc3RpbmdcbiAgICAgICAgICAgIExJU1RJTkc9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkRklORF9BUkdTXCIgMj4vZGV2L251bGwgfCBzb3J0KVxuXG4gICAgICAgICAgICAjIEdldCBjb3VudHNcbiAgICAgICAgICAgIENPVU5UX0FSR1M9XCJcIlxuICAgICAgICAgICAgWyAtbiBcIiRERVBUSFwiIF0gJiYgQ09VTlRfQVJHUz1cIiRDT1VOVF9BUkdTIC1tYXhkZXB0aCAkREVQVEhcIlxuICAgICAgICAgICAgWyBcIiRJTkNMVURFX0hJRERFTlwiICE9IFwidHJ1ZVwiIF0gJiYgQ09VTlRfQVJHUz1cIiRDT1VOVF9BUkdTICEgLXBhdGggJyovLionXCJcblxuICAgICAgICAgICAgRklMRV9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGZcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuICAgICAgICAgICAgRElSX0NPVU5UPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJENPVU5UX0FSR1MgLXR5cGUgZFwiIDI+L2Rldi9udWxsIHwgd2MgLWwpXG5cbiAgICAgICAgICAgICMgT3V0cHV0OiBjb3VudHMgZmlyc3QsIHRoZW4gbGlzdGluZ1xuICAgICAgICAgICAgZWNobyBcIiRGSUxFX0NPVU5UfCRESVJfQ09VTlRcIlxuICAgICAgICAgICAgZWNobyBcInx8fExJU1RJTkd8fHxcIlxuICAgICAgICAgICAgZWNobyBcIiRMSVNUSU5HXCIgfCBzZWQgXCJzfF4kU0VBUkNIX1BBVEh8LnxcIlxuICAgICAgICAgIGAsXG4gICAgICAgICAgICBcIi0tXCIsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgZGVwdGg/LnRvU3RyaW5nKCkgfHwgXCJcIixcbiAgICAgICAgICAgIGluY2x1ZGVIaWRkZW4gPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIGZpbGVzT25seSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgcGF0dGVybiB8fCBcIlwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIkxpc3QgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIGxvZy53YXJuKFwiTGlzdCBzdGRlcnJcIiwgeyBzdGRlcnIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbY291bnRzTGluZSwgLi4ucmVzdF0gPSBzdGRvdXQuc3BsaXQoXCJ8fHxMSVNUSU5HfHx8XCIpO1xuICAgICAgICBjb25zdCBsaXN0aW5nID0gcmVzdC5qb2luKFwifHx8TElTVElOR3x8fFwiKS50cmltKCk7XG4gICAgICAgIGNvbnN0IFtmaWxlQ291bnRTdHIsIGRpckNvdW50U3RyXSA9IGNvdW50c0xpbmUudHJpbSgpLnNwbGl0KFwifFwiKTtcblxuICAgICAgICBjb25zdCB0b3RhbEZpbGVzID0gTnVtYmVyLnBhcnNlSW50KGZpbGVDb3VudFN0ciwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IHRvdGFsRGlycyA9IE51bWJlci5wYXJzZUludChkaXJDb3VudFN0ciwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gbGlzdGluZy5zcGxpdChcIlxcblwiKS5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiBsaW5lcy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbEZpbGVzLFxuICAgICAgICAgICAgdG90YWxEaXJzLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGlzdGluZyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuV3JpdGVdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5Xcml0ZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICAgICAgZmlsZXM6IFt7IHBhdGg6IGZpbGVQYXRoLCBjb250ZW50IH1dLFxuICAgICAgICAgICAgZGVzdFBhdGg6IFwiLlwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgXCJ1dGY4XCIpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgYnl0ZXNXcml0dGVuOiAwLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTXNnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuRWRpdF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkVkaXQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBvbGRfc3RyaW5nLCBuZXdfc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3gucmVhZEZpbGUoeyBwYXRoOiBmaWxlUGF0aCB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gY29udGVudC5zcGxpdChvbGRfc3RyaW5nKS5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmIChvY2N1cnJlbmNlcyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IFwib2xkX3N0cmluZyBub3QgZm91bmQgaW4gZmlsZVwiLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogYG9sZF9zdHJpbmcgYXBwZWFycyAke29jY3VycmVuY2VzfSB0aW1lcyBpbiBmaWxlIChtdXN0IGJlIHVuaXF1ZSkuIEluY2x1ZGUgbW9yZSBzdXJyb3VuZGluZyBjb250ZXh0IHRvIG1ha2UgdGhlIG1hdGNoIHVuaXF1ZS5gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKG9sZF9zdHJpbmcsIG5ld19zdHJpbmcpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlUGF0aCwgY29udGVudDogbmV3Q29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBcIi5cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHBhdGg6IGZpbGVQYXRoIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBwYXRoOiBmaWxlUGF0aCwgZXJyb3I6IGVycm9yTXNnIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuQmFzaF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkJhc2gsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBjb21tYW5kLCB3YWl0VW50aWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc01hbmFnZXIgPSBjcmVhdGVQcm9jZXNzTWFuYWdlcih7IHNhbmRib3ggfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc01hbmFnZXIucnVuKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pO1xuXG4gICAgICAgIGNvbnN0IE1BWF9TVERPVVQgPSA1MF8wMDA7XG4gICAgICAgIGNvbnN0IE1BWF9TVERFUlIgPSAxMF8wMDA7XG5cbiAgICAgICAgbGV0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IHJlc3VsdDtcbiAgICAgICAgaWYgKHN0ZG91dC5sZW5ndGggPiBNQVhfU1RET1VUKSB7XG4gICAgICAgICAgc3Rkb3V0ID1cbiAgICAgICAgICAgIGBbdHJ1bmNhdGVkIFx1MjAxNCBzaG93aW5nIGxhc3QgJHtNQVhfU1RET1VUfSBjaGFycy4gRnVsbDogJHtyZXN1bHQub3V0cHV0RGlyfS9zdGRvdXQudHh0XVxcblxcbmAgK1xuICAgICAgICAgICAgc3Rkb3V0LnNsaWNlKC1NQVhfU1RET1VUKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyLmxlbmd0aCA+IE1BWF9TVERFUlIpIHtcbiAgICAgICAgICBzdGRlcnIgPVxuICAgICAgICAgICAgYFt0cnVuY2F0ZWQgXHUyMDE0IHNob3dpbmcgbGFzdCAke01BWF9TVERFUlJ9IGNoYXJzLiBGdWxsOiAke3Jlc3VsdC5vdXRwdXREaXJ9L3N0ZGVyci50eHRdXFxuXFxuYCArXG4gICAgICAgICAgICBzdGRlcnIuc2xpY2UoLU1BWF9TVERFUlIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBzdGRvdXQsIHN0ZGVyciB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICAuLi5hZ2VudC5vcHRpb25zLnRvb2xzLFxuICB9O1xuXG4gIGlmIChzZXNzaW9uLnNraWxscz8ubGVuZ3RoKSB7XG4gICAgcmF3VG9vbHNbYnVpbHRpblRvb2xOYW1lcy5Ta2lsbF0gPSB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5Ta2lsbCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IG5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBza2lsbHMgPSBza2lsbHNSZWYuY3VycmVudDtcbiAgICAgICAgY29uc3Qgc2tpbGwgPSBza2lsbHMuZmluZChcbiAgICAgICAgICAocykgPT4gcy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNraWxsIG5vdCBmb3VuZDogXCIke25hbWV9XCIuIEF2YWlsYWJsZTogJHtza2lsbHMubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LnJlYWRGaWxlKHtcbiAgICAgICAgICBwYXRoOiBza2lsbC5za2lsbE1kUGF0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTa2lsbCBmaWxlIG5vdCBmb3VuZDogJHtza2lsbC5za2lsbE1kUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXcgPVxuICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIgPyByZXN1bHQgOiByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgZW5kTWFya2VyID0gcmF3LmluZGV4T2YoXCItLS1cIiwgMyk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgICAgIGVuZE1hcmtlciA9PT0gLTEgPyByYXcgOiByYXcuc2xpY2UoZW5kTWFya2VyICsgMykudHJpbSgpO1xuICAgICAgICBjb25zdCBza2lsbERpciA9IHNraWxsLnNraWxsTWRQYXRoLnJlcGxhY2UoU0tJTExfTURfU1VGRklYLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBza2lsbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIHBhdGg6IHNraWxsRGlyLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG9uU3ViVG9vbENhbGw6IE9uU3ViVG9vbENhbGwgPSBhc3luYyAodG9vbE5hbWUsIHRvb2xJbnB1dCwgZXhlY3V0ZSkgPT4ge1xuICAgIGNvbnN0IG5lZWRzQXBwcm92YWwgPSBhd2FpdCBjaGVja05lZWRzQXBwcm92YWwoe1xuICAgICAgYWdlbnQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICBtZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBpZiAoIW5lZWRzQXBwcm92YWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFwcHJvdmFsSWQgPSBganNfYXBwcm92YWxfJHt1bGlkKCl9YDtcbiAgICBjb25zdCB0b29sQ2FsbElkID0gYGpzX3RjXyR7dWxpZCgpfWA7XG4gICAgY29uc3QgcGFydElkID0gYXBwcm92YWxQYXJ0SWQoYXBwcm92YWxJZCk7XG5cbiAgICBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHBhcnRJZCwge1xuICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4UmVmLmN1cnJlbnQrKyxcbiAgICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGFydDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke3Rvb2xOYW1lfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlcXVlc3RlZFwiLFxuICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICBhcHByb3ZhbDogeyBpZDogYXBwcm92YWxJZCB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgfSk7XG5cbiAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWUsXG4gICAgfSk7XG4gICAgd3JpdGVyLndyaXRlKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgfSk7XG4gICAgd3JpdGVyLndyaXRlKHtcbiAgICAgIHR5cGU6IFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCIsXG4gICAgICBhcHByb3ZhbElkLFxuICAgICAgdG9vbENhbGxJZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IFBPTExfTVMgPSA1MDA7XG4gICAgY29uc3QgVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IFRJTUVPVVRfTVMgJiYgIWFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IGFnZW50LnN0b3JhZ2UucGFydC5nZXQocGFydElkKTtcbiAgICAgIGlmIChcbiAgICAgICAgdXBkYXRlZCAmJlxuICAgICAgICBcInN0YXRlXCIgaW4gdXBkYXRlZC5wYXJ0ICYmXG4gICAgICAgICgodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXNwb25kZWRcIiB8fFxuICAgICAgICAgICh1cGRhdGVkLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcIm91dHB1dC1kZW5pZWRcIilcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9ICh1cGRhdGVkLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gXCJvdXRwdXQtZGVuaWVkXCIpIHtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSAodXBkYXRlZC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IHJlYXNvbj86IHN0cmluZyB9IH0pXG4gICAgICAgICAgICAuYXBwcm92YWw/LnJlYXNvbjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IGBUb29sIFwiJHt0b29sTmFtZX1cIiBkZW5pZWQ6ICR7cmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHByb3ZhbCA9IChcbiAgICAgICAgICB1cGRhdGVkLnBhcnQgYXMge1xuICAgICAgICAgICAgYXBwcm92YWw/OiB7IGFwcHJvdmVkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICkuYXBwcm92YWw7XG4gICAgICAgIGlmIChhcHByb3ZhbD8uYXBwcm92ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZSgpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgb3V0cHV0OiByZXN1bHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHthcHByb3ZhbD8ucmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgUE9MTF9NUykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkXG4gICAgICAgID8gXCJpbnRlcnJ1cHRlZFwiXG4gICAgICAgIDogXCJBcHByb3ZhbCB0aW1lZCBvdXRcIixcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHRvb2xDb250ZXh0OiBUb29sQ29udGV4dCA9IHtcbiAgICBzZXNzaW9uLFxuICAgIHNhbmRib3gsXG4gICAgc3RvcmFnZTogYWdlbnQuc3RvcmFnZSxcbiAgICBjb250ZXh0LFxuICB9O1xuXG4gIHJhd1Rvb2xzW2J1aWx0aW5Ub29sTmFtZXMuSmF2YVNjcmlwdF0gPSBjcmVhdGVKYXZhU2NyaXB0VG9vbCh7XG4gICAgdG9vbHM6IHJhd1Rvb2xzLFxuICAgIHNlc3Npb24sXG4gICAgc2FuZGJveCxcbiAgICBvblN1YlRvb2xDYWxsLFxuICAgIHRvb2xDb250ZXh0LFxuICB9KTtcblxuICBjb25zdCB0b29sc1dpdGhOZWVkc0FwcHJvdmFsID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHJhd1Rvb2xzKS5tYXAoKFtuYW1lLCB0XSkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFeGVjdXRlID0gdC5leGVjdXRlO1xuICAgICAgY29uc3Qgd3JhcHBlZEV4ZWN1dGUgPSBvcmlnaW5hbEV4ZWN1dGVcbiAgICAgICAgPyBhc3luYyAoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2Ygb3JpZ2luYWxFeGVjdXRlPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9uZSA9IHN0ZXBMb2cudGltZShgdG9vbDoke25hbWV9YCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsZXQgdG9vbElucHV0ID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgaWYgKGFnZW50Lmhvb2tzW1widG9vbC5iZWZvcmVcIl0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVSZXN1bHQgPSBhd2FpdCBhZ2VudC5ob29rc1tcInRvb2wuYmVmb3JlXCJdKHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgICAgICAgY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZVJlc3VsdD8uaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgdG9vbElucHV0ID0gYmVmb3JlUmVzdWx0LmlucHV0O1xuICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IHRvb2xJbnB1dCBhcyAodHlwZW9mIGFyZ3MpWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBvcmlnaW5hbEV4ZWN1dGUoLi4uYXJncyk7XG5cbiAgICAgICAgICAgICAgaWYgKGFnZW50Lmhvb2tzW1widG9vbC5hZnRlclwiXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyUmVzdWx0ID0gYXdhaXQgYWdlbnQuaG9va3NbXCJ0b29sLmFmdGVyXCJdKHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyUmVzdWx0Py5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJSZXN1bHQucmVzdWx0IGFzIHR5cGVvZiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBkb25lKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAge1xuICAgICAgICAgIC4uLnQsXG4gICAgICAgICAgLi4uKHdyYXBwZWRFeGVjdXRlID8geyBleGVjdXRlOiB3cmFwcGVkRXhlY3V0ZSB9IDoge30pLFxuICAgICAgICAgIG5lZWRzQXBwcm92YWw6IGFzeW5jIChcbiAgICAgICAgICAgIHRvb2xJbnB1dDogdW5rbm93bixcbiAgICAgICAgICAgIG9wdHM6IHsgdG9vbENhbGxJZDogc3RyaW5nOyBtZXNzYWdlczogdW5rbm93bltdIH1cbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaGVja05lZWRzQXBwcm92YWwoe1xuICAgICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IG9wdHMudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IG9wdHMubWVzc2FnZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KVxuICApO1xuXG4gIHJldHVybiB7IHJhd1Rvb2xzLCB0b29sc1dpdGhOZWVkc0FwcHJvdmFsLCB0b29sQ29udGV4dCB9O1xufVxuIiwgImltcG9ydCB7IHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGJ1aWx0SW5Ub29scyB9IGZyb20gXCIuXCI7XG5cbmV4cG9ydCBjb25zdCBKQVZBU0NSSVBUX1RPT0xfTkFNRSA9IFwiSmF2YVNjcmlwdFwiO1xuXG5leHBvcnQgdHlwZSBTdWJUb29sQ2FsbFJlc3VsdCA9IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIE9uU3ViVG9vbENhbGwgPSAoXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGlucHV0OiB1bmtub3duLFxuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPHVua25vd24+XG4pID0+IFByb21pc2U8U3ViVG9vbENhbGxSZXN1bHQ+O1xuXG5jb25zdCBSRVFVRVNUX01BUktFUl9TVEFSVCA9IFwiX19UT09MX1JFUVVFU1RfX1wiO1xuY29uc3QgUkVRVUVTVF9NQVJLRVJfRU5EID0gXCJfX1RPT0xfUkVRVUVTVF9FTkRfX1wiO1xuY29uc3QgRVhFQ1VUSU9OX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIFRoZSBydW5uZXIgc2NyaXB0IGlzIHdyaXR0ZW4gdG8gdGhlIHNhbmRib3ggYW5kIGV4ZWN1dGVkIHZpYSBOb2RlLmpzLlxuICogSXQgcmVhZHMgdGhlIG1vZGVsJ3MgY29kZSBmcm9tIGNvZGUuanMsIHNldHMgdXAgY3R4LnRvb2xzIGFzIFJQQyBwcm94aWVzXG4gKiAocmVxdWVzdHMgc2VudCB2aWEgc3RkZXJyIG1hcmtlcnMsIHJlc3BvbnNlcyBwb2xsZWQgZnJvbSBmaWxlcyksIGV4ZWN1dGVzXG4gKiB0aGUgY29kZSwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHN0ZG91dCBhcyBKU09OLlxuICovXG5jb25zdCBSVU5ORVJfU0NSSVBUID0gYFxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jLCB1bmxpbmtTeW5jLCBta2RpclN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuY29uc3QgU0NSSVBUX0RJUiA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbmNvbnN0IFRPT0xfQ0FMTF9USU1FT1VUX01TID0gMzAwXzAwMDtcblxubGV0IHJlcUNvdW50ZXIgPSAwO1xuXG5hc3luYyBmdW5jdGlvbiBjYWxsVG9vbChuYW1lLCBpbnB1dCkge1xuICBjb25zdCBpZCA9ICdyZXFfJyArICgrK3JlcUNvdW50ZXIpICsgJ18nICsgRGF0ZS5ub3coKTtcbiAgY29uc3QgcmVzcG9uc2VGaWxlID0gam9pbihTQ1JJUFRfRElSLCBpZCArICcucmVzcG9uc2UuanNvbicpO1xuXG4gIGNvbnN0IHJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeSh7IGlkLCB0b29sOiBuYW1lLCBpbnB1dCB9KTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyR7UkVRVUVTVF9NQVJLRVJfU1RBUlR9JyArIHJlcXVlc3QgKyAnJHtSRVFVRVNUX01BUktFUl9FTkR9JyArICdcXFxcbicpO1xuXG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgd2hpbGUgKCFleGlzdHNTeW5jKHJlc3BvbnNlRmlsZSkpIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gVE9PTF9DQUxMX1RJTUVPVVRfTVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG9vbCBjYWxsICcgKyBuYW1lICsgJyB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UnKTtcbiAgICB9XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDMwKSk7XG4gIH1cblxuICBsZXQgcmF3O1xuICB0cnkge1xuICAgIHJhdyA9IHJlYWRGaWxlU3luYyhyZXNwb25zZUZpbGUsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgIHJhdyA9IHJlYWRGaWxlU3luYyhyZXNwb25zZUZpbGUsICd1dGY4Jyk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UocmF3KTtcbiAgdHJ5IHsgdW5saW5rU3luYyhyZXNwb25zZUZpbGUpOyB9IGNhdGNoIHt9XG5cbiAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UucmVzdWx0O1xufVxuXG5jb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKGpvaW4oU0NSSVBUX0RJUiwgJ2NvZGUuanMnKSwgJ3V0ZjgnKTtcbmNvbnN0IHRvb2xOYW1lcyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpvaW4oU0NSSVBUX0RJUiwgJ3Rvb2xzLmpzb24nKSwgJ3V0ZjgnKSk7XG5cbmNvbnN0IGN0eCA9IHsgdG9vbHM6IHt9IH07XG5mb3IgKGNvbnN0IG5hbWUgb2YgdG9vbE5hbWVzKSB7XG4gIGN0eC50b29sc1tuYW1lXSA9IChpbnB1dCkgPT4gY2FsbFRvb2wobmFtZSwgaW5wdXQpO1xufVxuXG5jb25zdCBsb2dzID0gW107XG5jb25zdCBjdXN0b21Db25zb2xlID0ge1xuICBsb2c6ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIGVycm9yOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKCdbZXJyb3JdICcgKyBhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbiAgd2FybjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW3dhcm5dICcgKyBhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbn07XG5cbnRyeSB7XG4gIGNvbnN0IEFzeW5jRnVuY3Rpb24gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYXN5bmMgZnVuY3Rpb24oKSB7fSkuY29uc3RydWN0b3I7XG4gIGNvbnN0IGZuID0gbmV3IEFzeW5jRnVuY3Rpb24oJ2N0eCcsICdjb25zb2xlJywgY29kZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGN0eCwgY3VzdG9tQ29uc29sZSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0geyBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHJlc3VsdCAhPT0gdW5kZWZpbmVkID8gcmVzdWx0IDogbnVsbCB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufSBjYXRjaCAoZXJyKSB7XG4gIGNvbnN0IG91dHB1dCA9IHtcbiAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufVxuYDtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHBsYWluIEpTT04gU2NoZW1hIGZyb20gd2hhdGV2ZXIgZm9ybWF0IHRoZSBBSSBTREsgdG9vbCB1c2VzXG4gKiAoWm9kIHNjaGVtYSwgQUkgU0RLIHdyYXBwZWQgc2NoZW1hLCBvciByYXcgSlNPTiBTY2hlbWEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEpzb25TY2hlbWEoXG4gIHNjaGVtYTogdW5rbm93blxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIFwiX2RlZlwiIGluIHNjaGVtYSAmJlxuICAgIHR5cGVvZiAoc2NoZW1hIGFzIHsgX2RlZjogdW5rbm93biB9KS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gei50b0pTT05TY2hlbWEoc2NoZW1hIGFzIHouWm9kVHlwZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICBpZiAoU3ltYm9sLmZvcihcInZlcmNlbC5haS5zY2hlbWFcIikgaW4gcyAmJiBcImpzb25TY2hlbWFcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBzIHx8IFwicHJvcGVydGllc1wiIGluIHMpIHtcbiAgICByZXR1cm4gcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvblNjaGVtYVRvVHMoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluZGVudCA9IDBcbik6IHN0cmluZyB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5lbnVtICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5lbnVtLm1hcCgodikgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmFueU9mICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgIHJldHVybiBzY2hlbWEuYW55T2ZcbiAgICAgIC5tYXAoKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBqc29uU2NoZW1hVG9UcyhzLCBpbmRlbnQpKVxuICAgICAgLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5vbmVPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLm9uZU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlIGFzIHN0cmluZztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBzY2hlbWEuaXRlbXNcbiAgICAgICAgPyBqc29uU2NoZW1hVG9UcyhzY2hlbWEuaXRlbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluZGVudClcbiAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIHJldHVybiBgQXJyYXk8JHtpdGVtc30+YDtcbiAgICB9XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hLnByb3BlcnRpZXMgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gbmV3IFNldCgoc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gICAgICBjb25zdCBwYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuICAgICAgY29uc3QgY2xvc2VQYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wiO1xuICAgICAgICByZXR1cm4gYCR7cGFkfSR7a2V5fSR7b3B0fTogJHtqc29uU2NoZW1hVG9Ucyh2YWx1ZSwgaW5kZW50ICsgMSl9YDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGB7XFxuJHtwcm9wcy5qb2luKFwiO1xcblwiKX07XFxuJHtjbG9zZVBhZH19YDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyh0b29sczogVG9vbFNldCk6IHN0cmluZyB7XG4gIGNvbnN0IHNpZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXModG9vbHMpKSB7XG4gICAgY29uc3QgcmF3ID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpbnB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5pbnB1dFNjaGVtYSA/PyByYXcucGFyYW1ldGVycyk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gZXh0cmFjdEpzb25TY2hlbWEocmF3Lm91dHB1dFNjaGVtYSk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dFNjaGVtYSA/IGpzb25TY2hlbWFUb1RzKGlucHV0U2NoZW1hLCAyKSA6IFwie31cIjtcbiAgICBjb25zdCBvdXRwdXRUeXBlID0gb3V0cHV0U2NoZW1hXG4gICAgICA/IGpzb25TY2hlbWFUb1RzKG91dHB1dFNjaGVtYSwgMilcbiAgICAgIDogXCJ1bmtub3duXCI7XG5cbiAgICBzaWdzLnB1c2goYCAgICAke25hbWV9KGlucHV0OiAke2lucHV0VHlwZX0pOiBQcm9taXNlPCR7b3V0cHV0VHlwZX0+YCk7XG4gIH1cblxuICByZXR1cm4gYHR5cGUgQ29udGV4dCA9IHtcXG4gIHRvb2xzOiB7XFxuJHtzaWdzLmpvaW4oXCI7XFxuXCIpfTtcXG4gIH1cXG59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUluU2FuZGJveCh7XG4gIGNvZGUsXG4gIHJwY0RpcixcbiAgYWJvcnRDb250cm9sbGVyLFxuICBzYW5kYm94LFxuICBhdmFpbGFibGVUb29scyxcbiAgb25TdWJUb29sQ2FsbCxcbiAgdG9vbENvbnRleHQsXG59OiB7XG4gIGNvZGU6IHN0cmluZztcbiAgcnBjRGlyOiBzdHJpbmc7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbiAgdG9vbENvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn0pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgcnBjRGlyXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBta2RpclJlc3VsdC5tZXNzYWdlIH07XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZmlsZXM6IFtcbiAgICAgIHsgcGF0aDogXCJydW5uZXIubWpzXCIsIGNvbnRlbnQ6IFJVTk5FUl9TQ1JJUFQgfSxcbiAgICAgIHsgcGF0aDogXCJjb2RlLmpzXCIsIGNvbnRlbnQ6IGNvZGUgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJ0b29scy5qc29uXCIsXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGF2YWlsYWJsZVRvb2xzKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgfSk7XG5cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0sIDEwKTtcbiAgY29uc3QgcGVybWlzc2lvbkZsYWcgPVxuICAgIG5vZGVNYWpvciA+PSAyMiA/IFwiLS1wZXJtaXNzaW9uXCIgOiBcIi0tZXhwZXJpbWVudGFsLXBlcm1pc3Npb25cIjtcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm5vZGVcIixcbiAgICBhcmdzOiBbXG4gICAgICBwZXJtaXNzaW9uRmxhZyxcbiAgICAgIGAtLWFsbG93LWZzLXJlYWQ9JHtycGNEaXJ9YCxcbiAgICAgIGAtLWFsbG93LWZzLXdyaXRlPSR7cnBjRGlyfWAsXG4gICAgICBgJHtycGNEaXJ9L3J1bm5lci5tanNgLFxuICAgIF0sXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuXG4gIGNvbnN0IGZhdGFsOiB7IGVycm9yOiBFcnJvciB8IG51bGwgfSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBjb25zdCBhYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBpZiAoIWZhdGFsLmVycm9yKSB7XG4gICAgICBmYXRhbC5lcnJvciA9IGVycm9yO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRvb2xSZXF1ZXN0ID0gYXN5bmMgKHJlcXVlc3RKc29uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgcGFyc2VkOiB7IGlkOiBzdHJpbmc7IHRvb2w6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfTtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXF1ZXN0SnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpZCwgdG9vbDogdG9vbE5hbWUsIGlucHV0IH0gPSBwYXJzZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGF2YWlsYWJsZVRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgIGlmICghdD8uZXhlY3V0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvb2wgJHt0b29sTmFtZX0gbm90IGZvdW5kIG9yIGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlYyA9IHQuZXhlY3V0ZS5iaW5kKHQpO1xuICAgICAgY29uc3QgZXhlY09wdGlvbnMgPSB7XG4gICAgICAgIHRvb2xDYWxsSWQ6IGBqc18ke3Rvb2xOYW1lfV8ke0RhdGUubm93KCl9YCxcbiAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICB9O1xuICAgICAgaWYgKG9uU3ViVG9vbENhbGwpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBvblN1YlRvb2xDYWxsKHRvb2xOYW1lLCBpbnB1dCwgKCkgPT5cbiAgICAgICAgICBleGVjKGlucHV0LCBleGVjT3B0aW9ucylcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoaW5wdXQsIGV4ZWNPcHRpb25zKTtcbiAgICAgICAgcmVzcG9uc2UgPSB7IHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzcG9uc2UgPSB7IGVycm9yOiBtc2cgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgZmlsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBgJHtpZH0ucmVzcG9uc2UuanNvbmAsXG4gICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB3cml0aW5nIHRoZSByZXNwb25zZSBmaWxlIGZhaWxzLCB0aGUgcnVubmVyIHdpbGwgcG9sbCBmb3JldmVyXG4gICAgICAgKiB3YWl0aW5nIGZvciBpdC4gQWJvcnQgdGhlIHJ1bm5lciBwcm9jZXNzIHNvIHdlIGRvbid0IGRlYWRsb2NrLlxuICAgICAgICovXG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBhYm9ydChuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSBSUEMgcmVzcG9uc2UgZm9yICR7dG9vbE5hbWV9OiAke21zZ31gKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvb2xDYWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBsZXQgc3RkZXJyQnVmZmVyID0gXCJcIjtcbiAgbGV0IG5vbk1hcmtlclN0ZGVyciA9IFwiXCI7XG5cbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGFib3J0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgSmF2YVNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7RVhFQ1VUSU9OX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApXG4gICAgKTtcbiAgfSwgRVhFQ1VUSU9OX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBleGVjUmVzdWx0LmxvZ3MoKSkge1xuICAgICAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZGVyclwiKSB7XG4gICAgICAgIHN0ZGVyckJ1ZmZlciArPSBlbnRyeS5kYXRhO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9TVEFSVCk7XG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlTWFya2VyID0gc3RkZXJyQnVmZmVyLnNsaWNlKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICBpZiAoYmVmb3JlTWFya2VyLnRyaW0oKSkge1xuICAgICAgICAgICAgbm9uTWFya2VyU3RkZXJyICs9IGJlZm9yZU1hcmtlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzdGFydElkeCArIFJFUVVFU1RfTUFSS0VSX1NUQVJULmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9FTkQsIGNvbnRlbnRTdGFydCk7XG4gICAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RKc29uID0gc3RkZXJyQnVmZmVyLnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSWR4KTtcbiAgICAgICAgICBzdGRlcnJCdWZmZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoZW5kSWR4ICsgUkVRVUVTVF9NQVJLRVJfRU5ELmxlbmd0aCk7XG5cbiAgICAgICAgICB0b29sQ2FsbFByb21pc2VzLnB1c2goaGFuZGxlVG9vbFJlcXVlc3QocmVxdWVzdEpzb24pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cblxuICBpZiAoc3RkZXJyQnVmZmVyLnRyaW0oKSkge1xuICAgIG5vbk1hcmtlclN0ZGVyciArPSBzdGRlcnJCdWZmZXI7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodG9vbENhbGxQcm9taXNlcyk7XG5cbiAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgZXhlY1Jlc3VsdC5yZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogZmF0YWwuZXJyb3IubWVzc2FnZSxcbiAgICAgIC4uLihub25NYXJrZXJTdGRlcnIgPyB7IHN0ZGVycjogbm9uTWFya2VyU3RkZXJyLnNsaWNlKDAsIDIwMDApIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgUnVubmVyIGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkuYCxcbiAgICAgIHN0ZGVycjogKG5vbk1hcmtlclN0ZGVyciArIHN0ZGVycikuc2xpY2UoMCwgMjAwMCksXG4gICAgICBzdGRvdXQ6IHN0ZG91dC5zbGljZSgwLCAxMDAwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKYXZhU2NyaXB0VG9vbChvcHRzOiB7XG4gIHRvb2xzOiBUb29sU2V0O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIG9uU3ViVG9vbENhbGw/OiBPblN1YlRvb2xDYWxsO1xuICB0b29sQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufSkge1xuICBjb25zdCB7IHNlc3Npb24sIHNhbmRib3gsIG9uU3ViVG9vbENhbGwgfSA9IG9wdHM7XG4gIGNvbnN0IGFjdGl2ZVNldCA9IHNlc3Npb24uYWN0aXZlVG9vbHMgPyBuZXcgU2V0KHNlc3Npb24uYWN0aXZlVG9vbHMpIDogbnVsbDtcbiAgY29uc3QgYXZhaWxhYmxlVG9vbHM6IFRvb2xTZXQgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy50b29scykpIHtcbiAgICBpZiAoIWFjdGl2ZVNldCB8fCBhY3RpdmVTZXQuaGFzKG5hbWUpKSB7XG4gICAgICBhdmFpbGFibGVUb29sc1tuYW1lXSA9IHQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbnRleHRUeXBlID0gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyhhdmFpbGFibGVUb29scyk7XG5cbiAgcmV0dXJuIHRvb2woe1xuICAgIC4uLmJ1aWx0SW5Ub29scy5KYXZhU2NyaXB0LFxuICAgIGRlc2NyaXB0aW9uOiBgRXhlY3V0ZSBKYXZhU2NyaXB0IHRvIG9yY2hlc3RyYXRlIG11bHRpcGxlIHRvb2wgY2FsbHMgaW4gYSBzaW5nbGUgc3RlcC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCB0byBydW4gc2V2ZXJhbCB0b29scyBpbiBzZXF1ZW5jZSwgdHJhbnNmb3JtIGludGVybWVkaWF0ZSByZXN1bHRzLCBvciBwYXJhbGxlbGl6ZSBpbmRlcGVuZGVudCBvcGVyYXRpb25zIHdpdGggUHJvbWlzZS5hbGwuXG5cblRoZSBjb2RlIHJ1bnMgYXMgYW4gYXN5bmMgZnVuY3Rpb24gYm9keSB3aXRoIFxcYGN0eFxcYCBpbiBzY29wZTpcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuJHtjb250ZXh0VHlwZX1cblxcYFxcYFxcYFxuXG5FeGFtcGxlczpcbi0gU2VxdWVudGlhbDogXFxgY29uc3QgZmlsZSA9IGF3YWl0IGN0eC50b29scy5SZWFkKHsgcGF0aDogXCJwYWNrYWdlLmpzb25cIiB9KTsgcmV0dXJuIEpTT04ucGFyc2UoZmlsZS5jb250ZW50KTtcXGBcbi0gUGFyYWxsZWw6IFxcYGNvbnN0IFthLCBiXSA9IGF3YWl0IFByb21pc2UuYWxsKFtjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwiYS50c1wiIH0pLCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwiYi50c1wiIH0pXSk7IHJldHVybiB7IGE6IGEuY29udGVudCwgYjogYi5jb250ZW50IH07XFxgXG4tIFRyYW5zZm9ybTogXFxgY29uc3QgZ3JlcCA9IGF3YWl0IGN0eC50b29scy5HcmVwKHsgcGF0dGVybjogXCJUT0RPXCIgfSk7IHJldHVybiBncmVwLm1hdGNoZXMuc3BsaXQoXCJcXFxcblwiKS5sZW5ndGg7XFxgXG4tIEJhc2g6IFxcYGNvbnN0IHIgPSBhd2FpdCBjdHgudG9vbHMuQmFzaCh7IGNvbW1hbmQ6IFwibm9kZSAtZSBcXFxcXCJjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7djoxfSkpXFxcXFwiXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKHIuc3Rkb3V0KTtcXGBcblxuUmV0dXJuIGEgdmFsdWUgdG8gcGFzcyByZXN1bHRzIGJhY2suIFVzZSBjb25zb2xlLmxvZygpIGZvciBkZWJ1ZyBvdXRwdXQuXG5JbXBvcnRhbnQ6IEVhY2ggdG9vbCByZXR1cm5zIGEgc3RydWN0dXJlZCBvYmplY3QgbWF0Y2hpbmcgaXRzIG91dHB1dCBzY2hlbWEgXHUyMDE0IG5vdCBhIHJhdyBzdHJpbmcuIEFjY2VzcyB0aGUgc3BlY2lmaWMgZmllbGQgeW91IG5lZWQgKGUuZy4gQmFzaCdzIHJlc3VsdC5zdGRvdXQsIFJlYWQncyByZXN1bHQuY29udGVudCkgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHBhcnNlIHRoZSBlbnRpcmUgcmVzdWx0LmAsXG4gICAgZXhlY3V0ZTogKHsgY29kZSB9KSA9PiB7XG4gICAgICBjb25zdCBydW5JZCA9IGBydW5fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKClcbiAgICAgICAgLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMiwgOCl9YDtcbiAgICAgIGNvbnN0IHJwY0RpciA9IGAuYWdlbnQvanMtcnBjLyR7cnVuSWR9YDtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgcmV0dXJuIGV4ZWN1dGVJblNhbmRib3goe1xuICAgICAgICBjb2RlLFxuICAgICAgICBycGNEaXIsXG4gICAgICAgIGFib3J0Q29udHJvbGxlcixcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAgYXZhaWxhYmxlVG9vbHMsXG4gICAgICAgIG9uU3ViVG9vbENhbGwsXG4gICAgICAgIHRvb2xDb250ZXh0OiBvcHRzLnRvb2xDb250ZXh0LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUb29sIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBCdWlsdEluVG9vbE5hbWUgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG4vKiogQnVpbHQtaW4gZGVmYXVsdHMgZm9yIG5lZWRzQXBwcm92YWwgKHVzZXIgY2FuIG92ZXJyaWRlIHZpYSBhZ2VudCBjb25maWcpLiAqL1xuY29uc3QgYnVpbHRpbk5lZWRzQXBwcm92YWw6IFBhcnRpYWw8UmVjb3JkPEJ1aWx0SW5Ub29sTmFtZSwgYm9vbGVhbj4+ID0ge307XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja05lZWRzQXBwcm92YWwoe1xuICBhZ2VudCxcbiAgdG9vbE5hbWUsXG4gIGlucHV0LFxuICB0b29sQ2FsbElkLFxuICBtZXNzYWdlcyxcbn06IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICB0b29sTmFtZTogc3RyaW5nO1xuICBpbnB1dDogdW5rbm93bjtcbiAgdG9vbENhbGxJZDogc3RyaW5nO1xuICBtZXNzYWdlczogdW5rbm93bltdO1xufSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyAxLiBQZXItdG9vbCBuZWVkc0FwcHJvdmFsIG9uIHRoZSBUb29sIGRlZmluaXRpb24gdGFrZXMgcHJpb3JpdHlcbiAgY29uc3QgdG9vbERlZiA9IGFnZW50Lm9wdGlvbnMudG9vbHM/Llt0b29sTmFtZV0gYXMgVG9vbCB8IHVuZGVmaW5lZDtcbiAgaWYgKHRvb2xEZWY/Lm5lZWRzQXBwcm92YWwgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgdG9vbERlZi5uZWVkc0FwcHJvdmFsID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHRvb2xEZWYubmVlZHNBcHByb3ZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRvb2xEZWYubmVlZHNBcHByb3ZhbChpbnB1dCwge1xuICAgICAgdG9vbENhbGxJZCxcbiAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyBhcyBuZXZlcltdLFxuICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDIuIEFnZW50LWxldmVsIG5lZWRzQXBwcm92YWwgbWFwXG4gIGNvbnN0IGFnZW50RW50cnkgPSAoXG4gICAgYWdlbnQub3B0aW9ucy5uZWVkc0FwcHJvdmFsIGFzXG4gICAgICB8IFJlY29yZDxcbiAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgYm9vbGVhbiB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPilcbiAgICAgICAgPlxuICAgICAgfCB1bmRlZmluZWRcbiAgKT8uW3Rvb2xOYW1lXTtcblxuICBpZiAoYWdlbnRFbnRyeSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBhZ2VudEVudHJ5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGFnZW50RW50cnk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBhZ2VudEVudHJ5KGlucHV0LCB7XG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gMy4gQnVpbHQtaW4gZGVmYXVsdHNcbiAgcmV0dXJuIGJ1aWx0aW5OZWVkc0FwcHJvdmFsW3Rvb2xOYW1lIGFzIEJ1aWx0SW5Ub29sTmFtZV0gPz8gZmFsc2U7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUsIE1vZGVsTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuXG50eXBlIFByb3ZpZGVyT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEpTT05WYWx1ZT4+O1xuXG5jb25zdCBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUID0gNDtcblxuY29uc3QgQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMgPSBbXCJjbGF1ZGVcIiwgXCJhbnRocm9waWNcIl07XG5cbmNvbnN0IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TOiBQcm92aWRlck9wdGlvbnMgPSB7XG4gIGFudGhyb3BpYzoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIG9wZW5yb3V0ZXI6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBiZWRyb2NrOiB7XG4gICAgY2FjaGVQb2ludDogeyB0eXBlOiBcImRlZmF1bHRcIiB9LFxuICB9LFxuICBvcGVuYWlDb21wYXRpYmxlOiB7XG4gICAgY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGNvcGlsb3Q6IHtcbiAgICBjb3BpbG90X2NhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0R2F0ZXdheVByb3ZpZGVyKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2xhc2hJbmRleCA9IG1vZGVsLmluZGV4T2YoXCIvXCIpO1xuICBpZiAoc2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbW9kZWwuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXIge1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSAobWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9KVxuICAgICAgLnByb3ZpZGVyT3B0aW9ucztcbiAgICBpZiAocHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcbiAgICAgICAgaWYgKHBhcnRQcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2xhdWRlTGlrZU1vZGVsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbG93ZXIgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMuc29tZSgobSkgPT4gbG93ZXIuaW5jbHVkZXMobSkpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyT3B0aW9ucyhvcHRzOiB7XG4gIGN1cnJlbnQ6IFByb3ZpZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcGF0Y2g6IFByb3ZpZGVyT3B0aW9ucztcbn0pOiBQcm92aWRlck9wdGlvbnMge1xuICBjb25zdCBuZXh0OiBQcm92aWRlck9wdGlvbnMgPSB7IC4uLihvcHRzLmN1cnJlbnQgPz8ge30pIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMucGF0Y2gpKSB7XG4gICAgbmV4dFtrZXldID0geyAuLi4obmV4dFtrZXldID8/IHt9KSwgLi4udmFsdWUgfTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFwYXJ0IHx8IHR5cGVvZiBwYXJ0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQgJiYgKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlID09PSBcInRleHRcIikge1xuICAgIGNvbnN0IHRleHQgPSAocGFydCBhcyB7IHRleHQ/OiB1bmtub3duIH0pLnRleHQ7XG4gICAgaWYgKHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCkge1xuICAgIGNvbnN0IHR5cGUgPSAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwidGhpbmtpbmdcIiB8fCB0eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZTogTW9kZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC50cmltKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnNvbWUoKHBhcnQpID0+IGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0KSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KGNvbnRlbnQ6IHVua25vd25bXSk6IG51bWJlciB8IG51bGwge1xuICBmb3IgKGxldCBpID0gY29udGVudC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGlmIChpc0NhY2hlYWJsZUNsYXVkZVBhcnQoY29udGVudFtpXSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyW10ge1xuICBjb25zdCBzeXN0ZW1JbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBmaW5hbEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGggJiYgc3lzdGVtSW5kaWNlcy5sZW5ndGggPCAyOyBpICs9IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBzeXN0ZW1JbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiBmaW5hbEluZGljZXMubGVuZ3RoIDwgMjsgaSAtPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgZmluYWxJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZmluYWxJbmRpY2VzLnJldmVyc2UoKTtcblxuICByZXR1cm4gWy4uLnN5c3RlbUluZGljZXMsIC4uLmZpbmFsSW5kaWNlc107XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0OiBudW1iZXI7XG59KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBleGlzdGluZ0JyZWFrcG9pbnRzID0gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG9wdHMubWVzc2FnZXMpO1xuICBjb25zdCByZW1haW5pbmdCdWRnZXQgPSBNYXRoLm1heChcbiAgICAwLFxuICAgIG9wdHMubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0IC0gZXhpc3RpbmdCcmVha3BvaW50c1xuICApO1xuXG4gIGlmIChyZW1haW5pbmdCdWRnZXQgPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEluZGljZXMgPSBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhvcHRzLm1lc3NhZ2VzKS5zbGljZShcbiAgICAwLFxuICAgIHJlbWFpbmluZ0J1ZGdldFxuICApO1xuICBpZiAodGFyZ2V0SW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgPVxuICAgIG9wdHMucHJvdmlkZXJJZCA9PT0gXCJhbnRocm9waWNcIiB8fFxuICAgIEJvb2xlYW4ob3B0cy5wcm92aWRlcklkPy5pbmNsdWRlcyhcImJlZHJvY2tcIikpO1xuXG4gIGNvbnN0IG5leHRNZXNzYWdlcyA9IG9wdHMubWVzc2FnZXMuc2xpY2UoKTtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2VJbmRleCBvZiB0YXJnZXRJbmRpY2VzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuXG4gICAgY29uc3Qgc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgPVxuICAgICAgIXVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJlxuICAgICAgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0SW5kZXggPSBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgaWYgKHBhcnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJ0ID0gbWVzc2FnZS5jb250ZW50W3BhcnRJbmRleF07XG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgICAgICBuZXh0Q29udGVudFtwYXJ0SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4uKHBhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgICAgICAgIGN1cnJlbnQ6IHBhcnRQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0gYXMgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQpW251bWJlcl07XG5cbiAgICAgICAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb250ZW50OiBuZXh0Q29udGVudCxcbiAgICAgICAgICB9IGFzIE1vZGVsTWVzc2FnZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICBtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICBjdXJyZW50OiBtZXNzYWdlUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5leHRNZXNzYWdlcztcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Q2FjaGluZ1Jlc3VsdCA9IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdChvcHRzOiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIGFudGhyb3BpYz86IHsgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0PzogbnVtYmVyIH07XG4gIG9wZW5haT86IHsgc2V0UHJvbXB0Q2FjaGVLZXk/OiBib29sZWFuIH07XG59KTogUHJvbXB0Q2FjaGluZ1Jlc3VsdCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0R2F0ZXdheVByb3ZpZGVyKG9wdHMubW9kZWwpO1xuXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zID0ge307XG5cbiAgaWYgKFxuICAgIChwcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBwcm92aWRlciA9PT0gXCJhenVyZVwiKSAmJlxuICAgIG9wdHMub3BlbmFpPy5zZXRQcm9tcHRDYWNoZUtleSAhPT0gZmFsc2VcbiAgKSB7XG4gICAgcHJvdmlkZXJPcHRpb25zLm9wZW5haSA9IHsgcHJvbXB0Q2FjaGVLZXk6IG9wdHMuc2Vzc2lvbklkIH07XG4gIH1cblxuICBjb25zdCBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPVxuICAgIG9wdHMuYW50aHJvcGljPy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPz9cbiAgICBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUO1xuXG4gIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gaXNDbGF1ZGVMaWtlTW9kZWwob3B0cy5tb2RlbClcbiAgICA/IGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyh7XG4gICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlcklkOiBwcm92aWRlcixcbiAgICAgICAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0LFxuICAgICAgfSlcbiAgICA6IG9wdHMubWVzc2FnZXM7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlczogY2FjaGVkTWVzc2FnZXMsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlQ2h1bmsgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyBTZXNzaW9uTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkNvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IGdldEFjdGl2ZVJ1bnMsIHJlcGxheUFjdGl2ZVJ1biB9IGZyb20gXCIuL3NlbmRcIjtcblxuZXhwb3J0IHR5cGUgU3RyZWFtT3B0aW9ucyA9IHtcbiAgbWVzc2FnZUlkPzogc3RyaW5nO1xuICBzdGFydEluZGV4PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dSdW5MaWtlID0ge1xuICBnZXRSZWFkYWJsZShvcHRpb25zPzogeyBzdGFydEluZGV4PzogbnVtYmVyIH0pOiBSZWFkYWJsZVN0cmVhbTtcbn07XG5cbmZ1bmN0aW9uIGlzV29ya2Zsb3dSdW4oYXJnOiB1bmtub3duKTogYXJnIGlzIFdvcmtmbG93UnVuTGlrZSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGFyZyAhPT0gbnVsbCAmJlxuICAgIFwiZ2V0UmVhZGFibGVcIiBpbiBhcmcgJiZcbiAgICB0eXBlb2YgKGFyZyBhcyBXb3JrZmxvd1J1bkxpa2UpLmdldFJlYWRhYmxlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbShcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0LFxuICBydW5Pck9wdHM/OiBXb3JrZmxvd1J1bkxpa2UgfCBTdHJlYW1PcHRpb25zXG4pOiBQcm9taXNlPFJlYWRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPj4ge1xuICBpZiAoaXNXb3JrZmxvd1J1bihydW5Pck9wdHMpKSB7XG4gICAgY29uc3QgcmVhZGVyID0gcnVuT3JPcHRzLmdldFJlYWRhYmxlKCkuZ2V0UmVhZGVyKCk7XG4gICAgLy8gYXdhaXQgZm9yIHRoZSBmaXJzdCBjaHVuayB0byBiZSByZWFkeSBiZWZvcmUgZmluaXNoaW5nIHRoZSB3b3JrZmxvdyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnNcbiAgICBhd2FpdCByZWFkZXIucmVhZCgpLmNhdGNoKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcih7XG4gICAgICAgIGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICAgIHJlYXNvbjogXCJzdHJlYW0oKSBmYWlsZWQgdG8gcmVhZCBmaXJzdCBjaHVuayBmcm9tIHdvcmtmbG93IHJ1blwiLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmVhZGVyLmNhbmNlbCgpO1xuXG4gICAgcmV0dXJuIHJ1bk9yT3B0cy5nZXRSZWFkYWJsZSgpO1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IHJ1bk9yT3B0cztcbiAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi5nZXQoXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG4gIGlmICghc2Vzc2lvbikge1xuICAgIHRocm93IG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQgfSk7XG4gIH1cbiAgY29uc3QgbWVzc2FnZUlkID0gb3B0cz8ubWVzc2FnZUlkID8/IHNlc3Npb24ubGFzdE1lc3NhZ2VJZDtcbiAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3Ioe1xuICAgICAgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgIHJlYXNvbjogXCJObyBtZXNzYWdlIHRvIHN0cmVhbVwiLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgYWN0aXZlUnVucyA9IGdldEFjdGl2ZVJ1bnMoKTtcbiAgY29uc3QgYWN0aXZlID0gYWN0aXZlUnVucy5nZXQobWVzc2FnZUlkKTtcbiAgaWYgKCFhY3RpdmUpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmdldChtZXNzYWdlSWQpO1xuICAgIGlmIChtZXNzYWdlPy53b3JrZmxvd1J1bklkKSB7XG4gICAgICBjb25zdCByZWFkYWJsZSA9IGF3YWl0IGltcG9ydChcIndvcmtmbG93L2FwaVwiKVxuICAgICAgICAudGhlbigoeyBnZXRSdW4gfSkgPT4gZ2V0UnVuKG1lc3NhZ2Uud29ya2Zsb3dSdW5JZCEpLmdldFJlYWRhYmxlKCkpXG4gICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgaWYgKHJlYWRhYmxlKSB7XG4gICAgICAgIHJldHVybiByZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3Ioe1xuICAgICAgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgIHJlYXNvbjogYE5vIGFjdGl2ZSBydW4gZm9yIG1lc3NhZ2UgJHttZXNzYWdlSWR9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXBsYXlBY3RpdmVSdW4oYWN0aXZlLCBvcHRzPy5zdGFydEluZGV4KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXJyb3JzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBjbGFzcyBTdHJlYW1FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RyZWFtRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTdHJlYW0gZmFpbGVkIGZvciBzZXNzaW9uICRpZDogJHJlYXNvblwiLFxufSkge31cbiIsICJpbXBvcnQgdHlwZSB7IEdhdGV3YXlNb2RlbElkLCBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBub3JtYWxpemVTa2lsbHMgfSBmcm9tIFwiLi4vc2tpbGxzL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJblRvb2xOYW1lIH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZU9wdGlvbnM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9IFBhcnRpYWw8XG4gIE9taXQ8U2Vzc2lvbiwgXCJpZFwiIHwgXCJhY3RpdmVUb29sc1wiIHwgXCJtb2RlbFwiPiAmIHtcbiAgICBtb2RlbD86IEdhdGV3YXlNb2RlbElkO1xuICAgIGFjdGl2ZVRvb2xzPzogKEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWUpW107XG4gIH1cbj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGU8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0LFxuICBvcHRzOiBVcGRhdGVPcHRpb25zPFRvb2xzPlxuKSB7XG4gIGNvbnN0IHsgc2tpbGxzLCAuLi5yYXdVcGRhdGVzIH0gPSBvcHRzO1xuICBjb25zdCBub3JtYWxpemVkVXBkYXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICAuLi5yYXdVcGRhdGVzLFxuICAgICAgLi4uKHNraWxscyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBza2lsbHM6IHNraWxscyA/IG5vcm1hbGl6ZVNraWxscyhza2lsbHMpIDogbnVsbCB9XG4gICAgICAgIDoge30pLFxuICAgIH0pLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICApO1xuXG4gIGlmIChPYmplY3Qua2V5cyhub3JtYWxpemVkVXBkYXRlcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLnVwZGF0ZShzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsIHtcbiAgICAuLi5ub3JtYWxpemVkVXBkYXRlcyxcbiAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gIH0pO1xufVxuIiwgImltcG9ydCB7IGNvbXB1dGVTZXNzaW9uVXNhZ2UsIHR5cGUgU2Vzc2lvblVzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL3VzYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1c2FnZShcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0XG4pOiBQcm9taXNlPFNlc3Npb25Vc2FnZT4ge1xuICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKFxuICAgIHNlc3Npb25Db250ZXh0LnNlc3Npb25JZFxuICApO1xuICByZXR1cm4gY29tcHV0ZVNlc3Npb25Vc2FnZShtZXNzYWdlcyk7XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBJbmZlclRvb2xJbnB1dCxcbiAgSW5mZXJVSVRvb2xzLFxuICBNb2RlbE1lc3NhZ2UsXG4gIFRvb2xTZXQsXG4gIFVJTWVzc2FnZSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJblRvb2xOYW1lLCBidWlsdEluVG9vbHMsIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBTdGF0dXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogVHJhbnNpZW50IHN0YXR1cyBpbmRpY2F0b3JzIGVtaXR0ZWQgb3ZlciB0aGUgc3RyZWFtIGR1cmluZyBsb25nLXJ1bm5pbmcgcGhhc2VzLlxuICogRGVsaXZlcmVkIHRvIHRoZSBjbGllbnQgYXMgYGRhdGEtc3RhdHVzYCBjaHVua3Mgd2l0aCBgdHJhbnNpZW50OiB0cnVlYCBcdTIwMTQgbm90IHBlcnNpc3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFnZW50U3RhdHVzID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJzYW5kYm94LXNldHVwXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInNhbmRib3gtc2V0dXAtY29sZFwiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJsb2FkaW5nLXNraWxsc1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJwcm9jZXNzaW5nLWFwcHJvdmFsc1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJuZWVkcy1hcHByb3ZhbFwiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJ0aGlua2luZ1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJjdXN0b21cIiksIHN0YXR1czogei5zdHJpbmcoKSB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBBZ2VudFN0YXR1cyA9IHouaW5mZXI8dHlwZW9mIEFnZW50U3RhdHVzPjtcblxuZXhwb3J0IHR5cGUgQWdlbnREYXRhVHlwZXMgPSB7IHN0YXR1czogQWdlbnRTdGF0dXMgfTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEhvb2tzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBBZ2VudEhvb2tzID0ge1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICBcInRvb2wuYWZ0ZXJcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IHJlc3VsdDogdW5rbm93biB9PjtcbiAgc3RhdHVzPzogKHN0YXR1czogQWdlbnRTdGF0dXMpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE5lZWRzIEFwcHJvdmFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG50eXBlIFRvb2xOYW1lPFRvb2xzPiA9IEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWU7XG5cbnR5cGUgVG9vbElucHV0PFRvb2xzLCBLPiA9IEsgZXh0ZW5kcyBCdWlsdEluVG9vbE5hbWVcbiAgPyBJbmZlclRvb2xJbnB1dDwodHlwZW9mIGJ1aWx0SW5Ub29scylbS10+XG4gIDogSyBleHRlbmRzIGtleW9mIFRvb2xzXG4gICAgPyBUb29sc1tLXSBleHRlbmRzIGltcG9ydChcImFpXCIpLlRvb2xcbiAgICAgID8gSW5mZXJUb29sSW5wdXQ8VG9vbHNbS10+XG4gICAgICA6IHVua25vd25cbiAgICA6IHVua25vd247XG5cbmV4cG9ydCB0eXBlIE5lZWRzQXBwcm92YWxNYXA8VG9vbHM+ID0ge1xuICBbSyBpbiBUb29sTmFtZTxUb29scz5dPzpcbiAgICB8IGJvb2xlYW5cbiAgICB8ICgoXG4gICAgICAgIGlucHV0OiBUb29sSW5wdXQ8VG9vbHMsIEs+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdG9vbENhbGxJZDogc3RyaW5nO1xuICAgICAgICAgIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW5mZXIgVUkgTWVzc2FnZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IHR5cGUgSW5mZXJVSU1lc3NhZ2U8QT4gPSBBIGV4dGVuZHMge1xuICB0b29sczogaW5mZXIgVCBleHRlbmRzIFRvb2xTZXQ7XG4gICRVSU1lc3NhZ2U6IFVJTWVzc2FnZTxpbmZlciBNPjtcbn1cbiAgPyBVSU1lc3NhZ2U8TSwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUPj5cbiAgOiBBIGV4dGVuZHMgeyB0b29sczogaW5mZXIgVCBleHRlbmRzIFRvb2xTZXQgfVxuICAgID8gVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gICAgOiBVSU1lc3NhZ2U8dW5rbm93biwgQWdlbnREYXRhVHlwZXM+O1xuXG5leHBvcnQgdHlwZSBUeXBlZFVJTWVzc2FnZTxcbiAgVE1lc3NhZ2VNZXRhZGF0YSA9IHVua25vd24sXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4+ID0gVUlNZXNzYWdlPFRNZXNzYWdlTWV0YWRhdGEsIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VG9vbHM+PjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJlZ2lzdHJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jbGFzcyBBZ2VudE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIkFnZW50Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBgQWdlbnQgXCIkYWdlbnROYW1lXCIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5LlxuXG5oaW50OiBhZ2VudCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB3b3JrZmxvdyBzdGVwcyBleGVjdXRlLlxuICAgICAgVmFsaWQgbG9jYXRpb25zOiBtb2R1bGUgc2NvcGUsIG9yIGluc2lkZSBhIFwidXNlIHdvcmtmbG93XCIgYm9keS5cblxuICAvLyBNb2R1bGUgc2NvcGUgKHN0YXRpYyBhZ2VudHMpXG4gIGV4cG9ydCBjb25zdCBteUFnZW50ID0gYWdlbnQoXCIkYWdlbnROYW1lXCIsIHsgLi4uIH0pO1xuXG4gIC8vIFdvcmtmbG93IGJvZHkgKGR5bmFtaWMgYWdlbnRzKVxuICBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KHsgaW5wdXQgfSkge1xuICAgIFwidXNlIHdvcmtmbG93XCI7XG4gICAgY29uc3QgbXlBZ2VudCA9IGFnZW50KFwiJGFnZW50TmFtZVwiLCB7IC4uLiB9KTtcbiAgICAuLi5cbiAgfWAsXG59KSB7fVxuXG5jb25zdCBBR0VOVF9SRUdJU1RSWV9LRVkgPSBTeW1ib2wuZm9yKFwiZXhwZXJpbWVudGFsLWFnZW50LXJlZ2lzdHJ5XCIpO1xuXG5mdW5jdGlvbiBnZXRBZ2VudFJlZ2lzdHJ5KCk6IE1hcDxzdHJpbmcsIEFueUFnZW50PiB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+O1xuICBsZXQgcmVnaXN0cnkgPSBnW0FHRU5UX1JFR0lTVFJZX0tFWV0gYXMgTWFwPHN0cmluZywgQW55QWdlbnQ+IHwgdW5kZWZpbmVkO1xuICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgcmVnaXN0cnkgPSBuZXcgTWFwKCk7XG4gICAgZ1tBR0VOVF9SRUdJU1RSWV9LRVldID0gcmVnaXN0cnk7XG4gIH1cbiAgcmV0dXJuIHJlZ2lzdHJ5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBZ2VudChuYW1lOiBzdHJpbmcsIGFnZW50OiBBbnlBZ2VudCkge1xuICBnZXRBZ2VudFJlZ2lzdHJ5KCkuc2V0KG5hbWUsIGFnZW50KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2VudDxSZXF1aXJlZCBleHRlbmRzIGJvb2xlYW4+KFxuICBuYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkPzogUmVxdWlyZWRcbik6IFJlcXVpcmVkIGV4dGVuZHMgdHJ1ZSA/IEFueUFnZW50IDogQW55QWdlbnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBhZ2VudCA9IGdldEFnZW50UmVnaXN0cnkoKS5nZXQobmFtZSk7XG4gIGlmIChyZXF1aXJlZCAmJiAhYWdlbnQpIHtcbiAgICB0aHJvdyBuZXcgQWdlbnROb3RGb3VuZEVycm9yKHsgYWdlbnROYW1lOiBuYW1lIH0pO1xuICB9XG4gIHJldHVybiBhZ2VudCBhcyBSZXF1aXJlZCBleHRlbmRzIHRydWUgPyBBbnlBZ2VudCA6IEFueUFnZW50IHwgdW5kZWZpbmVkO1xufVxuIl0sCiAg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bUI7QUFBQSxRQUN0QixrQkFBa0IsRUFBRSxRQUFRLEtBQUssS0FBSyxDQUFDO0FBQUEsTUFDekM7QUFDQSxhQUFPLEtBQUs7QUFBQSxJQUNkO0FBRUEsSUFBQUEsS0FBSTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsU0FBSyxtQkFBbUIsVUFBVSxhQUFhLENBQUM7QUFDaEQsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRUEsSUFBSSxRQUFRO0FBQ1YsV0FBTyxFQUFFLEdBQUcsY0FBYyxHQUFHLEtBQUssUUFBUSxNQUFNO0FBQUEsRUFFbEQ7QUFBQSxFQUVBLElBQUksa0JBQW1DO0FBQ3JDLFVBQU0sRUFBRSxPQUFPLFFBQVEsWUFBWSxhQUFhLE9BQU8sSUFBSSxLQUFLO0FBQ2hFLFdBQU8sRUFBRSxPQUFPLFFBQVEsWUFBWSxhQUFhLE9BQU87QUFBQSxFQUMxRDtBQUFBLEVBRUEsSUFBSSxRQUFvQjtBQUN0QixXQUFPLEtBQUssUUFBUSxTQUFTLENBQUM7QUFBQSxFQUNoQztBQUFBLEVBRVM7QUFBQSxFQUVBO0FBUVg7QUFFTyxTQUFTLE1BS2QsTUFBYyxTQUEyRDtBQUN6RSxRQUFNLFdBQVcsSUFBSSxNQUtuQixNQUFNLE9BQU87QUFDZixnQkFBYyxNQUFNLFFBQVE7QUFDNUIsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJhZ2VudCIsICJsb2ciLCAicmVzb2x2ZSIsICJhZ2VudCIsICJ1bGlkIiwgInVzYWdlIiwgImVycm9yZSIsICJ1bGlkIiwgImFnZW50IiwgImxvZyIsICJyZWFkRmlsZSIsICJyZXNvbHZlIiwgImxvZyIsICJ0b29sIiwgInVsaWQiLCAieiIsICJleGVjIiwgImFnZW50IiwgInRvb2wiLCAieiIsICJhZ2VudCIsICJ1bGlkIiwgInN0YXJ0IiwgImFnZW50IiwgInJlc29sdmUiLCAibG9nIiwgInNlc3Npb24iLCAic2FuZGJveCIsICJzdHJlYW0iLCAidXNhZ2UiLCAiYWdlbnQiLCAibG9nIiwgInVsaWQiLCAidXNhZ2UiLCAibm93IiwgImlkIiwgImVycm9yZSIsICJhZ2VudCIsICJ1bGlkIiwgImVycm9yZSIsICJ6IiwgImFnZW50IiwgImFnZW50IiwgImxvZyJdCn0K
|
|
3723
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FnZW50L2NsaWVudC50cyIsICIuLi9zcmMvc2FuZGJveC9oYW5kbGUudHMiLCAiLi4vc3JjL2FnZW50L2lzLXZlcmNlbC50cyIsICIuLi9zcmMvZXJyb3JzLnRzIiwgIi4uL3NyYy9zYW5kYm94L3NldHVwLnRzIiwgIi4uL3NyYy9zYW5kYm94L2V4ZWMudHMiLCAiLi4vc3JjL3NhbmRib3gvZ2V0LWRvbWFpbi50cyIsICIuLi9zcmMvc2FuZGJveC9nZXQtc3RhdHVzLnRzIiwgIi4uL3NyYy9zYW5kYm94L2tpbGwudHMiLCAiLi4vc3JjL3NhbmRib3gvcmVhZC1maWxlLnRzIiwgIi4uL3NyYy9zYW5kYm94L3NuYXBzaG90LnRzIiwgIi4uL3NyYy9zYW5kYm94L3N0YXJ0LnRzIiwgIi4uL3NyYy9zYW5kYm94L3N0b3AudHMiLCAiLi4vc3JjL3NhbmRib3gvdXBkYXRlLW5ldHdvcmstcG9saWN5LnRzIiwgIi4uL3NyYy9zYW5kYm94L3dyaXRlLWZpbGVzLnRzIiwgIi4uL3NyYy9zZXNzaW9uL2hhbmRsZS50cyIsICIuLi9zcmMvdXRpbHMvdWkudHMiLCAiLi4vc3JjL3V0aWxzL3VzYWdlLnRzIiwgIi4uL3NyYy9zZXNzaW9uL2hpc3RvcnkudHMiLCAiLi4vc3JjL3Nlc3Npb24vaW50ZXJydXB0LnRzIiwgIi4uL3NyYy9zZXNzaW9uL3NlbmQudHMiLCAiLi4vc3JjL3Nlc3Npb24vYWktbG9vcC9zdHJlYW0tdGV4dC50cyIsICIuLi9zcmMvc2tpbGxzL3BhcnNlci50cyIsICIuLi9zcmMvc2tpbGxzL2Rpc2NvdmVyLnRzIiwgIi4uL3NyYy9za2lsbHMvcmVzb2x2ZS1ob3N0LnRzIiwgIi4uL3NyYy9za2lsbHMvcmVzb2x2ZS1pbmxpbmUudHMiLCAiLi4vc3JjL3NraWxscy9yZXNvbHZlLXJlbW90ZS50cyIsICIuLi9zcmMvc2tpbGxzL3Jlc29sdmUudHMiLCAiLi4vc3JjL3Rvb2xzL2luZGV4LnRzIiwgIi4uL3NyYy90b29scy9qYXZhc2NyaXB0LnRzIiwgIi4uL3NyYy90b29scy9uZWVkcy1hcHByb3ZhbC50cyIsICIuLi9zcmMvdXRpbHMvcHJvbXB0LWNhY2hlLnRzIiwgIi4uL3NyYy9zZXNzaW9uL3N0cmVhbS50cyIsICIuLi9zcmMvc2Vzc2lvbi91cGRhdGUudHMiLCAiLi4vc3JjL3Nlc3Npb24vdXNhZ2UudHMiLCAiLi4vc3JjL2FnZW50L3JlZ2lzdHJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5TW9kZWxJZCwgSW5mZXJVSVRvb2xzLCBUb29sU2V0LCBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEJpbmRpbmcsIFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi4vc2FuZGJveC9oYW5kbGVcIjtcbmltcG9ydCB7IHNhbmRib3hIYW5kbGUgfSBmcm9tIFwiLi4vc2FuZGJveC9oYW5kbGVcIjtcbmltcG9ydCB7IHR5cGUgU2Vzc2lvbkNvbnRleHQsIHNlc3Npb25IYW5kbGUgfSBmcm9tIFwiLi4vc2Vzc2lvbi9oYW5kbGVcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxJbnB1dCB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZSwgdHlwZSBTdG9yYWdlSW5wdXQsIHRvU3RvcmFnZSB9IGZyb20gXCIuLi9zdG9yYWdlL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGt2U3RvcmFnZUZhbGxiYWNrIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYmluZGluZ3Mva3ZcIjtcbmltcG9ydCB7IGxvY2FsU3RvcmFnZSB9IGZyb20gXCIuLi9zdG9yYWdlL2VudHJ5XCI7XG5pbXBvcnQgeyBzaG91bGRGYWxsYmFja1RvS1YyIH0gZnJvbSBcIi4uL3N0b3JhZ2Uvc2hvdWxkLWZhbGxiYWNrLWt2MlwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgYnVpbHRJblRvb2xzIH0gZnJvbSBcIi4uL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEFnZW50RGF0YVR5cGVzLFxuICB0eXBlIEFnZW50SG9va3MsXG4gIGdldEFnZW50LFxuICB0eXBlIE5lZWRzQXBwcm92YWxNYXAsXG4gIHJlZ2lzdGVyQWdlbnQsXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSZXNvbHZhYmxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlQXJnczxcbiAgVENvbnRleHQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldCxcbj4gPSB7XG4gIGNvbnRleHQ6IFRDb250ZXh0O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBtZXNzYWdlczogVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VG9vbHM+PltdO1xufTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2YWJsZTxcbiAgVCxcbiAgVENvbnRleHQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldCxcbj4gPSBUIHwgKChhcmdzOiBSZXNvbHZhYmxlQXJnczxUQ29udGV4dCwgVG9vbHM+KSA9PiBUIHwgUHJvbWlzZTxUPik7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTZXNzaW9uIERlZmF1bHRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBTZXNzaW9uRGVmYXVsdHM8XG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4gPSB7XG4gIG1vZGVsPzogUmVzb2x2YWJsZTxHYXRld2F5TW9kZWxJZCB8IHVuZGVmaW5lZCwgVENvbnRleHQsIFRvb2xzPjtcbiAgc3lzdGVtPzogUmVzb2x2YWJsZTxzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgVENvbnRleHQsIFRvb2xzPjtcbiAgZ2VuZXJhdGlvbj86IFJlc29sdmFibGU8R2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQsIFRDb250ZXh0LCBUb29scz47XG4gIGFjdGl2ZVRvb2xzPzogUmVzb2x2YWJsZTxcbiAgICByZWFkb25seSAoRXh0cmFjdDxrZXlvZiBUb29scywgc3RyaW5nPiB8IEJ1aWx0SW5Ub29sTmFtZSlbXSB8IHVuZGVmaW5lZCxcbiAgICBUQ29udGV4dCxcbiAgICBUb29sc1xuICA+O1xuICBza2lsbHM/OiBSZXNvbHZhYmxlPFNraWxsSW5wdXRbXSB8IHVuZGVmaW5lZCwgVENvbnRleHQsIFRvb2xzPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBPcHRpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBBZ2VudE9wdGlvbnM8XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogZGVmYXVsdCBhbGxvd3MgdHlwZS1lcmFzZWQgdXNhZ2VcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gYW55LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+ID0gU2Vzc2lvbkRlZmF1bHRzPFRvb2xzLCBUQ29udGV4dD4gJiB7XG4gIHN0b3JhZ2U/OiBTdG9yYWdlSW5wdXQ7XG4gIHNhbmRib3g/OiBUU2FuZGJveEJpbmRpbmdzO1xuICB0b29scz86IFRvb2xzO1xuICBob29rcz86IEFnZW50SG9va3M7XG4gIG5lZWRzQXBwcm92YWw/OiBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPjtcbiAgY29udGV4dFNjaGVtYT86IHouWm9kVHlwZTxUQ29udGV4dD47XG4gIGxvZ2dpbmc/OiBPbWl0PExvZ2dpbmdDb25maWcsIFwibmFtZVwiPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbnRlcm5hbCBjb250ZXh0IGNhY2hlcyAoaGlkZGVuIGZyb20gcHVibGljIEFQSSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IHNlc3Npb25Db250ZXh0c01hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgU2Vzc2lvbkNvbnRleHQ+PigpO1xuY29uc3Qgc2FuZGJveENvbnRleHRzTWFwID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBTYW5kYm94Q29udGV4dD4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uQ29udGV4dHMoXG4gIGFnZW50OiBBbnlBZ2VudFxuKTogTWFwPHN0cmluZywgU2Vzc2lvbkNvbnRleHQ+IHtcbiAgbGV0IG1hcCA9IHNlc3Npb25Db250ZXh0c01hcC5nZXQoYWdlbnQpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBzZXNzaW9uQ29udGV4dHNNYXAuc2V0KGFnZW50LCBtYXApO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW5kYm94Q29udGV4dHMoXG4gIGFnZW50OiBBbnlBZ2VudFxuKTogTWFwPHN0cmluZywgU2FuZGJveENvbnRleHQ+IHtcbiAgbGV0IG1hcCA9IHNhbmRib3hDb250ZXh0c01hcC5nZXQoYWdlbnQpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBzYW5kYm94Q29udGV4dHNNYXAuc2V0KGFnZW50LCBtYXApO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZ2VudCBDbGFzcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBpbnRlbnRpb25hbGx5IGVyYXNlZCBcdTIwMTMgdXNpbmcgYGFueWAgYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyB3aXRoIHRvb2wtdHlwZWQgbWV0aG9kcyBsaWtlIGBzZW5kYFxuZXhwb3J0IHR5cGUgQW55QWdlbnQgPSBBZ2VudDxhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgdHlwZSBJbmZlclNlc3Npb248QWdlbnQgZXh0ZW5kcyBBbnlBZ2VudCA9IEFueUFnZW50PiA9IFJldHVyblR5cGU8XG4gIEFnZW50W1wic2Vzc2lvblwiXVxuPjtcbmV4cG9ydCB0eXBlIFNlc3Npb25TZW5kQXJnczxcbiAgQWdlbnQgZXh0ZW5kcyBBbnlBZ2VudCxcbiAgU2Vzc2lvbiBleHRlbmRzIEluZmVyU2Vzc2lvbjxBZ2VudD4gPSBJbmZlclNlc3Npb248QWdlbnQ+LFxuPiA9IFBhcmFtZXRlcnM8U2Vzc2lvbltcInNlbmRcIl0+O1xuXG5leHBvcnQgY2xhc3MgQWdlbnQ8XG4gIFRNZXNzYWdlTWV0YWRhdGEgPSB1bmtub3duLFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQgPSBUb29sU2V0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4gIFRDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBvcHRpb25zOiBBZ2VudE9wdGlvbnM8VG9vbHMsIFRTYW5kYm94QmluZGluZ3MsIFRDb250ZXh0PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEFnZW50T3B0aW9uczxUb29scywgVFNhbmRib3hCaW5kaW5ncywgVENvbnRleHQ+XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLnNlc3Npb24gPSAoc2Vzc2lvbkhhbmRsZTxUb29scywgVENvbnRleHQsIFRTYW5kYm94QmluZGluZ3M+KS5iaW5kKFxuICAgICAgbnVsbCxcbiAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBBbnlBZ2VudFxuICAgICk7XG4gICAgdGhpcy5zYW5kYm94ID0gKHNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4pLmJpbmQoXG4gICAgICBudWxsLFxuICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEFueUFnZW50XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogQW55QWdlbnQpIHtcbiAgICByZXR1cm4geyBuYW1lOiBpbnN0YW5jZS5uYW1lIH07XG4gIH1cblxuICBzdGF0aWMgW1dPUktGTE9XX0RFU0VSSUFMSVpFXShkYXRhOiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldEFnZW50KGRhdGEubmFtZSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlZFN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZSB7XG4gICAgaWYgKHRoaXMuX3Jlc29sdmVkU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkU3RvcmFnZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVkU3RvcmFnZSA9IHRvU3RvcmFnZSh0aGlzLm9wdGlvbnMuc3RvcmFnZSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWRTdG9yYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgICBjb25maWc6IHsgLi4udGhpcy5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IHRoaXMubmFtZSB9LFxuICAgICAgc3Vic3lzdGVtOiBcInN0b3JhZ2VcIixcbiAgICB9KTtcblxuICAgIGlmIChzaG91bGRGYWxsYmFja1RvS1YyKCkpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgTm8gc3RvcmFnZSBhZGFwdGVyIGNvbmZpZ3VyZWQgXHUyMDE0IHVzaW5nIEtWMiAobmFtZXNwYWNlOiBcIiR7dGhpcy5uYW1lfVwiKS5gXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVzb2x2ZWRTdG9yYWdlID0gdG9TdG9yYWdlKFxuICAgICAgICBrdlN0b3JhZ2VGYWxsYmFjayh7IHByZWZpeDogdGhpcy5uYW1lIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkU3RvcmFnZTtcbiAgICB9XG5cbiAgICBsb2cud2FybihcbiAgICAgIFwiTm8gc3RvcmFnZSBhZGFwdGVyIGNvbmZpZ3VyZWQgXHUyMDE0IHVzaW5nIGxvY2FsU3RvcmFnZSgpLiBEYXRhIHdpbGwgbm90IHBlcnNpc3QgYWNyb3NzIHJlc3RhcnRzLlwiXG4gICAgKTtcbiAgICB0aGlzLl9yZXNvbHZlZFN0b3JhZ2UgPSB0b1N0b3JhZ2UobG9jYWxTdG9yYWdlKCkpO1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZFN0b3JhZ2U7XG4gIH1cblxuICBnZXQgdG9vbHMoKSB7XG4gICAgcmV0dXJuIHsgLi4uYnVpbHRJblRvb2xzLCAuLi50aGlzLm9wdGlvbnMudG9vbHMgfSBhcyB0eXBlb2YgYnVpbHRJblRvb2xzICZcbiAgICAgIFRvb2xzO1xuICB9XG5cbiAgZ2V0IGhvb2tzKCk6IEFnZW50SG9va3Mge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaG9va3MgPz8ge307XG4gIH1cblxuICByZWFkb25seSBzZXNzaW9uO1xuXG4gIHJlYWRvbmx5IHNhbmRib3g7XG5cbiAgLyoqIFBoYW50b20gcHJvcGVydHkgZm9yIHR5cGUgaW5mZXJlbmNlLiBVc2UgYHR5cGVvZiBteUFnZW50LiRVSU1lc3NhZ2VgIHRvIGdldCB0aGUgdHlwZWQgVUlNZXNzYWdlLiAqL1xuICBkZWNsYXJlIHJlYWRvbmx5ICRVSU1lc3NhZ2U6IFVJTWVzc2FnZTxcbiAgICBUTWVzc2FnZU1ldGFkYXRhLFxuICAgIEFnZW50RGF0YVR5cGVzLFxuICAgIEluZmVyVUlUb29sczx0eXBlb2YgYnVpbHRJblRvb2xzICYgVG9vbHM+XG4gID47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZ2VudDxcbiAgVE1lc3NhZ2VNZXRhZGF0YSA9IHVua25vd24sXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10gPSBTYW5kYm94QmluZGluZyxcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4obmFtZTogc3RyaW5nLCBvcHRpb25zPzogQWdlbnRPcHRpb25zPFRvb2xzLCBUU2FuZGJveEJpbmRpbmdzLCBUQ29udGV4dD4pIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWdlbnQ8XG4gICAgVE1lc3NhZ2VNZXRhZGF0YSxcbiAgICBUb29scyxcbiAgICBUU2FuZGJveEJpbmRpbmdzLFxuICAgIFRDb250ZXh0XG4gID4obmFtZSwgb3B0aW9ucyk7XG4gIHJlZ2lzdGVyQWdlbnQobmFtZSwgaW5zdGFuY2UpO1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIFJlLWV4cG9ydCBldmVyeXRoaW5nIGZyb20gcmVnaXN0cnkgc28gZXhpc3RpbmcgaW1wb3J0cyBmcm9tIFwiLi9hZ2VudC9jbGllbnRcIiBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICB0eXBlIEFnZW50RGF0YVR5cGVzLFxuICB0eXBlIEFnZW50SG9va3MsXG4gIEFnZW50U3RhdHVzLFxuICBnZXRBZ2VudCxcbiAgdHlwZSBJbmZlclVJTWVzc2FnZSxcbiAgdHlwZSBOZWVkc0FwcHJvdmFsTWFwLFxuICByZWdpc3RlckFnZW50LFxuICB0eXBlIFR5cGVkVUlNZXNzYWdlLFxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuIiwgImltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB7IGdldFNhbmRib3hDb250ZXh0cyB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEJpbmRpbmcsIFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiLi9leGVjXCI7XG5pbXBvcnQgeyBnZXREb21haW4gfSBmcm9tIFwiLi9nZXQtZG9tYWluXCI7XG5pbXBvcnQgeyBnZXRTdGF0dXMgfSBmcm9tIFwiLi9nZXQtc3RhdHVzXCI7XG5pbXBvcnQgeyBraWxsIH0gZnJvbSBcIi4va2lsbFwiO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwiLi9yZWFkLWZpbGVcIjtcbmltcG9ydCB7IHNldHVwIH0gZnJvbSBcIi4vc2V0dXBcIjtcbmltcG9ydCB7IHNuYXBzaG90IH0gZnJvbSBcIi4vc25hcHNob3RcIjtcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIi4vc3RhcnRcIjtcbmltcG9ydCB7IHN0b3AgfSBmcm9tIFwiLi9zdG9wXCI7XG5pbXBvcnQgeyB1cGRhdGVOZXR3b3JrUG9saWN5IH0gZnJvbSBcIi4vdXBkYXRlLW5ldHdvcmstcG9saWN5XCI7XG5pbXBvcnQgeyB3cml0ZUZpbGVzIH0gZnJvbSBcIi4vd3JpdGUtZmlsZXNcIjtcblxuZXhwb3J0IHR5cGUgU2FuZGJveENvbnRleHQgPSB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIF9wZW5kaW5nU2V0dXA/OiBQcm9taXNlPFNhbmRib3hJbnN0YW5jZT47XG4gIF9jd2Q/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTYW5kYm94T3B0aW9ucyA9IHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4+ID0gUmV0dXJuVHlwZTx0eXBlb2Ygc2FuZGJveEhhbmRsZTxUU2FuZGJveEJpbmRpbmdzPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdLFxuPihhZ2VudDogQW55QWdlbnQsIGlkPzogc3RyaW5nIHwgU2FuZGJveE9wdGlvbnMpIHtcbiAgY29uc3Qgc2FuZGJveElkID1cbiAgICB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IChpZD8uaWQgPz8gYHNhbmRib3hfJHt1bGlkKCl9YCk7XG5cbiAgY29uc3QgY29udGV4dHMgPSBnZXRTYW5kYm94Q29udGV4dHMoYWdlbnQpO1xuICBsZXQgc2FuZGJveENvbnRleHQgPSBjb250ZXh0cy5nZXQoc2FuZGJveElkKTtcbiAgaWYgKCFzYW5kYm94Q29udGV4dCkge1xuICAgIHNhbmRib3hDb250ZXh0ID0geyBhZ2VudCwgc2FuZGJveElkIH07XG4gICAgY29udGV4dHMuc2V0KHNhbmRib3hJZCwgc2FuZGJveENvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogc2FuZGJveElkLFxuICAgIGdldCBjd2QoKSB7XG4gICAgICByZXR1cm4gc2FuZGJveENvbnRleHQhLl9jd2QgPz8gXCIuXCI7XG4gICAgfSxcbiAgICBzZXR1cDogKHNldHVwPFRTYW5kYm94QmluZGluZ3M+KS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBleGVjOiBleGVjLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHJlYWRGaWxlOiByZWFkRmlsZS5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICB3cml0ZUZpbGVzOiB3cml0ZUZpbGVzLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIGdldERvbWFpbjogZ2V0RG9tYWluLmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IHVwZGF0ZU5ldHdvcmtQb2xpY3kuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgc3RhcnQ6IHN0YXJ0LmJpbmQobnVsbCwgc2FuZGJveENvbnRleHQpLFxuICAgIHN0b3A6IHN0b3AuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAga2lsbDoga2lsbC5iaW5kKG51bGwsIHNhbmRib3hDb250ZXh0KSxcbiAgICBzbmFwc2hvdDogc25hcHNob3QuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gICAgZ2V0U3RhdHVzOiBnZXRTdGF0dXMuYmluZChudWxsLCBzYW5kYm94Q29udGV4dCksXG4gIH07XG59XG5cbnR5cGUgU2FuZGJveE1ldGhvZHM8XG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10sXG4+ID0gT21pdDxTYW5kYm94SGFuZGxlPFRTYW5kYm94QmluZGluZ3M+LCBcImlkXCIgfCBcImN3ZFwiPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxhenlTYW5kYm94SGFuZGxlPFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdLFxuPihcbiAgYWdlbnQ6IEFueUFnZW50LFxuICBnZXRJZDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+XG4pOiBTYW5kYm94TWV0aG9kczxUU2FuZGJveEJpbmRpbmdzPiB7XG4gIGNvbnN0IGdldEhhbmRsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpZCA9IGF3YWl0IGdldElkKCk7XG4gICAgcmV0dXJuIHNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4oYWdlbnQsIGlkKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNldHVwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGguc2V0dXAoLi4uYXJncyk7XG4gICAgfSxcbiAgICBleGVjOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGguZXhlYyguLi5hcmdzKTtcbiAgICB9LFxuICAgIHJlYWRGaWxlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGgucmVhZEZpbGUoLi4uYXJncyk7XG4gICAgfSxcbiAgICB3cml0ZUZpbGVzOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGgud3JpdGVGaWxlcyguLi5hcmdzKTtcbiAgICB9LFxuICAgIGdldERvbWFpbjogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGggPSBhd2FpdCBnZXRIYW5kbGUoKTtcbiAgICAgIHJldHVybiBoLmdldERvbWFpbiguLi5hcmdzKTtcbiAgICB9LFxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBoID0gYXdhaXQgZ2V0SGFuZGxlKCk7XG4gICAgICByZXR1cm4gaC51cGRhdGVOZXR3b3JrUG9saWN5KC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgc3RhcnQ6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBoID0gYXdhaXQgZ2V0SGFuZGxlKCk7XG4gICAgICByZXR1cm4gaC5zdGFydCguLi5hcmdzKTtcbiAgICB9LFxuICAgIHN0b3A6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBoID0gYXdhaXQgZ2V0SGFuZGxlKCk7XG4gICAgICByZXR1cm4gaC5zdG9wKC4uLmFyZ3MpO1xuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGggPSBhd2FpdCBnZXRIYW5kbGUoKTtcbiAgICAgIHJldHVybiBoLmtpbGwoLi4uYXJncyk7XG4gICAgfSxcbiAgICBzbmFwc2hvdDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IGggPSBhd2FpdCBnZXRIYW5kbGUoKTtcbiAgICAgIHJldHVybiBoLnNuYXBzaG90KC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgZ2V0U3RhdHVzOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgaCA9IGF3YWl0IGdldEhhbmRsZSgpO1xuICAgICAgcmV0dXJuIGguZ2V0U3RhdHVzKC4uLmFyZ3MpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmVyY2VsID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZ2V0VmVyY2VsT2lkY1Rva2VuIH0gPSBhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL29pZGNcIik7XG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgZ2V0VmVyY2VsT2lkY1Rva2VuKCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTZXNzaW9uTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbkVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2Vzc2lvbiAkaWQgZmFpbGVkOiAkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU2FuZGJveE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU2FuZGJveCAkaWQgbm90IGZvdW5kXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlRXJyb3JcIixcbiAgbWVzc2FnZTogXCIkcmVhc29uXCIsXG59KSB7fVxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0b3JhZ2VDb25mbGljdEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgeyBpc1ZlcmNlbCB9IGZyb20gXCIuLi9hZ2VudC9pcy12ZXJjZWxcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciwgU2FuZGJveE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3ggfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBTYW5kYm94QmluZGluZyxcbiAgU2FuZGJveEluc3RhbmNlLFxuICBTYW5kYm94U2V0dXBGaWVsZHMsXG4gIFdpdGhDb25maWcsXG59IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJbkJpbmRpbmdzIH0gZnJvbSBcIi4vYmluZGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcblxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDUwO1xuY29uc3QgUE9MTF9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxudHlwZSBTZXR1cENvbW1vbkZpZWxkcyA9IFBhcnRpYWw8U2FuZGJveFNldHVwRmllbGRzPiAmIHtcbiAgY3dkPzogc3RyaW5nO1xuICBydW4/OiAoc2FuZGJveDogU2FuZGJveEluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn07XG5cbnR5cGUgVG9CaW5kaW5nVW5pb248VCBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXT4gPVxuICBUIGV4dGVuZHMgU2FuZGJveEJpbmRpbmdbXSA/IFRbbnVtYmVyXSA6IFQ7XG5cbnR5cGUgU2V0dXBPcHRzRm9yQmluZGluZzxCIGV4dGVuZHMgU2FuZGJveEJpbmRpbmc+ID1cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiAuXG4gIEIgZXh0ZW5kcyBTYW5kYm94QmluZGluZzxpbmZlciBULCBpbmZlciBDLCBhbnk+XG4gICAgPyB7IHR5cGU6IFQgfSAmIFNldHVwQ29tbW9uRmllbGRzICYgV2l0aENvbmZpZzxDPlxuICAgIDogbmV2ZXI7XG5cbnR5cGUgSXNEZWZhdWx0PFQgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10+ID1cbiAgU2FuZGJveEJpbmRpbmcgZXh0ZW5kcyBUID8gdHJ1ZSA6IGZhbHNlO1xuXG5leHBvcnQgdHlwZSBTZXR1cE9wdHM8XG4gIFRTYW5kYm94QmluZGluZ3MgZXh0ZW5kcyBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW10sXG4+ID1cbiAgfCBTZXR1cE9wdHNGb3JCaW5kaW5nPFxuICAgICAgSXNEZWZhdWx0PFRTYW5kYm94QmluZGluZ3M+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICA/IEJ1aWx0SW5CaW5kaW5nc1xuICAgICAgICA6IFRvQmluZGluZ1VuaW9uPFRTYW5kYm94QmluZGluZ3M+XG4gICAgPlxuICB8IChTZXR1cENvbW1vbkZpZWxkcyAmIHsgdHlwZT86IG5ldmVyIH0pO1xuXG5leHBvcnQgdHlwZSBTZXR1cFJlc3VsdCA9IHtcbiAgZG9uZTogUHJvbWlzZTxTYW5kYm94SW5zdGFuY2U+O1xufTtcblxuZnVuY3Rpb24gaXNTaW5nbGVCaW5kaW5nKFxuICBzYW5kYm94OiBTYW5kYm94QmluZGluZyB8IFNhbmRib3hCaW5kaW5nW11cbik6IHNhbmRib3ggaXMgU2FuZGJveEJpbmRpbmcge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXkoc2FuZGJveCk7XG59XG5cbi8qKiBBdXRvLWRldGVjdCB0aGUgZGVmYXVsdCBiaW5kaW5nOiB2ZXJjZWwgXHUyMTkyIGRvY2tlciBcdTIxOTIgbG9jYWwgY2FzY2FkZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldERlZmF1bHRCaW5kaW5nKCk6IFByb21pc2U8U2FuZGJveEJpbmRpbmc+IHtcbiAgaWYgKGF3YWl0IGlzVmVyY2VsKCkpIHtcbiAgICBjb25zdCB7IHZlcmNlbFNhbmRib3ggfSA9IGF3YWl0IGltcG9ydChcIi4vYmluZGluZ3MvdmVyY2VsXCIpO1xuICAgIHJldHVybiB2ZXJjZWxTYW5kYm94KCk7XG4gIH1cblxuICBpZiAoYXdhaXQgaXNEb2NrZXJBdmFpbGFibGUoKSkge1xuICAgIGNvbnN0IHsgZG9ja2VyU2FuZGJveCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9iaW5kaW5ncy9kb2NrZXJcIik7XG4gICAgcmV0dXJuIGRvY2tlclNhbmRib3goKTtcbiAgfVxuXG4gIGNvbnN0IHsgbG9jYWxTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL2JpbmRpbmdzL2xvY2FsXCIpO1xuICByZXR1cm4gbG9jYWxTYW5kYm94KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRG9ja2VyQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZXhlY1N5bmMgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBleGVjU3luYyhcImRvY2tlciBzYW5kYm94IC0taGVscFwiLCB7IHN0ZGlvOiBcImlnbm9yZVwiLCB0aW1lb3V0OiA1MDAwIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmcoXG4gIHNhbmRib3g6IFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSB8IHVuZGVmaW5lZCxcbiAgdHlwZT86IHN0cmluZ1xuKTogUHJvbWlzZTx7IGJpbmRpbmc6IFNhbmRib3hCaW5kaW5nOyBiaW5kaW5nTmFtZTogc3RyaW5nIH0+IHtcbiAgaWYgKCFzYW5kYm94KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGF3YWl0IGdldERlZmF1bHRCaW5kaW5nKCk7XG4gICAgcmV0dXJuIHsgYmluZGluZywgYmluZGluZ05hbWU6IGJpbmRpbmcudHlwZSB9O1xuICB9XG4gIGlmIChpc1NpbmdsZUJpbmRpbmcoc2FuZGJveCkpIHtcbiAgICByZXR1cm4geyBiaW5kaW5nOiBzYW5kYm94LCBiaW5kaW5nTmFtZTogc2FuZGJveC50eXBlIH07XG4gIH1cbiAgaWYgKHR5cGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHNhbmRib3guZmluZCgoYikgPT4gYi50eXBlID09PSB0eXBlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgcmVhc29uOiBgVW5rbm93biBiaW5kaW5nIHR5cGU6IFwiJHt0eXBlfVwiLiBBdmFpbGFibGU6ICR7c2FuZGJveC5tYXAoKGIpID0+IGIudHlwZSkuam9pbihcIiwgXCIpfWAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYmluZGluZzogbWF0Y2gsIGJpbmRpbmdOYW1lOiBtYXRjaC50eXBlIH07XG4gIH1cbiAgaWYgKHNhbmRib3gubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogXCJObyBzYW5kYm94IGJpbmRpbmdzIGNvbmZpZ3VyZWRcIiB9KTtcbiAgfVxuICByZXR1cm4geyBiaW5kaW5nOiBzYW5kYm94WzBdLCBiaW5kaW5nTmFtZTogc2FuZGJveFswXS50eXBlIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cDxcbiAgVFNhbmRib3hCaW5kaW5ncyBleHRlbmRzIFNhbmRib3hCaW5kaW5nIHwgU2FuZGJveEJpbmRpbmdbXSxcbj4oXG4gIGN0eDogU2FuZGJveENvbnRleHQsXG4gIG9wdHM/OiBTZXR1cE9wdHM8VFNhbmRib3hCaW5kaW5ncz5cbik6IFByb21pc2U8U2V0dXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBpZiAoY3R4Ll9wZW5kaW5nU2V0dXApIHtcbiAgICByZXR1cm4geyBkb25lOiBjdHguX3BlbmRpbmdTZXR1cCB9O1xuICB9XG5cbiAgY29uc3QgYWdlbnQgPSBjdHguYWdlbnQ7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7IC4uLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJzYW5kYm94OnNldHVwXCIsXG4gICAgY29udGV4dDogeyBzYW5kYm94SWQ6IGN0eC5zYW5kYm94SWQgfSxcbiAgfSk7XG5cbiAgY29uc3QgZG9uZVJlc29sdmVCaW5kaW5nID0gbG9nLnRpbWUoXCJyZXNvbHZlIGJpbmRpbmdcIiwge1xuICAgIHJlcXVlc3RlZFR5cGU6IG9wdHM/LnR5cGUsXG4gIH0pO1xuICBjb25zdCB7IGJpbmRpbmcsIGJpbmRpbmdOYW1lIH0gPSBhd2FpdCByZXNvbHZlQmluZGluZyhcbiAgICBhZ2VudC5vcHRpb25zLnNhbmRib3gsXG4gICAgb3B0cz8udHlwZVxuICApO1xuICBkb25lUmVzb2x2ZUJpbmRpbmcoKTtcblxuICBpZiAob3B0cz8uY3dkKSB7XG4gICAgY3R4Ll9jd2QgPSBvcHRzLmN3ZDtcbiAgfVxuXG4gIGNvbnN0IHNldHVwTG9nID0gbG9nLndpdGhDb250ZXh0KHtcbiAgICBiaW5kaW5nOiBiaW5kaW5nTmFtZSxcbiAgICB2ZXJzaW9uOiBvcHRzPy52ZXJzaW9uID8/IGJpbmRpbmcuZGVmYXVsdHM/LnZlcnNpb24sXG4gIH0pO1xuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Db25mdXNpbmdWb2lkVHlwZTogLlxuICBsZXQgcmVzb2x2ZUJsb2NraW5nUHJvbWlzZSA9ICh2YWx1ZTogdm9pZCkgPT4gdmFsdWU7XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogLlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlCbG9ja1N0YXRlbWVudHM6IC5cbiAgbGV0IHJlamVjdEJsb2NraW5nUHJvbWlzZSA9IChfcmVhc29uPzogYW55KSA9PiB7fTtcbiAgY29uc3QgYmxvY2tpbmdQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UgPSByZXNvbHZlO1xuICAgIHJlamVjdEJsb2NraW5nUHJvbWlzZSA9IHJlamVjdDtcbiAgfSk7XG5cbiAgY3R4Ll9wZW5kaW5nU2V0dXAgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBzbGVlcE9sZEluc3RhbmNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRvbmVQZW5kaW5nU2V0dXAgPSBzZXR1cExvZy50aW1lKFwicGVuZGluZyBzZXR1cFwiKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb25lU3RvcmFnZUdldCA9IHNldHVwTG9nLnRpbWUoXCJzdG9yYWdlLnNhbmRib3guZ2V0XCIpO1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LmdldChjdHguc2FuZGJveElkKTtcbiAgICAgIGRvbmVTdG9yYWdlR2V0KCk7XG5cbiAgICAgIGNvbnN0IGJpbmRpbmdEZWZhdWx0cyA9IGJpbmRpbmcuZGVmYXVsdHMgPz8ge307XG4gICAgICBjb25zdCBlZmZlY3RpdmVWZXJzaW9uID0gb3B0cz8udmVyc2lvbiA/PyBiaW5kaW5nRGVmYXVsdHMudmVyc2lvbiA/PyBudWxsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlUnVuID0gb3B0cz8ucnVuID8/IGJpbmRpbmdEZWZhdWx0cy5ydW47XG4gICAgICBjb25zdCBlZmZlY3RpdmVOZXR3b3JrUG9saWN5ID1cbiAgICAgICAgb3B0cz8ubmV0d29ya1BvbGljeSA/PyBiaW5kaW5nRGVmYXVsdHMubmV0d29ya1BvbGljeSA/PyBudWxsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlQ29uZmlnID0ge1xuICAgICAgICAuLi5iaW5kaW5nRGVmYXVsdHMuY29uZmlnLFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG9wdHMgaXMgYSB1bmlvbjsgY29uZmlnIGV4aXN0cyBvbiBiaW5kaW5nLXNwZWNpZmljIGJyYW5jaGVzXG4gICAgICAgIC4uLihvcHRzIGFzIGFueSk/LmNvbmZpZyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoZXMgPVxuICAgICAgICAgICFlZmZlY3RpdmVWZXJzaW9uIHx8IHJlY29yZC5zZXR1cD8udmVyc2lvbiA9PT0gZWZmZWN0aXZlVmVyc2lvbjtcblxuICAgICAgICBpZiAodmVyc2lvbk1hdGNoZXMgJiYgcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcbiAgICAgICAgICBjb25zdCBkb25lQ29ubmVjdEV4aXN0aW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwiY29ubmVjdCBleGlzdGluZyBzYW5kYm94XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNldHVwU3RhdGU6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiByZWNvcmQuc2V0dXAubWV0YWRhdGEsXG4gICAgICAgICAgICBzaWduYWw6IG9wdHM/LnNpZ25hbCxcbiAgICAgICAgICAgIGxvZzogc2V0dXBMb2csXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZG9uZUNvbm5lY3RFeGlzdGluZygpO1xuICAgICAgICAgIGN0eC5fY3dkID0gaW5zdGFuY2UuY3dkO1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZXJzaW9uTWF0Y2hlcyAmJiAhcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgICAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcbiAgICAgICAgICBjb25zdCBkb25lUG9sbFVudGlsUmVhZHkgPSBzZXR1cExvZy50aW1lKFwicG9sbCB1bnRpbCByZWFkeVwiKTtcbiAgICAgICAgICBhd2FpdCBwb2xsVW50aWxSZWFkeShjdHgsIG9wdHM/LnNpZ25hbCk7XG4gICAgICAgICAgZG9uZVBvbGxVbnRpbFJlYWR5KCk7XG5cbiAgICAgICAgICBjb25zdCBkb25lU3RvcmFnZUdldFBvc3RQb2xsID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgICAgIFwic3RvcmFnZS5zYW5kYm94LmdldCAocG9zdC1wb2xsKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZWFkeSA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gICAgICAgICAgZG9uZVN0b3JhZ2VHZXRQb3N0UG9sbCgpO1xuXG4gICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGN0eC5zYW5kYm94SWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRvbmVDb25uZWN0RXhpc3RpbmcgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICAgICAgXCJjb25uZWN0IGV4aXN0aW5nIHNhbmRib3hcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc2V0dXBTdGF0ZTogXCJwb3N0LXBvbGxcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgYmluZGluZy5jb25uZWN0KHtcbiAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlYWR5LnNldHVwLm1ldGFkYXRhLFxuICAgICAgICAgICAgc2lnbmFsOiBvcHRzPy5zaWduYWwsXG4gICAgICAgICAgICBsb2c6IHNldHVwTG9nLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRvbmVDb25uZWN0RXhpc3RpbmcoKTtcbiAgICAgICAgICBjdHguX2N3ZCA9IGluc3RhbmNlLmN3ZDtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVjb3JkLnNldHVwLm1ldGFkYXRhKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSW5zdGFuY2VNZXRhZGF0YSA9IHJlY29yZC5zZXR1cC5tZXRhZGF0YTtcbiAgICAgICAgICBzbGVlcE9sZEluc3RhbmNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVTdG9wT2xkSW5zdGFuY2UgPSBzZXR1cExvZy50aW1lKFxuICAgICAgICAgICAgICBcInN0b3Agb2xkIHNhbmRib3ggaW5zdGFuY2VcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9sZCA9IGF3YWl0IGJpbmRpbmcuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG9sZEluc3RhbmNlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbG9nOiBzZXR1cExvZyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGF3YWl0IG9sZC5zdG9wKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgZG9uZVN0b3BPbGRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lU3RvcE9sZEluc3RhbmNlKCk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc2V0dXBfOiBTYW5kYm94W1wic2V0dXBcIl0gPSB7XG4gICAgICAgIGJpbmRpbmc6IGJpbmRpbmdOYW1lLFxuICAgICAgICB2ZXJzaW9uOiBlZmZlY3RpdmVWZXJzaW9uID8/IHJlY29yZD8uc2V0dXA/LnZlcnNpb24gPz8gbnVsbCxcbiAgICAgICAgbmV0d29ya1BvbGljeTpcbiAgICAgICAgICBlZmZlY3RpdmVOZXR3b3JrUG9saWN5ID8/IHJlY29yZD8uc2V0dXA/Lm5ldHdvcmtQb2xpY3kgPz8gbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmV3UmVjb3JkOiBTYW5kYm94ID0ge1xuICAgICAgICBpZDogY3R4LnNhbmRib3hJZCxcbiAgICAgICAgc2V0dXA6IHNldHVwXyxcbiAgICAgICAgY3JlYXRlZEF0OiByZWNvcmQ/LmNyZWF0ZWRBdCA/PyBub3csXG4gICAgICAgIGxhc3RBY3RpdmVBdDogbm93LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZG9uZVN0b3JhZ2VTZXRQZW5kaW5nID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgXCJzdG9yYWdlLnNhbmRib3guc2V0IChzZXR1cCBwZW5kaW5nKVwiXG4gICAgICApO1xuICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LnNldChjdHguc2FuZGJveElkLCBuZXdSZWNvcmQpO1xuICAgICAgZG9uZVN0b3JhZ2VTZXRQZW5kaW5nKCk7XG5cbiAgICAgIHJlc29sdmVCbG9ja2luZ1Byb21pc2UoKTtcblxuICAgICAgY29uc3QgZG9uZUJpbmRpbmdDcmVhdGUgPSBzZXR1cExvZy50aW1lKFwiYmluZGluZy5jcmVhdGVcIik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiaW5kaW5nLmNyZWF0ZSh7XG4gICAgICAgIGN3ZDogY3R4Ll9jd2QgPz8gXCIuXCIsXG4gICAgICAgIGFnZW50LFxuICAgICAgICBzZXR1cDoge1xuICAgICAgICAgIC4uLnNldHVwXyxcbiAgICAgICAgICBydW46IGVmZmVjdGl2ZVJ1bixcbiAgICAgICAgICBjb25maWc6IGVmZmVjdGl2ZUNvbmZpZyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb3JkOiBuZXdSZWNvcmQsXG4gICAgICAgIHNpZ25hbDogb3B0cz8uc2lnbmFsLFxuICAgICAgICBsb2c6IHNldHVwTG9nLFxuICAgICAgfSk7XG4gICAgICBkb25lQmluZGluZ0NyZWF0ZSgpO1xuXG4gICAgICBzZXR1cF8uY29tcGxldGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgc2V0dXBfLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFkYXRhO1xuXG4gICAgICBjb25zdCBkb25lU3RvcmFnZVVwZGF0ZUNvbXBsZXRlID0gc2V0dXBMb2cudGltZShcbiAgICAgICAgXCJzdG9yYWdlLnNhbmRib3gudXBkYXRlIChzZXR1cCBjb21wbGV0ZSlcIlxuICAgICAgKTtcbiAgICAgIGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoY3R4LnNhbmRib3hJZCwge1xuICAgICAgICBzZXR1cDogc2V0dXBfLFxuICAgICAgICBsYXN0QWN0aXZlQXQ6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICAgIGRvbmVTdG9yYWdlVXBkYXRlQ29tcGxldGUoKTtcblxuICAgICAgY3R4Ll9jd2QgPSByZXN1bHQuaW5zdGFuY2UuY3dkO1xuICAgICAgcmV0dXJuIHJlc3VsdC5pbnN0YW5jZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGN0eC5fcGVuZGluZ1NldHVwID0gdW5kZWZpbmVkO1xuICAgICAgcmVqZWN0QmxvY2tpbmdQcm9taXNlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IGRvbmVGaW5hbGl6ZSA9IHNldHVwTG9nLnRpbWUoXCJmaW5hbGl6ZSBzZXR1cFwiKTtcbiAgICAgIGF3YWl0IHNsZWVwT2xkSW5zdGFuY2U7XG4gICAgICBkb25lRmluYWxpemUoKTtcbiAgICAgIGRvbmVQZW5kaW5nU2V0dXAoKTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgZG9uZVdhaXRGb3JVbmJsb2NrID0gc2V0dXBMb2cudGltZShcIndhaXQgZm9yIHNldHVwIHVuYmxvY2tcIik7XG4gIGF3YWl0IGJsb2NraW5nUHJvbWlzZTtcbiAgZG9uZVdhaXRGb3JVbmJsb2NrKCk7XG4gIHJldHVybiB7IGRvbmU6IGN0eC5fcGVuZGluZ1NldHVwIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlKFxuICBjdHg6IFNhbmRib3hDb250ZXh0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTxTYW5kYm94SW5zdGFuY2U+IHtcbiAgY29uc3QgYWdlbnQgPSBjdHguYWdlbnQ7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7IC4uLmFnZW50Lm9wdGlvbnMubG9nZ2luZywgbmFtZTogYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJzYW5kYm94OnJlc29sdmVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogY3R4LnNhbmRib3hJZCB9LFxuICB9KTtcblxuICBpZiAoY3R4Ll9wZW5kaW5nU2V0dXApIHtcbiAgICByZXR1cm4gYXdhaXQgY3R4Ll9wZW5kaW5nU2V0dXA7XG4gIH1cblxuICBsZXQgcmVjb3JkID0gYXdhaXQgYWdlbnQuc3RvcmFnZS5zYW5kYm94LmdldChjdHguc2FuZGJveElkKTtcblxuICBpZiAoIXJlY29yZCkge1xuICAgIGNvbnN0IHsgZG9uZSB9ID0gYXdhaXQgc2V0dXAoY3R4LCB7IHNpZ25hbCB9KTtcbiAgICByZXR1cm4gYXdhaXQgZG9uZTtcbiAgfVxuXG4gIGlmICghcmVjb3JkLnNldHVwPy5jb21wbGV0ZWRBdCkge1xuICAgIGF3YWl0IHBvbGxVbnRpbFJlYWR5KGN0eCwgc2lnbmFsKTtcbiAgICByZWNvcmQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnNhbmRib3guZ2V0KGN0eC5zYW5kYm94SWQpO1xuICB9XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICB0aHJvdyBuZXcgU2FuZGJveE5vdEZvdW5kRXJyb3IoeyBpZDogY3R4LnNhbmRib3hJZCB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgYmluZGluZyB9ID0gYXdhaXQgcmVzb2x2ZUJpbmRpbmcoXG4gICAgY3R4LmFnZW50Lm9wdGlvbnMuc2FuZGJveCxcbiAgICByZWNvcmQuc2V0dXAuYmluZGluZ1xuICApO1xuXG4gIGFnZW50LnN0b3JhZ2Uuc2FuZGJveFxuICAgIC51cGRhdGUoY3R4LnNhbmRib3hJZCwgeyBsYXN0QWN0aXZlQXQ6IERhdGUubm93KCkgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBsb2cuZXJyb3IoXCJGYWlsZWQgdG8gdXBkYXRlIHNhbmRib3ggbGFzdEFjdGl2ZUF0XCIsIHsgZXJyb3IgfSk7XG4gICAgfSk7XG5cbiAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBiaW5kaW5nLmNvbm5lY3Qoe1xuICAgIGFnZW50LFxuICAgIG1ldGFkYXRhOiByZWNvcmQuc2V0dXAubWV0YWRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGxvZyxcbiAgfSk7XG4gIGN0eC5fY3dkID0gaW5zdGFuY2UuY3dkO1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvbGxVbnRpbFJlYWR5KFxuICBjdHg6IFNhbmRib3hDb250ZXh0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFBPTExfVElNRU9VVF9NUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgY3R4LmFnZW50LnN0b3JhZ2Uuc2FuZGJveC5nZXQoY3R4LnNhbmRib3hJZCk7XG4gICAgaWYgKHJlY29yZD8uc2V0dXA/LmNvbXBsZXRlZEF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgUE9MTF9JTlRFUlZBTF9NUykpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7XG4gICAgcmVhc29uOiBgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNhbmRib3ggXCIke2N0eC5zYW5kYm94SWR9XCIgc2V0dXAgdG8gY29tcGxldGVgLFxuICB9KTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlYyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImV4ZWNcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5leGVjKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb21haW4oXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJnZXREb21haW5cIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5nZXREb21haW4oLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YXR1cyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImdldFN0YXR1c1wiXT5cbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LmdldFN0YXR1cyguLi5vcHRzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbChcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcImtpbGxcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5raWxsKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcInJlYWRGaWxlXCJdPlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYngucmVhZEZpbGUoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNuYXBzaG90KFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic25hcHNob3RcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC5zbmFwc2hvdCguLi5vcHRzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQoXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJzdGFydFwiXT5cbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnN0YXJ0KC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL3NldHVwXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wKFxuICBzYW5kYm94Q29udGV4dDogU2FuZGJveENvbnRleHQsXG4gIC4uLm9wdHM6IFBhcmFtZXRlcnM8U2FuZGJveEluc3RhbmNlW1wic3RvcFwiXT5cbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHNieCA9IGF3YWl0IHJlc29sdmUoc2FuZGJveENvbnRleHQpO1xuICByZXR1cm4gYXdhaXQgc2J4LnN0b3AoLi4ub3B0cyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vc2V0dXBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU5ldHdvcmtQb2xpY3koXG4gIHNhbmRib3hDb250ZXh0OiBTYW5kYm94Q29udGV4dCxcbiAgLi4ub3B0czogUGFyYW1ldGVyczxTYW5kYm94SW5zdGFuY2VbXCJ1cGRhdGVOZXR3b3JrUG9saWN5XCJdPlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgY29uc3Qgc2J4ID0gYXdhaXQgcmVzb2x2ZShzYW5kYm94Q29udGV4dCk7XG4gIHJldHVybiBhd2FpdCBzYngudXBkYXRlTmV0d29ya1BvbGljeSguLi5vcHRzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveENvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwiLi9zZXR1cFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlcyhcbiAgc2FuZGJveENvbnRleHQ6IFNhbmRib3hDb250ZXh0LFxuICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFNhbmRib3hJbnN0YW5jZVtcIndyaXRlRmlsZXNcIl0+XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBzYnggPSBhd2FpdCByZXNvbHZlKHNhbmRib3hDb250ZXh0KTtcbiAgcmV0dXJuIGF3YWl0IHNieC53cml0ZUZpbGVzKC4uLm9wdHMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50IH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHsgZ2V0U2Vzc2lvbkNvbnRleHRzIH0gZnJvbSBcIi4uL2FnZW50L2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94QmluZGluZyB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB7IGxhenlTYW5kYm94SGFuZGxlIH0gZnJvbSBcIi4uL3NhbmRib3gvaGFuZGxlXCI7XG5pbXBvcnQgeyBoaXN0b3J5IH0gZnJvbSBcIi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgaW50ZXJydXB0IH0gZnJvbSBcIi4vaW50ZXJydXB0XCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcIi4vc2VuZFwiO1xuaW1wb3J0IHsgc3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtXCI7XG5pbXBvcnQgeyB1cGRhdGUgfSBmcm9tIFwiLi91cGRhdGVcIjtcbmltcG9ydCB7IHVzYWdlIH0gZnJvbSBcIi4vdXNhZ2VcIjtcblxudHlwZSBTZXNzaW9uT3B0aW9ucyA9IHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZXNzaW9uQ29udGV4dCA9IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXNzaW9uSGFuZGxlPFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQsXG4gIFRDb250ZXh0LFxuICBUU2FuZGJveEJpbmRpbmdzIGV4dGVuZHMgU2FuZGJveEJpbmRpbmcgfCBTYW5kYm94QmluZGluZ1tdID0gU2FuZGJveEJpbmRpbmcsXG4+KGFnZW50OiBBbnlBZ2VudCwgaWQ/OiBzdHJpbmcgfCBTZXNzaW9uT3B0aW9ucykge1xuICBjb25zdCBzZXNzaW9uSWQgPVxuICAgIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogKGlkPy5pZCA/PyBgc2Vzc2lvbl8ke3VsaWQoKX1gKTtcblxuICBjb25zdCBjb250ZXh0cyA9IGdldFNlc3Npb25Db250ZXh0cyhhZ2VudCk7XG4gIGxldCBzZXNzaW9uQ29udGV4dCA9IGNvbnRleHRzLmdldChzZXNzaW9uSWQpO1xuICBpZiAoIXNlc3Npb25Db250ZXh0KSB7XG4gICAgc2Vzc2lvbkNvbnRleHQgPSB7IGFnZW50LCBzZXNzaW9uSWQgfTtcbiAgICBjb250ZXh0cy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgc2VuZDogKHNlbmQ8VG9vbHMsIFRDb250ZXh0PikuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgc3RyZWFtOiBzdHJlYW0uYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgaGlzdG9yeTogKGhpc3Rvcnk8VG9vbHM+KS5iaW5kKG51bGwsIHNlc3Npb25Db250ZXh0KSxcbiAgICBpbnRlcnJ1cHQ6IGludGVycnVwdC5iaW5kKG51bGwsIHNlc3Npb25Db250ZXh0KSxcbiAgICB1c2FnZTogdXNhZ2UuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgdXBkYXRlOiB1cGRhdGUuYmluZChudWxsLCBzZXNzaW9uQ29udGV4dCksXG4gICAgc2FuZGJveDogbGF6eVNhbmRib3hIYW5kbGU8VFNhbmRib3hCaW5kaW5ncz4oYWdlbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiByZWNvcmQ/LnNhbmRib3hJZCA/PyBzZXNzaW9uSWQ7XG4gICAgfSksXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBJbmZlclVJVG9vbHMsXG4gIFJlYXNvbmluZ1VJUGFydCxcbiAgVGV4dFVJUGFydCxcbiAgVG9vbFNldCxcbiAgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnREYXRhVHlwZXMgfSBmcm9tIFwiLi4vYWdlbnQvcmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbi8qKiBTdWItdG9vbCBwYXJ0cyAoZnJvbSBKYXZhU2NyaXB0IG1ldGEtdG9vbCkgdXNlIHRoaXMgdG9vbENhbGxJZCBwcmVmaXguICovXG5mdW5jdGlvbiBpc1N1YlRvb2xQYXJ0KHBhcnQ6IFBhcnQpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IHBhcnQucGFydCBhcyB7IHRvb2xDYWxsSWQ/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIHR5cGVvZiBwPy50b29sQ2FsbElkID09PSBcInN0cmluZ1wiICYmIHAudG9vbENhbGxJZC5zdGFydHNXaXRoKFwianNfdGNfXCIpO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbWluZ0NvbnRlbnQoXG4gIHBhcnQ6IHVua25vd25cbik6IHBhcnQgaXMgVGV4dFVJUGFydCB8IFJlYXNvbmluZ1VJUGFydCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBwYXJ0ICE9PSBudWxsICYmXG4gICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiIHx8IHBhcnQudHlwZSA9PT0gXCJyZWFzb25pbmdcIilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SW50ZXJydXB0Q3V0b2ZmKHtcbiAgcGFydHMsXG4gIGxhc3RQYXJ0LFxufToge1xuICBwYXJ0czogUGFydFtdO1xuICBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH07XG59KTogUGFydFtdIHtcbiAgcmV0dXJuIHBhcnRzXG4gICAgLmZpbHRlcigocCkgPT4gcC5pbmRleCA8PSBsYXN0UGFydC5pbmRleClcbiAgICAubWFwKChwKSA9PiB7XG4gICAgICBpZiAocC5pbmRleCAhPT0gbGFzdFBhcnQuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIE9ubHkgcmVwbGFjZSBjb250ZW50IGZvciBzdHJlYW1pbmcgcGFydHMgKHRleHQsIHJlYXNvbmluZykgd2hlcmUgdGhlXG4gICAgICAgKiBjbGllbnQncyB0cnVuY2F0ZWQgdmVyc2lvbiBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHNlcnZlcidzIGZ1bGxcbiAgICAgICAqIHZlcnNpb24uIEZvciBzdGF0ZWZ1bCBwYXJ0cyAodG9vbHMpLCB0aGUgc2VydmVyJ3MgdmVyc2lvbiBpc1xuICAgICAgICogYXV0aG9yaXRhdGl2ZSBcdTIwMTQgaXQgbWF5IGhhdmUgZXZvbHZlZCAoZS5nLiBhcHByb3ZhbC1yZXF1ZXN0ZWQgXHUyMTkyXG4gICAgICAgKiBvdXRwdXQtZGVuaWVkKSBhZnRlciB0aGUgY2xpZW50IHNuYXBzaG90IHdhcyB0YWtlbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzU3RyZWFtaW5nQ29udGVudChsYXN0UGFydC5wYXJ0KSkge1xuICAgICAgICByZXR1cm4geyAuLi5wLCBwYXJ0OiBsYXN0UGFydC5wYXJ0IH0gYXMgUGFydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVSU1lc3NhZ2VzPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4ob3B0czoge1xuICBtZXNzYWdlczogTWVzc2FnZVtdO1xuICBwYXJ0czogUGFydFtdO1xuICB1bnRpbD86IG51bWJlcjtcbiAgaW5jbHVkZVF1ZXVlZD86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGZpbHRlcnMgb3V0IHN1Yi10b29sIHBhcnRzIHNvIHRoZSBMTE0gZG9lc24ndCBzZWUgdGhlbS4gKi9cbiAgZXhjbHVkZVN1YlRvb2xQYXJ0cz86IGJvb2xlYW47XG59KSB7XG4gIHR5cGUgVHlwZWRVSU1lc3NhZ2UgPSBVSU1lc3NhZ2U8dW5rbm93biwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUb29scz4+O1xuXG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gU29ydCBieSBjcmVhdGVkQXQgc28gbWVzc2FnZXMgYXJlIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgcmVnYXJkbGVzcyBvZlxuICAvLyBob3cgdGhlIHN0b3JhZ2UgbGF5ZXIgcmV0dXJucyB0aGVtIChlLmcuIGxvY2FsIEZTIHJlYWRzIGluIHJlYWRkaXIgb3JkZXIpLlxuICBmaWx0ZXJlZCA9IFsuLi5maWx0ZXJlZF0uc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkQXQgLSBiLmNyZWF0ZWRBdCk7XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBtZXNzYWdlSWQgPSBTdHJpbmcocGFydC5tZXNzYWdlSWQpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQobWVzc2FnZUlkLCBleGlzdGluZyk7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRcbiAgICAubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlSWQgPSBTdHJpbmcobS5pZCk7XG4gICAgICBsZXQgbWVzc2FnZVBhcnRzID0gcGFydHNCeU1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCkgPz8gW107XG4gICAgICBtZXNzYWdlUGFydHMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICBpZiAobS5pbnRlcnJ1cHRlZExhc3RQYXJ0ICE9IG51bGwpIHtcbiAgICAgICAgbWVzc2FnZVBhcnRzID0gYXBwbHlJbnRlcnJ1cHRDdXRvZmYoe1xuICAgICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMsXG4gICAgICAgICAgbGFzdFBhcnQ6IG0uaW50ZXJydXB0ZWRMYXN0UGFydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHJvbGU6IG0ucm9sZSxcbiAgICAgICAgcGFydHM6IG1lc3NhZ2VQYXJ0cy5tYXAoKHApID0+IHAucGFydCksXG4gICAgICAgIC4uLihtLm1ldGFkYXRhICE9IG51bGwgPyB7IG1ldGFkYXRhOiBtLm1ldGFkYXRhIH0gOiB7fSksXG4gICAgICB9IGFzIFR5cGVkVUlNZXNzYWdlO1xuICAgIH0pXG4gICAgLmZpbHRlcigobSkgPT4gbS5wYXJ0cy5sZW5ndGggPiAwKTtcbn1cbiIsICJleHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVSZWFkVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlV3JpdGVUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBVc2FnZVN1bW1hcnkgPSB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICB0b3RhbFRva2VuczogbnVtYmVyO1xuICBjYWNoZVJlYWRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVXcml0ZVRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdUb2tlbnM6IG51bWJlcjtcbiAgc3RlcENvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBTZXNzaW9uVXNhZ2UgPSB7XG4gIHRvdGFsOiBVc2FnZVN1bW1hcnkgJiB7IG1lc3NhZ2VDb3VudDogbnVtYmVyIH07XG4gIGJ5TWVzc2FnZUlkOiBSZWNvcmQ8c3RyaW5nLCBVc2FnZVN1bW1hcnkgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2Vzc2lvblVzYWdlKFxuICBtZXNzYWdlczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNhZ2U6IHsgc3RlcHM6IFN0ZXBVc2FnZVtdOyBzdW1tYXJ5OiBVc2FnZVN1bW1hcnkgfSB8IG51bGw7XG4gIH0+XG4pOiBTZXNzaW9uVXNhZ2Uge1xuICBjb25zdCBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD4gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgYnlNZXNzYWdlSWRbbS5pZF0gPSBtLnVzYWdlPy5zdW1tYXJ5ID8/IG51bGw7XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXMgPSBtZXNzYWdlc1xuICAgIC5tYXAoKG0pID0+IG0udXNhZ2U/LnN1bW1hcnkpXG4gICAgLmZpbHRlcigocyk6IHMgaXMgVXNhZ2VTdW1tYXJ5ID0+IHMgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdG90YWwgPSB7XG4gICAgbW9kZWw6IHN1bW1hcmllc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICB0b3RhbFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnRvdGFsVG9rZW5zLCAwKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVJlYWRUb2tlbnMsIDApLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVdyaXRlVG9rZW5zLCAwKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5yZWFzb25pbmdUb2tlbnMsIDApLFxuICAgIHN0ZXBDb3VudDogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnN0ZXBDb3VudCwgMCksXG4gICAgbWVzc2FnZUNvdW50OiBzdW1tYXJpZXMubGVuZ3RoLFxuICB9O1xuXG4gIHJldHVybiB7IHRvdGFsLCBieU1lc3NhZ2VJZCB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgYXNzZW1ibGVVSU1lc3NhZ2VzIH0gZnJvbSBcIi4uL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlU2Vzc2lvblVzYWdlLCB0eXBlIFNlc3Npb25Vc2FnZSB9IGZyb20gXCIuLi91dGlscy91c2FnZVwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuXG5leHBvcnQgdHlwZSBIaXN0b3J5UmVzdWx0ID0ge1xuICBtZXNzYWdlczogUmV0dXJuVHlwZTx0eXBlb2YgYXNzZW1ibGVVSU1lc3NhZ2VzPjtcbiAgc3RyZWFtaW5nTWVzc2FnZUlkOiBzdHJpbmcgfCBudWxsO1xuICB1c2FnZTogU2Vzc2lvblVzYWdlO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0XG4pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCBbc2Vzc2lvbiwgbWVzc2FnZXMsIHBhcnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCksXG4gICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmxpc3RCeVNlc3Npb24oXG4gICAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWRcbiAgICApLFxuICAgIHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCksXG4gIF0pO1xuXG4gIGNvbnN0IGxhc3RBc3Npc3RhbnQgPVxuICAgIG1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5pZCA9PT0gc2Vzc2lvbj8ubGFzdE1lc3NhZ2VJZCAmJiBtLnJvbGUgPT09IFwiYXNzaXN0YW50XCJcbiAgICApID8/IG1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5yb2xlID09PSBcImFzc2lzdGFudFwiKS5hdCgtMSk7XG5cbiAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgIGxhc3RBc3Npc3RhbnQ/LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgbGFzdEFzc2lzdGFudD8uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbDtcbiAgY29uc3Qgc3RyZWFtaW5nTWVzc2FnZUlkID0gaXNTdHJlYW1pbmcgPyBsYXN0QXNzaXN0YW50LmlkIDogbnVsbDtcbiAgY29uc3QgdmlzaWJsZVVudGlsID0gbGFzdEFzc2lzdGFudD8uY3JlYXRlZEF0O1xuXG4gIGNvbnN0IGFzc2VtYmxlZCA9IGFzc2VtYmxlVUlNZXNzYWdlczxUb29scz4oe1xuICAgIG1lc3NhZ2VzLFxuICAgIHBhcnRzLFxuICAgIGluY2x1ZGVRdWV1ZWQ6IHZpc2libGVVbnRpbCAhPT0gdW5kZWZpbmVkLFxuICAgIHVudGlsOiB2aXNpYmxlVW50aWwsXG4gIH0pO1xuXG4gIGNvbnN0IHVzYWdlID0gY29tcHV0ZVNlc3Npb25Vc2FnZShtZXNzYWdlcyk7XG5cbiAgcmV0dXJuIHsgbWVzc2FnZXM6IGFzc2VtYmxlZCwgc3RyZWFtaW5nTWVzc2FnZUlkLCB1c2FnZSB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCB0eXBlIEludGVycnVwdE9wdGlvbnMgPSB7XG4gIGxhc3RQYXJ0Pzoge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgcGFydDogdW5rbm93bjtcbiAgfTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnRlcnJ1cHQoXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCxcbiAgb3B0cz86IEludGVycnVwdE9wdGlvbnNcbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmxpc3RCeVNlc3Npb24oXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihcbiAgICAobSkgPT5cbiAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgbS5jb21wbGV0ZWRBdCA9PT0gbnVsbCAmJlxuICAgICAgbS5pbnRlcnJ1cHRlZEF0ID09PSBudWxsXG4gICk7XG5cbiAgaWYgKHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zdCBNQVhfUkVUUk9BQ1RJVkVfTVMgPSA1XzAwMDtcbiAgICBjb25zdCBsYXRlc3QgPSBtZXNzYWdlc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKG0pID0+XG4gICAgICAgICAgbS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgICAgICAgbS5pbnRlcnJ1cHRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgbS5jb21wbGV0ZWRBdCAhPT0gbnVsbCAmJlxuICAgICAgICAgIG5vdyAtIG0uY29tcGxldGVkQXQgPCBNQVhfUkVUUk9BQ1RJVkVfTVNcbiAgICAgIClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdCAtIGEuY3JlYXRlZEF0KVxuICAgICAgLmF0KDApO1xuICAgIGlmIChsYXRlc3QpIHtcbiAgICAgIHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcyA9IFtsYXRlc3RdO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLm1lc3NhZ2Uuc2V0KG0uaWQsIHtcbiAgICAgICAgLi4ubSxcbiAgICAgICAgaW50ZXJydXB0ZWRBdDogbm93LFxuICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBvcHRzPy5sYXN0UGFydCA/PyBudWxsLFxuICAgICAgfSlcbiAgICApXG4gICk7XG5cbiAgY29uc3QgbWVzc2FnZUlkcyA9IG5ldyBTZXQocGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzLm1hcCgobSkgPT4gbS5pZCkpO1xuICBpZiAobWVzc2FnZUlkcy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWxsUGFydHMgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihcbiAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWRcbiAgKTtcblxuICBmb3IgKGNvbnN0IHAgb2YgYWxsUGFydHMpIHtcbiAgICBpZiAoIW1lc3NhZ2VJZHMuaGFzKHAubWVzc2FnZUlkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHAucGFydCAmJlxuICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIgJiZcbiAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnRcbiAgICApIHtcbiAgICAgIGNvbnN0IGFwcHJvdmFsID0gKHAucGFydCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfSkuYXBwcm92YWw7XG4gICAgICBpZiAoYXBwcm92YWw/LmlkKSB7XG4gICAgICAgIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5zZXQocC5pZCwge1xuICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgc3RhdGU6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgLi4uYXBwcm92YWwsXG4gICAgICAgICAgICAgIGFwcHJvdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBGaW5pc2hSZWFzb24sIFRvb2xTZXQsIFVJTWVzc2FnZSwgVUlNZXNzYWdlQ2h1bmsgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGFsbCB9IGZyb20gXCJiZXR0ZXItYWxsXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IFR5cGVkVUlNZXNzYWdlIH0gZnJvbSBcIi4uL2FnZW50L3JlZ2lzdHJ5XCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsU3VtbWFyeSB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXBVc2FnZSB9IGZyb20gXCIuLi91dGlscy91c2FnZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBTdHJlYW1UZXh0UmVzdWx0LFxuICBzdHJlYW1UZXh0LFxuICBzdHJlYW1UZXh0U3RlcCxcbn0gZnJvbSBcIi4vYWktbG9vcC9zdHJlYW0tdGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuL2hhbmRsZVwiO1xuaW1wb3J0IHsgaW50ZXJydXB0IH0gZnJvbSBcIi4vaW50ZXJydXB0XCI7XG5cbmNvbnN0IERFRkFVTFRfU1RFUF9USFJPVUdIUFVUID0gMTAwO1xuXG5leHBvcnQgdHlwZSBBcHByb3ZhbERhdGEgPSB7XG4gIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn07XG5cbnR5cGUgTWVzc2FnZURhdGE8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9XG4gIHwgVUlNZXNzYWdlXG4gIHwge1xuICAgICAgcm9sZT86IFR5cGVkVUlNZXNzYWdlPHVua25vd24sIFRvb2xzPltcInJvbGVcIl07XG4gICAgICBwYXJ0czogVHlwZWRVSU1lc3NhZ2U8dW5rbm93biwgVG9vbHM+W1wicGFydHNcIl07XG4gICAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgICAgIGlkPzogc3RyaW5nO1xuICAgIH07XG5cbmV4cG9ydCB0eXBlIFNlbmRJbnB1dDxUb29scyBleHRlbmRzIFRvb2xTZXQ+ID1cbiAgfCBzdHJpbmdcbiAgfCBNZXNzYWdlRGF0YTxUb29scz5cbiAgfCB7IHR5cGU6IFwibWVzc2FnZVwiOyBtZXNzYWdlOiBNZXNzYWdlRGF0YTxUb29scz4gfVxuICB8IHsgdHlwZTogXCJhcHByb3ZhbFwiOyBhcHByb3ZhbDogQXBwcm92YWxEYXRhIH07XG5cbmV4cG9ydCB0eXBlIFNlbmRPcHRpb25zPFRDb250ZXh0PiA9IHtcbiAgaW50ZXJydXB0SWZTdHJlYW1pbmc/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgeyBsYXN0UGFydDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH0gfTtcbiAgY29udGV4dD86IFRDb250ZXh0O1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBzYW5kYm94SWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZW5kUmVzdWx0ID0ge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgZG9uZTogdHJ1ZSB8IFByb21pc2U8dHJ1ZT47XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVSdW4gPSB7XG4gIGNodW5rczogVUlNZXNzYWdlQ2h1bmtbXTtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtPFVJTWVzc2FnZUNodW5rPjtcbiAgZG9uZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlc29sdmVzIHdoZW4gYSBuZXcgY2h1bmsgaXMgYXZhaWxhYmxlLiBSZXBsYWNlZCBhZnRlciBlYWNoIG5vdGlmaWNhdGlvbi4gKi9cbiAgb25DaHVuazogUHJvbWlzZTx2b2lkPjtcbn07XG5cbmNvbnN0IEFDVElWRV9SVU5TX0tFWSA9IFN5bWJvbC5mb3IoXCJleHBlcmltZW50YWwtYWdlbnQ6YWN0aXZlUnVuc1wiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVJ1bnMoKTogTWFwPHN0cmluZywgQWN0aXZlUnVuPiB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIE1hcDxzdHJpbmcsIEFjdGl2ZVJ1bj4gfCB1bmRlZmluZWQ+O1xuICBpZiAoIWdbQUNUSVZFX1JVTlNfS0VZXSkge1xuICAgIGdbQUNUSVZFX1JVTlNfS0VZXSA9IG5ldyBNYXAoKTtcbiAgfVxuICByZXR1cm4gZ1tBQ1RJVkVfUlVOU19LRVldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZDxUb29scyBleHRlbmRzIFRvb2xTZXQsIFRDb250ZXh0PihcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0LFxuICBpbnB1dDogU2VuZElucHV0PFRvb2xzPiB8IFNlbmRJbnB1dDxUb29scz5bXSxcbiAgb3B0cz86IFNlbmRPcHRpb25zPFRDb250ZXh0PlxuKTogUHJvbWlzZTxTZW5kUmVzdWx0PiB7XG4gIGlmIChvcHRzPy5pbnRlcnJ1cHRJZlN0cmVhbWluZykge1xuICAgIGNvbnN0IGxhc3RQYXJ0ID1cbiAgICAgIHR5cGVvZiBvcHRzLmludGVycnVwdElmU3RyZWFtaW5nID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gb3B0cy5pbnRlcnJ1cHRJZlN0cmVhbWluZy5sYXN0UGFydFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBhd2FpdCBpbnRlcnJ1cHQoc2Vzc2lvbkNvbnRleHQsIHsgbGFzdFBhcnQgfSk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgd29ya2Zsb3dSdW5JZCxcbiAgICB3b3JrZmxvd1dyaXRhYmxlLFxuICAgIGV4aXN0aW5nUGFydENvdW50LFxuICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICB9ID0gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICB0cnk6ICgpID0+XG4gICAgICBpbml0U2Vzc2lvblN0ZXA8VG9vbHM+KHtcbiAgICAgICAgc2Vzc2lvbkNvbnRleHQsXG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICBzYW5kYm94SWQ6IG9wdHM/LnNhbmRib3hJZCxcbiAgICAgICAgaW5wdXQsXG4gICAgICB9KSxcbiAgICBjYXRjaDogKGUpID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTZW5kRXJyb3Ioe1xuICAgICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICByZWFzb246IFN0cmluZyhlKSxcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBsb29wT3B0cyA9IHtcbiAgICBzZXNzaW9uQ29udGV4dCxcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgIGNvbnRleHQ6IChvcHRzPy5jb250ZXh0ID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBsYXN0UGFydEluZGV4OiBleGlzdGluZ1BhcnRDb3VudCxcbiAgICB3b3JrZmxvd1J1bklkLFxuICB9O1xuXG4gIGlmICh3b3JrZmxvd1dyaXRhYmxlKSB7XG4gICAgYXdhaXQgcnVuTG9vcDxUb29scz4oeyAuLi5sb29wT3B0cywgd3JpdGFibGU6IHdvcmtmbG93V3JpdGFibGUgfSk7XG4gICAgcmV0dXJuIHsgYXNzaXN0YW50TWVzc2FnZUlkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBjb25zdCBjaHVua3M6IFVJTWVzc2FnZUNodW5rW10gPSBbXTtcbiAgbGV0IG5vdGlmeUNodW5rOiAoKSA9PiB2b2lkO1xuICBsZXQgb25DaHVuayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgbm90aWZ5Q2h1bmsgPSByO1xuICB9KTtcblxuICBjb25zdCB3cml0YWJsZSA9IG5ldyBXcml0YWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4oe1xuICAgIHdyaXRlKGNodW5rKSB7XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICBjb25zdCBwcmV2ID0gbm90aWZ5Q2h1bms7XG4gICAgICBvbkNodW5rID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IHtcbiAgICAgICAgbm90aWZ5Q2h1bmsgPSByO1xuICAgICAgfSk7XG4gICAgICBwcmV2KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgZG9uZSA9IHJ1bkxvb3A8VG9vbHM+KHsgLi4ubG9vcE9wdHMsIHdyaXRhYmxlIH0pO1xuXG4gIGNvbnN0IGFjdGl2ZVJ1bjogQWN0aXZlUnVuID0ge1xuICAgIGNodW5rcyxcbiAgICB3cml0YWJsZSxcbiAgICBkb25lLFxuICAgIGdldCBvbkNodW5rKCkge1xuICAgICAgcmV0dXJuIG9uQ2h1bms7XG4gICAgfSxcbiAgfTtcbiAgY29uc3QgYWN0aXZlUnVucyA9IGdldEFjdGl2ZVJ1bnMoKTtcbiAgYWN0aXZlUnVucy5zZXQoYXNzaXN0YW50TWVzc2FnZUlkLCBhY3RpdmVSdW4pO1xuICBkb25lLmZpbmFsbHkoKCkgPT4gYWN0aXZlUnVucy5kZWxldGUoYXNzaXN0YW50TWVzc2FnZUlkKSk7XG5cbiAgcmV0dXJuIHsgYXNzaXN0YW50TWVzc2FnZUlkLCBkb25lOiBkb25lLnRoZW4oKCkgPT4gdHJ1ZSkgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQUkgTG9vcFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5hc3luYyBmdW5jdGlvbiBydW5Mb29wPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oe1xuICB3b3JrZmxvd1J1bklkLFxuICBzZXNzaW9uQ29udGV4dCxcbiAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICBjcmVhdGVkQXQsXG4gIGNvbnRleHQsXG4gIHdyaXRhYmxlLFxuICBsYXN0UGFydEluZGV4OiBpbml0aWFsUGFydEluZGV4LFxufToge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFnZW50ID0gc2Vzc2lvbkNvbnRleHQuYWdlbnQ7XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG4gIGNvbnN0IG1zZ0xvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIH0pO1xuICBjb25zdCBkb25lTWVzc2FnZSA9IG1zZ0xvZy50aW1lKFwib25NZXNzYWdlXCIpO1xuXG4gIGxldCBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RQYXJ0SW5kZXggPSBpbml0aWFsUGFydEluZGV4O1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuICBsZXQgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIHdoaWxlIChmaW5pc2hSZWFzb24gIT09IFwic3RvcFwiKSB7XG4gICAgICBjb25zdCBzdHJlYW1UZXh0Rm4gPSB3b3JrZmxvd1J1bklkXG4gICAgICAgID8gc3RyZWFtVGV4dFN0ZXA8VG9vbHM+XG4gICAgICAgIDogc3RyZWFtVGV4dDxUb29scz47XG4gICAgICBjb25zdCB0aHJvdWdocHV0ID0gd29ya2Zsb3dSdW5JZCA/IDUgOiBERUZBVUxUX1NURVBfVEhST1VHSFBVVDtcblxuICAgICAgY29uc3QgcmVzdWx0OiBTdHJlYW1UZXh0UmVzdWx0ID0gYXdhaXQgc3RyZWFtVGV4dEZuKHtcbiAgICAgICAgc3RlcFRocm91Z2hwdXQ6IHRocm91Z2hwdXQsXG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgYWdlbnQsXG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgIHdyaXRhYmxlLFxuICAgICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgICBzdGVwSW5kZXhPZmZzZXQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgICBkaXNjb3ZlcmVkU2tpbGxzLFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmlzaFJlYXNvbiA9IHJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICBsYXN0UGFydEluZGV4ID0gcmVzdWx0Lmxhc3RQYXJ0SW5kZXg7XG4gICAgICB1c2FnZVN0ZXBzLnB1c2goLi4ucmVzdWx0LnVzYWdlU3RlcHMpO1xuICAgICAgZGlzY292ZXJlZFNraWxscyA9IHJlc3VsdC5kaXNjb3ZlcmVkU2tpbGxzO1xuXG4gICAgICBpZiAocmVzdWx0Lm1heFN0ZXBzICE9IG51bGwgJiYgdXNhZ2VTdGVwcy5sZW5ndGggPj0gcmVzdWx0Lm1heFN0ZXBzKSB7XG4gICAgICAgIG1zZ0xvZy5pbmZvKFwicmVhY2hlZCBtYXhTdGVwcyBsaW1pdFwiLCB7IG1heFN0ZXBzOiByZXN1bHQubWF4U3RlcHMgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2dMb2cuaW5mbyhcInBlbmRpbmcgYXBwcm92YWxzLCBzdG9wcGluZyBsb29wXCIsIHtcbiAgICAgICAgICBjb3VudDogcmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoLFxuICAgICAgICAgIHRvb2xzOiByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHApID0+IHAudG9vbE5hbWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9uZU1lc3NhZ2UoeyB0b3RhbFN0ZXBzOiB1c2FnZVN0ZXBzLmxlbmd0aCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbXNnTG9nLmVycm9yKFwiQUkgbG9vcCBmYWlsZWRcIiwge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gICAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICBzZXNzaW9uQ29udGV4dCxcbiAgICAgIHdyaXRhYmxlLFxuICAgICAgdXNhZ2VTdGVwcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBTdGVwc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5hc3luYyBmdW5jdGlvbiBpbml0U2Vzc2lvblN0ZXA8VG9vbHMgZXh0ZW5kcyBUb29sU2V0Pih7XG4gIHNlc3Npb25Db250ZXh0LFxuICBzZXNzaW9uSWQsXG4gIHNhbmRib3hJZCxcbiAgaW5wdXQsXG59OiB7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNhbmRib3hJZD86IHN0cmluZztcbiAgaW5wdXQ6IFNlbmRJbnB1dDxUb29scz4gfCBTZW5kSW5wdXQ8VG9vbHM+W107XG59KSB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBsZXQgd29ya2Zsb3dSdW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgd29ya2Zsb3dXcml0YWJsZTogV3JpdGFibGVTdHJlYW0gfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBnZXRXb3JrZmxvd01ldGFkYXRhLCBnZXRXcml0YWJsZSB9ID0gYXdhaXQgaW1wb3J0KFwid29ya2Zsb3dcIik7XG4gICAgd29ya2Zsb3dSdW5JZCA9IGdldFdvcmtmbG93TWV0YWRhdGEoKS53b3JrZmxvd1J1bklkO1xuICAgIHdvcmtmbG93V3JpdGFibGUgPSBnZXRXcml0YWJsZSgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyB3b3JrZmxvdyBub3QgaW5zdGFsbGVkXG4gIH1cblxuICBjb25zdCBuZXdNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIGNvbnN0IG5ld1BhcnRzOiBQYXJ0W10gPSBbXTtcbiAgY29uc3QgbmV3QXBwcm92YWxzOiBBcHByb3ZhbERhdGFbXSA9IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5wdXQpIHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMsIGFwcHJvdmFscyB9ID0gdG9NZXNzYWdlQW5kUGFydHMoe1xuICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgaW5wdXQ6IGksXG4gICAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICAgIH0pO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgbmV3TWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIG5ld1BhcnRzLnB1c2goLi4ucGFydHMpO1xuICAgICAgbmV3QXBwcm92YWxzLnB1c2goLi4uYXBwcm92YWxzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBwYXJ0cywgYXBwcm92YWxzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICBpbnB1dCxcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgIH0pO1xuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICBuZXdBcHByb3ZhbHMucHVzaCguLi5hcHByb3ZhbHMpO1xuICB9XG5cbiAgY29uc3QgbGFzdE5ld01lc3NhZ2UgPSBuZXdNZXNzYWdlcy5hdCgtMSk7XG4gIGNvbnN0IHJldXNlQXNzaXN0YW50ID0gbGFzdE5ld01lc3NhZ2U/LnJvbGUgPT09IFwiYXNzaXN0YW50XCI7XG5cbiAgY29uc3QgYXNzaXN0YW50TWVzc2FnZUlkID0gcmV1c2VBc3Npc3RhbnRcbiAgICA/IGxhc3ROZXdNZXNzYWdlLmlkXG4gICAgOiBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICBjb25zdCBiYXNlVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQgPSBiYXNlVGltZSArIG5ld01lc3NhZ2VzLmxlbmd0aDtcblxuICBpZiAoIXJldXNlQXNzaXN0YW50KSB7XG4gICAgbmV3TWVzc2FnZXMucHVzaCh7XG4gICAgICBpZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogbnVsbCxcbiAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgd29ya2Zsb3dSdW5JZDogbnVsbCxcbiAgICAgIG1ldGFkYXRhOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdQYXJ0Q291bnQgPSByZXVzZUFzc2lzdGFudFxuICAgID8gbmV3UGFydHMuZmlsdGVyKChwKSA9PiBwLm1lc3NhZ2VJZCA9PT0gYXNzaXN0YW50TWVzc2FnZUlkKS5sZW5ndGhcbiAgICA6IDA7XG5cbiAgbGV0IHNlc3Npb24gPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmICghc2Vzc2lvbikge1xuICAgIHNlc3Npb24gPSB7XG4gICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgc2FuZGJveElkOiBzYW5kYm94SWQgPz8gbnVsbCxcbiAgICAgIGxhc3RNZXNzYWdlSWQ6IG51bGwsXG4gICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgIH07XG4gICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLnNldChzZXNzaW9uLmlkLCBzZXNzaW9uKTtcbiAgfSBlbHNlIGlmIChzYW5kYm94SWQgJiYgc2FuZGJveElkICE9PSBzZXNzaW9uLnNhbmRib3hJZCkge1xuICAgIHNlc3Npb24gPSB7IC4uLnNlc3Npb24sIHNhbmRib3hJZCwgdXBkYXRlZEF0OiBub3cgfTtcbiAgICBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24udXBkYXRlKHNlc3Npb24uaWQsIHtcbiAgICAgIHNhbmRib3hJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGF3YWl0IGFsbCh7XG4gICAgYXN5bmMgc2F2ZU1lc3NhZ2VzKCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5ld01lc3NhZ2VzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmdldChtLmlkKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLnNldChtLmlkLCB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBiYXNlVGltZSArIGksXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOlxuICAgICAgICAgICAgICBtLmlkID09PSBhc3Npc3RhbnRNZXNzYWdlSWRcbiAgICAgICAgICAgICAgICA/ICh3b3JrZmxvd1J1bklkID8/IG51bGwpXG4gICAgICAgICAgICAgICAgOiBtLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gICAgYXN5bmMgc2F2ZVBhcnRzKCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5ld1BhcnRzLm1hcChhc3luYyAocCkgPT5cbiAgICAgICAgICBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIHApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyByZXNvbHZlQXBwcm92YWxzKCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG5ld0FwcHJvdmFscy5tYXAoYXN5bmMgKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJ0SWQgPSBhcHByb3ZhbFBhcnRJZChhLmFwcHJvdmFsSWQpO1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnBhcnQuZ2V0KHBhcnRJZCk7XG4gICAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwcm92YWxOb3RGb3VuZEVycm9yKHtcbiAgICAgICAgICAgICAgaWQ6IHNlc3Npb25Db250ZXh0LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgYXBwcm92YWxJZDogYS5hcHByb3ZhbElkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UucGFydC5zZXQocGFydElkLCB7XG4gICAgICAgICAgICAuLi5wYXJ0LFxuICAgICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgICAuLi5wYXJ0LnBhcnQsXG4gICAgICAgICAgICAgIHN0YXRlOiBhLmFwcHJvdmVkID8gXCJhcHByb3ZhbC1yZXNwb25kZWRcIiA6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgICBhcHByb3ZhbDoge1xuICAgICAgICAgICAgICAgIGlkOiBhLmFwcHJvdmFsSWQsXG4gICAgICAgICAgICAgICAgYXBwcm92ZWQ6IGEuYXBwcm92ZWQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBhLnJlYXNvbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gYXMgdHlwZW9mIHBhcnQucGFydCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgICBhc3luYyB1cGRhdGVTZXNzaW9uKCkge1xuICAgICAgYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5zZXNzaW9uLnNldChzZXNzaW9uLmlkLCB7XG4gICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgIGxhc3RNZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd1J1bklkLFxuICAgIHdvcmtmbG93V3JpdGFibGUsXG4gICAgZXhpc3RpbmdQYXJ0Q291bnQsXG4gICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIHNlc3Npb25Db250ZXh0LFxuICB3cml0YWJsZSxcbiAgdXNhZ2VTdGVwcyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dDtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXTtcbn0pIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcih7XG4gICAgY29uZmlnOiB7XG4gICAgICAuLi5zZXNzaW9uQ29udGV4dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsXG4gICAgICBuYW1lOiBzZXNzaW9uQ29udGV4dC5hZ2VudC5uYW1lLFxuICAgIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG4gIGNvbnN0IG1zZ0xvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHVzYWdlID1cbiAgICB1c2FnZVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgID8ge1xuICAgICAgICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1vZGVsOiB1c2FnZVN0ZXBzWzBdPy5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZSgoYSwgcykgPT4gYSArIHMuaW5wdXRUb2tlbnMsIDApLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZSgoYSwgcykgPT4gYSArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZSgoYSwgcykgPT4gYSArIHMudG90YWxUb2tlbnMsIDApLFxuICAgICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOiB1c2FnZVN0ZXBzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGEsIHMpID0+IGEgKyBzLmNhY2hlUmVhZFRva2VucyxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNhY2hlV3JpdGVUb2tlbnM6IHVzYWdlU3RlcHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYSwgcykgPT4gYSArIHMuY2FjaGVXcml0ZVRva2VucyxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHJlYXNvbmluZ1Rva2VuczogdXNhZ2VTdGVwcy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhLCBzKSA9PiBhICsgcy5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGVwQ291bnQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLnVwZGF0ZShhc3Npc3RhbnRNZXNzYWdlSWQsIHtcbiAgICAgIGNvbXBsZXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgdXNhZ2UsXG4gICAgfSksXG4gICAgd3JpdGFibGUuY2xvc2UoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpLFxuICBdKTtcblxuICBtc2dMb2cuaW5mbyhcIm1lc3NhZ2UgY29tcGxldGVkXCIsIHtcbiAgICBzdGVwczogdXNhZ2VTdGVwcy5sZW5ndGgsXG4gICAgdG90YWxUb2tlbnM6IHVzYWdlPy5zdW1tYXJ5LnRvdGFsVG9rZW5zLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVXRpbHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsUGFydElkKGFwcHJvdmFsSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcGFydF8ke2FwcHJvdmFsSWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheUFjdGl2ZVJ1bihcbiAgYWN0aXZlOiBBY3RpdmVSdW4sXG4gIHN0YXJ0SW5kZXggPSAwXG4pOiBSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4ge1xuICBsZXQgY3Vyc29yID0gc3RhcnRJbmRleDtcbiAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+KHtcbiAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIERyYWluIGFueSBidWZmZXJlZCBjaHVua3NcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBhY3RpdmUuY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYWN0aXZlLmNodW5rc1tjdXJzb3IrK10pO1xuICAgICAgfVxuXG4gICAgICAvLyBXYWl0IGZvciBlaXRoZXIgYSBuZXcgY2h1bmsgb3IgY29tcGxldGlvblxuICAgICAgd2hpbGUgKCFjYW5jZWxsZWQgJiYgY3Vyc29yID49IGFjdGl2ZS5jaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgYWN0aXZlLm9uQ2h1bmsudGhlbigoKSA9PiBcImNodW5rXCIgYXMgY29uc3QpLFxuICAgICAgICAgIGFjdGl2ZS5kb25lLnRoZW4oKCkgPT4gXCJkb25lXCIgYXMgY29uc3QpLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBEcmFpbiBuZXcgY2h1bmtzXG4gICAgICAgIHdoaWxlIChjdXJzb3IgPCBhY3RpdmUuY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShhY3RpdmUuY2h1bmtzW2N1cnNvcisrXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBcImRvbmVcIikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbCgpIHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvTWVzc2FnZUFuZFBhcnRzPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oe1xuICBzZXNzaW9uSWQsXG4gIGlkLFxuICBpbnB1dCxcbiAgZGVmYXVsdFJvbGUsXG59OiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaW5wdXQ6IFNlbmRJbnB1dDxUb29scz47XG4gIGRlZmF1bHRSb2xlOiBVSU1lc3NhZ2VbXCJyb2xlXCJdO1xufSk6IHtcbiAgbWVzc2FnZTogTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgcGFydHM6IFBhcnRbXTtcbiAgYXBwcm92YWxzOiBBcHByb3ZhbERhdGFbXTtcbn0ge1xuICBsZXQgbWVzc2FnZUlkID0gaWQgPz8gYG1lc3NhZ2VfJHt1bGlkKCl9YDtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcHJvdmFsczogW10sXG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcm9sZTogZGVmYXVsdFJvbGUsXG4gICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBudWxsLFxuICAgICAgICB1c2FnZTogbnVsbCxcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogbnVsbCxcbiAgICAgICAgbWV0YWRhdGE6IG51bGwsXG4gICAgICB9LFxuICAgICAgcGFydHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgaWQ6IGBwYXJ0XyR7bWVzc2FnZUlkfV8wYCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICBwYXJ0OiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dCB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIGlmIChcInR5cGVcIiBpbiBpbnB1dCAmJiBpbnB1dC50eXBlID09PSBcImFwcHJvdmFsXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdW5kZWZpbmVkLFxuICAgICAgcGFydHM6IFtdLFxuICAgICAgYXBwcm92YWxzOiBbaW5wdXQuYXBwcm92YWxdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBtc2cgPVxuICAgIFwidHlwZVwiIGluIGlucHV0ICYmIGlucHV0LnR5cGUgPT09IFwibWVzc2FnZVwiID8gaW5wdXQubWVzc2FnZSA6IGlucHV0O1xuICBpZiAoXCJpZFwiIGluIG1zZyAmJiBtc2cuaWQpIHtcbiAgICBtZXNzYWdlSWQgPSBtc2cuaWQ7XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBtZXRhZGF0YSA9XG4gICAgXCJtZXRhZGF0YVwiIGluIG1zZyAmJiBtc2cubWV0YWRhdGEgIT0gbnVsbFxuICAgICAgPyAobXNnLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiBudWxsO1xuICByZXR1cm4ge1xuICAgIGFwcHJvdmFsczogW10sXG4gICAgbWVzc2FnZToge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogbnVsbCxcbiAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgd29ya2Zsb3dSdW5JZDogbnVsbCxcbiAgICAgIHJvbGU6IG1zZy5yb2xlID8/IGRlZmF1bHRSb2xlLFxuICAgICAgbWV0YWRhdGEsXG4gICAgfSxcbiAgICBwYXJ0czogbXNnLnBhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGFwID0gcGFydCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfTtcbiAgICAgIGNvbnN0IGlkID0gYXAuYXBwcm92YWw/LmlkXG4gICAgICAgID8gYXBwcm92YWxQYXJ0SWQoYXAuYXBwcm92YWwuaWQpXG4gICAgICAgIDogYHBhcnRfJHttZXNzYWdlSWR9XyR7aW5kZXh9YDtcbiAgICAgIHJldHVybiB7IHNlc3Npb25JZCwgbWVzc2FnZUlkLCBpZCwgaW5kZXgsIHBhcnQgfTtcbiAgICB9KSxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXJyb3JzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBjbGFzcyBTZW5kRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlbmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlbmQgZmFpbGVkIGZvciBzZXNzaW9uICRpZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIEFwcHJvdmFsTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiQXBwcm92YWxOb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiQXBwcm92YWwgJGFwcHJvdmFsSWQgbm90IGZvdW5kIGluIHNlc3Npb24gJGlkXCIsXG59KSB7fVxuIiwgImltcG9ydCB0eXBlIHtcbiAgRmluaXNoUmVhc29uLFxuICBUb29sU2V0LFxuICBVSU1lc3NhZ2UsXG4gIFVJTWVzc2FnZVN0cmVhbVdyaXRlcixcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQge1xuICBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzLFxuICBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sXG4gIHN0ZXBDb3VudElzLFxuICBzdHJlYW1UZXh0IGFzIHN0cmVhbVRleHRBaSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50U3RhdHVzLFxuICBBbnlBZ2VudCxcbiAgUmVzb2x2YWJsZSxcbiAgUmVzb2x2YWJsZUFyZ3MsXG4gIFR5cGVkVUlNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgeyBTZXNzaW9uTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB7IGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94IH0gZnJvbSBcIi4uLy4uL3NraWxscy9kaXNjb3ZlclwiO1xuaW1wb3J0IHsgcmVzb2x2ZVNraWxsSW5wdXRzVG9TYW5kYm94RGlycyB9IGZyb20gXCIuLi8uLi9za2lsbHMvcmVzb2x2ZVwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi4vLi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnQgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIGdldFRvb2xzLCB0eXBlIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIHR5cGUgTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvbXB0LWNhY2hlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdWlcIjtcbmltcG9ydCB0eXBlIHsgU3RlcFVzYWdlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3VzYWdlXCI7XG5pbXBvcnQgeyBhcHByb3ZhbFBhcnRJZCB9IGZyb20gXCIuLi9zZW5kXCI7XG5cbmNvbnN0IElOVEVSUlVQVF9QT0xMX0lOVEVSVkFMX01TID0gMjUwO1xuXG5mdW5jdGlvbiBwb2xsRm9ySW50ZXJydXB0KHtcbiAgYWdlbnQsXG4gIG1lc3NhZ2VJZCxcbiAgc2lnbmFsLFxuICBhYm9ydENvbnRyb2xsZXIsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNpZ25hbDogQWJvcnRTaWduYWw7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xufSk6IHtcbiAgZmlyc3RDaGVjazogUHJvbWlzZTx2b2lkPjtcbiAgaW50ZXJydXB0ZWRMYXN0UGFydFJlZjogeyBjdXJyZW50OiB7IGluZGV4OiBudW1iZXI7IHBhcnQ6IHVua25vd24gfSB8IG51bGwgfTtcbn0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG4gIGNvbnN0IGludGVycnVwdGVkTGFzdFBhcnRSZWYgPSB7XG4gICAgY3VycmVudDogbnVsbCBhcyB7IGluZGV4OiBudW1iZXI7IHBhcnQ6IHVua25vd24gfSB8IG51bGwsXG4gIH07XG5cbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGFnZW50LnN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSAke21lc3NhZ2VJZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbnRlcnJ1cHRlZEF0ICE9PSBudWxsKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiaW50ZXJydXB0IGRldGVjdGVkXCIsIHsgbWVzc2FnZUlkIH0pO1xuICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmLmN1cnJlbnQgPSBtZXNzYWdlLmludGVycnVwdGVkTGFzdFBhcnQ7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMpXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBwb2xsKCk7XG4gIHJldHVybiB7IGZpcnN0Q2hlY2ssIGludGVycnVwdGVkTGFzdFBhcnRSZWYgfTtcbn1cblxudHlwZSBTdHJlYW1UZXh0T3B0aW9ucyA9IHtcbiAgc3RlcFRocm91Z2hwdXQ6IG51bWJlcjtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBhZ2VudDogQW55QWdlbnQ7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtO1xuICBsYXN0UGFydEluZGV4OiBudW1iZXI7XG4gIHN0ZXBJbmRleE9mZnNldDogbnVtYmVyO1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBTdHJlYW1UZXh0UmVzdWx0ID0ge1xuICBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbjtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXTtcbiAgcGVuZGluZ0FwcHJvdmFsczogeyBhcHByb3ZhbElkOiBzdHJpbmc7IHRvb2xOYW1lOiBzdHJpbmcgfVtdO1xuICBtYXhTdGVwczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dDxUb29scyBleHRlbmRzIFRvb2xTZXQ+KHtcbiAgc3RlcFRocm91Z2hwdXQsXG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgYWdlbnQsXG4gIHNlc3Npb25JZCxcbiAgY29udGV4dCxcbiAgY3JlYXRlZEF0LFxuICB3cml0YWJsZSxcbiAgbGFzdFBhcnRJbmRleCxcbiAgc3RlcEluZGV4T2Zmc2V0LFxuICBkaXNjb3ZlcmVkU2tpbGxzLFxufTogU3RyZWFtVGV4dE9wdGlvbnMpOiBQcm9taXNlPFN0cmVhbVRleHRSZXN1bHQ+IHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcImFpLWxvb3BcIixcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcExvZyA9IGxvZy53aXRoQ29udGV4dCh7XG4gICAgc2Vzc2lvbklkLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICB9KTtcbiAgY29uc3QgZG9uZVN0ZXAgPSBzdGVwTG9nLnRpbWUoXCJzdHJlYW1UZXh0XCIpO1xuXG4gIGNvbnN0IHRocm90dGxlZEVtaXRTdGF0dXMgPSBjcmVhdGVUaHJvdHRsZWRFbWl0U3RhdHVzKGFnZW50KTtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHBvbGxDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9ID0gcG9sbEZvckludGVycnVwdCh7XG4gICAgYWdlbnQsXG4gICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgc2lnbmFsOiBwb2xsQ29udHJvbGxlci5zaWduYWwsXG4gICAgYWJvcnRDb250cm9sbGVyLFxuICB9KTtcblxuICBjb25zdCBkb25lTG9hZCA9IHN0ZXBMb2cudGltZShcImxvYWQgc2Vzc2lvbiArIG1lc3NhZ2VzICsgcGFydHMgKyBzYW5kYm94XCIpO1xuICBjb25zdCBbLCBtZXNzYWdlc1Jlc3VsdCwgcGFydHNSZXN1bHQsIHsgc2FuZGJveCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmaXJzdENoZWNrLFxuICAgIGFnZW50LnN0b3JhZ2UubWVzc2FnZS5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgYWdlbnQuc3RvcmFnZS5wYXJ0Lmxpc3RCeVNlc3Npb24oc2Vzc2lvbklkKSxcbiAgICBhZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCkudGhlbigoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uTm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhZ2VudC5zYW5kYm94KHNlc3Npb24uc2FuZGJveElkID8/IHNlc3Npb24uaWQpO1xuXG4gICAgICByZXR1cm4geyBzYW5kYm94IH07XG4gICAgfSksXG4gIF0pO1xuICBkb25lTG9hZCgpO1xuXG4gIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmaW5pc2hSZWFzb246IFwic3RvcFwiIGFzIEZpbmlzaFJlYXNvbixcbiAgICAgIGxhc3RQYXJ0SW5kZXgsXG4gICAgICB1c2FnZVN0ZXBzOiBbXSxcbiAgICAgIHBlbmRpbmdBcHByb3ZhbHM6IFtdLFxuICAgICAgbWF4U3RlcHM6IHVuZGVmaW5lZCxcbiAgICAgIGRpc2NvdmVyZWRTa2lsbHMsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNldFN0YXJ0ZWRQcm9taXNlID1cbiAgICBsYXN0UGFydEluZGV4ID09PSAwXG4gICAgICA/IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBwZW5kaW5nTWVzc2FnZXMgPSBtZXNzYWdlc1Jlc3VsdC5maWx0ZXIoXG4gICAgICAgICAgICAobSkgPT4gbS5jcmVhdGVkQXQgPD0gY3JlYXRlZEF0ICYmIG0uc3RhcnRlZEF0ID09PSBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgcGVuZGluZ01lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICAgICAgICBhZ2VudC5zdG9yYWdlLm1lc3NhZ2UudXBkYXRlKG0uaWQsIHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiA/IG51bGwgOiBub3csXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgIDogbnVsbDtcblxuICBjb25zdCBhbGxQYXJ0cyA9IFsuLi5wYXJ0c1Jlc3VsdF07XG4gIGNvbnN0IG5leHRQYXJ0SW5kZXhSZWYgPSB7XG4gICAgY3VycmVudDogTWF0aC5tYXgoXG4gICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgLi4uYWxsUGFydHNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5tZXNzYWdlSWQgPT09IGFzc2lzdGFudE1lc3NhZ2VJZClcbiAgICAgICAgLm1hcCgocCkgPT4gcC5pbmRleCArIDEpLFxuICAgICAgMFxuICAgICksXG4gIH07XG5cbiAgY29uc3Qgc2tpbGxzUmVmOiB7IGN1cnJlbnQ6IFNraWxsU3VtbWFyeVtdIH0gPSB7XG4gICAgY3VycmVudDogZGlzY292ZXJlZFNraWxscyA/PyBbXSxcbiAgfTtcblxuICAvLyBCdWlsZCB1aU1lc3NhZ2VzIGZyb20gY3VycmVudCBwYXJ0cyAocmVidWlsdCBiZXR3ZWVuIGl0ZXJhdGlvbnMpXG4gIGxldCB1aU1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgcGFydHM6IGFsbFBhcnRzLFxuICAgIHVudGlsOiBjcmVhdGVkQXQsXG4gICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICB9KTtcblxuICAvLyBCdWlsZCByZXNvbHZhYmxlIGFyZ3MgZm9yIHJlc29sdmluZyBhZ2VudCBvcHRpb25zXG4gIGNvbnN0IHJlc29sdmFibGVBcmdzOiBSZXNvbHZhYmxlQXJncyA9IHtcbiAgICBjb250ZXh0LFxuICAgIHNlc3Npb25JZCxcbiAgICBzYW5kYm94LFxuICAgIGdldCBtZXNzYWdlcygpIHtcbiAgICAgIHJldHVybiB1aU1lc3NhZ2VzO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gc2tpbGxzIGRpc2NvdmVyeSBcdTIwMTQgZmlyc3QgaXRlcmF0aW9uIG9ubHlcbiAgaWYgKGxhc3RQYXJ0SW5kZXggPT09IDAgJiYgIWRpc2NvdmVyZWRTa2lsbHMpIHtcbiAgICBjb25zdCByZXNvbHZlZFNraWxscyA9IGF3YWl0IHJlc29sdmVPcHRpb24oXG4gICAgICBhZ2VudC5vcHRpb25zLnNraWxscyxcbiAgICAgIHJlc29sdmFibGVBcmdzXG4gICAgKTtcbiAgICBjb25zdCBza2lsbHNEaXJzID0gcmVzb2x2ZWRTa2lsbHM/Lmxlbmd0aFxuICAgICAgPyBhd2FpdCByZXNvbHZlU2tpbGxJbnB1dHNUb1NhbmRib3hEaXJzKHtcbiAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIHNraWxsczogcmVzb2x2ZWRTa2lsbHMsXG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICB9KVxuICAgICAgOiBbXTtcbiAgICBpZiAoc2tpbGxzRGlycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkb25lU2tpbGxzID0gc3RlcExvZy50aW1lKFwiZGlzY292ZXIgc2tpbGxzXCIsIHsgc2tpbGxzRGlycyB9KTtcbiAgICAgIHNraWxsc1JlZi5jdXJyZW50ID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJblNhbmRib3goe1xuICAgICAgICBhZ2VudCxcbiAgICAgICAgc2FuZGJveCxcbiAgICAgICAgc2tpbGxzRGlycyxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgfSk7XG4gICAgICBkb25lU2tpbGxzKHsgY291bnQ6IHNraWxsc1JlZi5jdXJyZW50Lmxlbmd0aCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5uZXIgbG9vcDogcnVuIHVwIHRvIGBzdGVwVGhyb3VnaHB1dGAgc2VxdWVudGlhbCBMTE0gY2FsbHMuXG4gICAqIFBhcnRzIGFyZSBwZXJzaXN0ZWQgYWZ0ZXIgZWFjaCBjYWxsIHNvIHByb2dyZXNzIGlzbid0IGxvc3QuXG4gICAqIFNlc3Npb24gaXMgcmUtZmV0Y2hlZCBiZXR3ZWVuIGl0ZXJhdGlvbnMgKGNvbmZpZyBtYXkgY2hhbmdlKSxcbiAgICogcGFyYWxsZWxpemVkIHdpdGggcGFydCBwZXJzaXN0ZW5jZSBvbiBub24tZmluYWwgaXRlcmF0aW9ucy5cbiAgICovXG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBpbnRlcm5hbFN0ZXBJbmRleCA9IDA7XG4gIGxldCBsb29wRmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb24gPSBcInVua25vd25cIiBhcyBGaW5pc2hSZWFzb247XG4gIGxldCB3YXNBYm9ydGVkID0gZmFsc2U7XG4gIGNvbnN0IGFsbFBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgY3VycmVudE1heFN0ZXBzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGxldCBpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCBzdGVwVGhyb3VnaHB1dDsgaXRlcmF0aW9uKyspIHtcbiAgICAgIC8vIFJlc29sdmUgYWdlbnQgb3B0aW9ucyBmcmVzaCBlYWNoIGl0ZXJhdGlvblxuICAgICAgY29uc3QgcmVzb2x2ZWRNb2RlbCA9IGF3YWl0IHJlc29sdmVPcHRpb24oXG4gICAgICAgIGFnZW50Lm9wdGlvbnMubW9kZWwsXG4gICAgICAgIHJlc29sdmFibGVBcmdzXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzb2x2ZWRHZW5lcmF0aW9uID0gYXdhaXQgcmVzb2x2ZU9wdGlvbihcbiAgICAgICAgYWdlbnQub3B0aW9ucy5nZW5lcmF0aW9uLFxuICAgICAgICByZXNvbHZhYmxlQXJnc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQWN0aXZlVG9vbHMgPSAoYXdhaXQgcmVzb2x2ZU9wdGlvbihcbiAgICAgICAgYWdlbnQub3B0aW9ucy5hY3RpdmVUb29scyxcbiAgICAgICAgcmVzb2x2YWJsZUFyZ3NcbiAgICAgICkpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgICBjdXJyZW50TWF4U3RlcHMgPSByZXNvbHZlZEdlbmVyYXRpb24/Lm1heFN0ZXBzO1xuXG4gICAgICBpZiAoIXJlc29sdmVkTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWdlbnQgbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RlcFBhcnRzOiBVSU1lc3NhZ2VbXCJwYXJ0c1wiXSA9IFtdO1xuICAgICAgbGV0IHN0cmVhbVRleHRGaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyByYXdUb29scywgdG9vbHNXaXRoTmVlZHNBcHByb3ZhbCwgdG9vbENvbnRleHQgfSA9IGdldFRvb2xzKHtcbiAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgIHNraWxsc1JlZixcbiAgICAgICAgICAgICAgd3JpdGVyLFxuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgICAgICAgIG5leHRQYXJ0SW5kZXhSZWYsXG4gICAgICAgICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBzdGVwTG9nLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBtZXNzYWdlczogdWlNZXNzYWdlcyxcbiAgICAgICAgICAgICAgYWN0aXZlVG9vbHM6IHJlc29sdmVkQWN0aXZlVG9vbHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gcHJvY2VzcyBhcHByb3ZhbHMgb25jZSAoZmlyc3QgaXRlcmF0aW9uIG9ubHkpXG4gICAgICAgICAgICBpZiAoaXRlcmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NBcHByb3ZhbHMoe1xuICAgICAgICAgICAgICAgIGFsbFBhcnRzLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzUmVzdWx0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICByYXdUb29scyxcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdG9vbENvbnRleHQsXG4gICAgICAgICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgICAgICAgc3RlcExvZyxcbiAgICAgICAgICAgICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzLFxuICAgICAgICAgICAgICAgIHdyaXRlcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICAgICAgICB3cml0ZXIsXG4gICAgICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcInRoaW5raW5nXCIgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBpdGVyUmVzdWx0ID0gc3RyZWFtVGV4dEFpKHtcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LCBjb250ZW50OiBcIi5cIiB9XSxcbiAgICAgICAgICAgICAgdG9vbHM6IHRvb2xzV2l0aE5lZWRzQXBwcm92YWwsXG4gICAgICAgICAgICAgIG1vZGVsOiByZXNvbHZlZE1vZGVsLFxuICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDEpLFxuICAgICAgICAgICAgICB0ZW1wZXJhdHVyZTogcmVzb2x2ZWRHZW5lcmF0aW9uPy50ZW1wZXJhdHVyZSxcbiAgICAgICAgICAgICAgdG9wSzogcmVzb2x2ZWRHZW5lcmF0aW9uPy50b3BLLFxuICAgICAgICAgICAgICB0b3BQOiByZXNvbHZlZEdlbmVyYXRpb24/LnRvcFAsXG4gICAgICAgICAgICAgIGZyZXF1ZW5jeVBlbmFsdHk6IHJlc29sdmVkR2VuZXJhdGlvbj8uZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgICAgICAgICAgcHJlc2VuY2VQZW5hbHR5OiByZXNvbHZlZEdlbmVyYXRpb24/LnByZXNlbmNlUGVuYWx0eSxcbiAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiByZXNvbHZlZEdlbmVyYXRpb24/Lm1heE91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzb2x2ZWRHZW5lcmF0aW9uPy5oZWFkZXJzLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDoge1xuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgbWVzc2FnZXM6IHVpTWVzc2FnZXMsXG4gICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFRvb2xDb250ZXh0LFxuICAgICAgICAgICAgICBwcmVwYXJlU3RlcDogYXN5bmMgKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNraWxsc0NvbnRleHQgPSBidWlsZFNraWxsc0NvbnRleHQoc2tpbGxzUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN3ZFByb21wdCA9IGBZb3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzICR7c2FuZGJveC5jd2R9LiBBbGwgZmlsZSBwYXRocyBzaG91bGQgYmUgYWJzb2x1dGUuYDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3lzdGVtID0gYXdhaXQgcmVzb2x2ZVN5c3RlbShcbiAgICAgICAgICAgICAgICAgIGFnZW50Lm9wdGlvbnMuc3lzdGVtLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2YWJsZUFyZ3NcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3lzdGVtSGVhZGVyID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgQkFTRV9TWVNURU1fUFJPTVBULFxuICAgICAgICAgICAgICAgICAgY3dkUHJvbXB0LFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRTeXN0ZW1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5c3RlbUNvbnRleHQgPSBqb2luUHJvbXB0U2VjdGlvbnMoXG4gICAgICAgICAgICAgICAgICBza2lsbHNDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY3dkUHJvbXB0XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZE1lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgICAgICAgICAgIHVpTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICB7IGlnbm9yZUluY29tcGxldGVUb29sQ2FsbHM6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE1lc3NhZ2VzID0gW1xuICAgICAgICAgICAgICAgICAgLi4uKHN5c3RlbUhlYWRlci50cmltKClcbiAgICAgICAgICAgICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1IZWFkZXIgfV1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAuLi4oc3lzdGVtQ29udGV4dC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgPyBbeyByb2xlOiBcInN5c3RlbVwiIGFzIGNvbnN0LCBjb250ZW50OiBzeXN0ZW1Db250ZXh0IH1dXG4gICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgLi4uY29udmVydGVkTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdENhY2hpbmcgPSBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgICBtb2RlbDogdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBtb2RlbC5tb2RlbElkLFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IG1vZGVsTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlVG9vbHMgPSByZXNvbHZlZEFjdGl2ZVRvb2xzID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc2tpbGxzUmVmLmN1cnJlbnQubGVuZ3RoID09PSAwICYmIGFjdGl2ZVRvb2xzKSB7XG4gICAgICAgICAgICAgICAgICBhY3RpdmVUb29scyA9IGFjdGl2ZVRvb2xzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQgIT09IChcIlNraWxsXCIgc2F0aXNmaWVzIEJ1aWx0SW5Ub29sTmFtZSlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcm9tcHRDYWNoaW5nLm1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm9tcHRDYWNoaW5nLnByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVRvb2xzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uU3RlcEZpbmlzaDogKHsgdXNhZ2UgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICAgICAgICAgICAgdXNhZ2VTdGVwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcEluZGV4OiBzdGVwSW5kZXhPZmZzZXQgKyBpbnRlcm5hbFN0ZXBJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHJlc29sdmVkTW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbFRva2VuczogdXNhZ2UudG90YWxUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOlxuICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVJlYWRUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVXcml0ZVRva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVXcml0ZVRva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdUb2tlbnM6XG4gICAgICAgICAgICAgICAgICAgICAgdXNhZ2Uub3V0cHV0VG9rZW5EZXRhaWxzPy5yZWFzb25pbmdUb2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnRlcm5hbFN0ZXBJbmRleCsrO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdyaXRlci5tZXJnZShcbiAgICAgICAgICAgICAgaXRlclJlc3VsdC50b1VJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXNzYWdlSWQ6ICgpID0+IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBvbkZpbmlzaDogKHsgbWVzc2FnZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUGFydHMucHVzaCguLi5tLnBhcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBzdHJlYW1UZXh0RmluaXNoUmVhc29uID0gYXdhaXQgaXRlclJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgc3RyZWFtLnBpcGVUbyh3cml0YWJsZSwge1xuICAgICAgICAgIHByZXZlbnRDbG9zZTogdHJ1ZSxcbiAgICAgICAgICBwcmV2ZW50QWJvcnQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBpbnRlcnJ1cHRlZCB0b29sIHBhcnRzXG4gICAgICBpZiAod2FzQWJvcnRlZCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwib3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgIFwib3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgXCJkb25lXCIsXG4gICAgICAgIF0pO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2Ygc3RlcFBhcnRzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJ0eXBlXCIgaW4gcGFydCAmJlxuICAgICAgICAgICAgdHlwZW9mIHBhcnQudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgcGFydC50eXBlLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSAmJlxuICAgICAgICAgICAgXCJzdGF0ZVwiIGluIHBhcnQgJiZcbiAgICAgICAgICAgICF0ZXJtaW5hbFN0YXRlcy5oYXMocGFydC5zdGF0ZSBhcyBzdHJpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAocGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPSBcIm91dHB1dC1lcnJvclwiO1xuICAgICAgICAgICAgKHBhcnQgYXMgeyBlcnJvclRleHQ/OiBzdHJpbmcgfSkuZXJyb3JUZXh0ID0gXCJpbnRlcnJ1cHRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaW50ZXJydXB0ZWQgbGFzdFBhcnQgdHJ1bmNhdGlvblxuICAgICAgY29uc3QgbGFzdFBhcnQgPSBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmLmN1cnJlbnQ7XG5cbiAgICAgIGNvbnN0IG5ld1BhcnRSZWNvcmRzID0gc3RlcFBhcnRzXG4gICAgICAgIC5tYXAoKHVpUGFydCwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgaTtcbiAgICAgICAgICBpZiAobGFzdFBhcnQgIT0gbnVsbCAmJiBpbmRleCA+IGxhc3RQYXJ0LmluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdXNlQ2xpZW50UGFydCA9IGxhc3RQYXJ0ICE9IG51bGwgJiYgaW5kZXggPT09IGxhc3RQYXJ0LmluZGV4O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAoXG4gICAgICAgICAgICB1c2VDbGllbnRQYXJ0ID8gbGFzdFBhcnQucGFydCA6IHVpUGFydFxuICAgICAgICAgICkgYXMgVHlwZWRVSU1lc3NhZ2U8VG9vbHM+W1wicGFydHNcIl1bbnVtYmVyXTtcbiAgICAgICAgICBjb25zdCBwYXJ0SWQgPVxuICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIGNvbnRlbnQgJiYgY29udGVudC5hcHByb3ZhbD8uaWRcbiAgICAgICAgICAgICAgPyBhcHByb3ZhbFBhcnRJZChjb250ZW50LmFwcHJvdmFsLmlkKVxuICAgICAgICAgICAgICA6IGBwYXJ0XyR7YXNzaXN0YW50TWVzc2FnZUlkfV8ke2luZGV4fWA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcGFydDogY29udGVudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChyKTogciBpcyBOb25OdWxsYWJsZTx0eXBlb2Ygcj4gPT4gciAhPT0gbnVsbCk7XG5cbiAgICAgIGNvbnN0IHBlcnNpc3RQYXJ0c1Byb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICAgICAgbmV3UGFydFJlY29yZHMubWFwKChyZWNvcmQpID0+XG4gICAgICAgICAgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChyZWNvcmQuaWQsIHJlY29yZClcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ID1cbiAgICAgICAgbGFzdFBhcnQgIT0gbnVsbFxuICAgICAgICAgID8gTWF0aC5taW4oXG4gICAgICAgICAgICAgIG5leHRQYXJ0SW5kZXhSZWYuY3VycmVudCArIHN0ZXBQYXJ0cy5sZW5ndGgsXG4gICAgICAgICAgICAgIGxhc3RQYXJ0LmluZGV4ICsgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50ICsgc3RlcFBhcnRzLmxlbmd0aDtcblxuICAgICAgY29uc3QgaXRlclBlbmRpbmdBcHByb3ZhbHMgPSBzdGVwUGFydHNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAocCk6IHAgaXMgdHlwZW9mIHAgJiB7IGFwcHJvdmFsOiB7IGlkOiBzdHJpbmcgfSB9ID0+XG4gICAgICAgICAgICBcInN0YXRlXCIgaW4gcCAmJlxuICAgICAgICAgICAgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiAmJlxuICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAgJiZcbiAgICAgICAgICAgICEhKHAgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pLmFwcHJvdmFsPy5pZFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKHApID0+ICh7XG4gICAgICAgICAgYXBwcm92YWxJZDogcC5hcHByb3ZhbC5pZCxcbiAgICAgICAgICB0b29sTmFtZTpcbiAgICAgICAgICAgIFwidHlwZVwiIGluIHAgPyBTdHJpbmcocC50eXBlKS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIikgOiBcInVua25vd25cIixcbiAgICAgICAgfSkpO1xuXG4gICAgICBsb29wRmluaXNoUmVhc29uID0gd2FzQWJvcnRlZFxuICAgICAgICA/IChcInN0b3BcIiBhcyBGaW5pc2hSZWFzb24pXG4gICAgICAgIDogKHN0cmVhbVRleHRGaW5pc2hSZWFzb24gPz8gKFwidW5rbm93blwiIGFzIEZpbmlzaFJlYXNvbikpO1xuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBicmVhayBvciBjb250aW51ZVxuICAgICAgY29uc3Qgc2hvdWxkQnJlYWsgPVxuICAgICAgICBpdGVyUGVuZGluZ0FwcHJvdmFscy5sZW5ndGggPiAwIHx8XG4gICAgICAgIGxvb3BGaW5pc2hSZWFzb24gPT09IFwic3RvcFwiIHx8XG4gICAgICAgIHdhc0Fib3J0ZWQgfHxcbiAgICAgICAgbGFzdFBhcnQgIT0gbnVsbCB8fFxuICAgICAgICAoY3VycmVudE1heFN0ZXBzICE9IG51bGwgJiZcbiAgICAgICAgICBzdGVwSW5kZXhPZmZzZXQgKyB1c2FnZVN0ZXBzLmxlbmd0aCA+PSBjdXJyZW50TWF4U3RlcHMpIHx8XG4gICAgICAgIGl0ZXJhdGlvbiA+PSBzdGVwVGhyb3VnaHB1dCAtIDE7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykge1xuICAgICAgICBhd2FpdCBwZXJzaXN0UGFydHNQcm9taXNlO1xuICAgICAgICBhbGxQYXJ0cy5wdXNoKC4uLm5ld1BhcnRSZWNvcmRzKTtcbiAgICAgICAgYWxsUGVuZGluZ0FwcHJvdmFscy5wdXNoKC4uLml0ZXJQZW5kaW5nQXBwcm92YWxzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vbi1maW5hbCBpdGVyYXRpb246IHBlcnNpc3QgcGFydHMgYW5kIHJlYnVpbGQgbWVzc2FnZXNcbiAgICAgIGF3YWl0IHBlcnNpc3RQYXJ0c1Byb21pc2U7XG4gICAgICBhbGxQYXJ0cy5wdXNoKC4uLm5ld1BhcnRSZWNvcmRzKTtcbiAgICAgIHVpTWVzc2FnZXMgPSBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgdW50aWw6IGNyZWF0ZWRBdCxcbiAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBwb2xsQ29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRocm90dGxlZEVtaXRTdGF0dXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgaWYgKHNldFN0YXJ0ZWRQcm9taXNlKSB7XG4gICAgYXdhaXQgc2V0U3RhcnRlZFByb21pc2U7XG4gIH1cblxuICBkb25lU3RlcCh7XG4gICAgZmluaXNoUmVhc29uOiBsb29wRmluaXNoUmVhc29uLFxuICAgIHdhc0Fib3J0ZWQsXG4gICAgaXRlcmF0aW9uczogaW50ZXJuYWxTdGVwSW5kZXgsXG4gICAgcGVuZGluZ0FwcHJvdmFsczogYWxsUGVuZGluZ0FwcHJvdmFscy5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZmluaXNoUmVhc29uOiBsb29wRmluaXNoUmVhc29uLFxuICAgIGxhc3RQYXJ0SW5kZXg6IG5leHRQYXJ0SW5kZXhSZWYuY3VycmVudCxcbiAgICB1c2FnZVN0ZXBzLFxuICAgIHBlbmRpbmdBcHByb3ZhbHM6IGFsbFBlbmRpbmdBcHByb3ZhbHMsXG4gICAgbWF4U3RlcHM6IGN1cnJlbnRNYXhTdGVwcyxcbiAgICBkaXNjb3ZlcmVkU2tpbGxzOiBza2lsbHNSZWYuY3VycmVudCxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogU3RlcHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRleHRTdGVwPFRvb2xzIGV4dGVuZHMgVG9vbFNldD4oXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHN0cmVhbVRleHQ8VG9vbHM+PlxuKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgcmV0dXJuIGF3YWl0IHN0cmVhbVRleHQoLi4uYXJncyk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFV0aWxzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NBcHByb3ZhbHMoe1xuICBhbGxQYXJ0cyxcbiAgbWVzc2FnZXNSZXN1bHQsXG4gIGNyZWF0ZWRBdCxcbiAgcmF3VG9vbHMsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgdG9vbENvbnRleHQsXG4gIGFnZW50LFxuICBzdGVwTG9nLFxuICB0aHJvdHRsZWRFbWl0U3RhdHVzLFxuICB3cml0ZXIsXG59OiB7XG4gIGFsbFBhcnRzOiBQYXJ0W107XG4gIG1lc3NhZ2VzUmVzdWx0OiBQYXJhbWV0ZXJzPHR5cGVvZiBhc3NlbWJsZVVJTWVzc2FnZXM+WzBdW1wibWVzc2FnZXNcIl07XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICByYXdUb29sczogVG9vbFNldDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHRvb2xDb250ZXh0OiBUb29sQ29udGV4dDtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzdGVwTG9nOiBMb2dnZXI7XG4gIHRocm90dGxlZEVtaXRTdGF0dXM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXM+O1xuICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbn0pIHtcbiAgLy8gRXhlY3V0ZSBhcHByb3ZlZCB0b29scyBzbyB0aGUgbW9kZWwgc2VlcyBjb21wbGV0ZSB0b29sIGNhbGwgKyByZXN1bHQgcGFpcnNcbiAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT5cbiAgICAgIHAucGFydCAmJlxuICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgJiZcbiAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnQgJiZcbiAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ6IGJvb2xlYW4gfSB9KS5hcHByb3ZhbD8uYXBwcm92ZWQgPT09XG4gICAgICAgIHRydWVcbiAgKTtcblxuICBpZiAoYXBwcm92ZWRQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgc3RlcExvZy5pbmZvKFwiZXhlY3V0aW5nIGFwcHJvdmVkIHRvb2xzXCIsIHtcbiAgICAgIGNvdW50OiBhcHByb3ZlZFBhcnRzLmxlbmd0aCxcbiAgICB9KTtcbiAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgIHdyaXRlcixcbiAgICAgIHN0YXR1czogeyB0eXBlOiBcInByb2Nlc3NpbmctYXBwcm92YWxzXCIgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZUV4ZWNNZXNzYWdlcyA9IGF3YWl0IGNvbnZlcnRUb01vZGVsTWVzc2FnZXMoXG4gICAgICBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXNSZXN1bHQsXG4gICAgICAgIHBhcnRzOiBhbGxQYXJ0cyxcbiAgICAgICAgdW50aWw6IGNyZWF0ZWRBdCxcbiAgICAgICAgaW5jbHVkZVF1ZXVlZDogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVN1YlRvb2xQYXJ0czogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgeyBpZ25vcmVJbmNvbXBsZXRlVG9vbENhbGxzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcHByb3ZlZFBhcnRzLm1hcChhc3luYyAoYXApID0+IHtcbiAgICAgICAgaWYgKCFhcC5wYXJ0LnR5cGUuc3RhcnRzV2l0aChcInRvb2wtXCIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnQgPSBhcC5wYXJ0IGFzIEV4dHJhY3Q8XG4gICAgICAgICAgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgICB7IHR5cGU6IGB0b29sLSR7c3RyaW5nfWAgfVxuICAgICAgICA+O1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcnQudHlwZS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIik7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSByYXdUb29sc1t0b29sTmFtZV07XG5cbiAgICAgICAgaWYgKHRvb2xEZWY/LmV4ZWN1dGUgJiYgcGFydC5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xPdXRwdXQgPSBhd2FpdCB0b29sRGVmLmV4ZWN1dGUocGFydC5pbnB1dCwge1xuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcmVFeGVjTWVzc2FnZXMsXG4gICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1hdmFpbGFibGVcIjtcbiAgICAgICAgICAgIHBhcnQub3V0cHV0ID0gdG9vbE91dHB1dDtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgb3V0cHV0OiB0b29sT3V0cHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgICAgIHBhcnQuZXJyb3JUZXh0ID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIGVycm9yVGV4dDogcGFydC5lcnJvclRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChhcC5pZCwgeyAuLi5hcCwgcGFydCB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gQXV0by1kZW55IGFueSByZW1haW5pbmcgYXBwcm92YWwtcmVxdWVzdGVkIHBhcnRzIHNvIHRoZSBtb2RlbFxuICAvLyBzZWVzIGNvbXBsZXRlIHRvb2wgY2FsbCArIGRlbmllZCByZXN1bHQgcGFpcnMgKG5vdCBtaXNzaW5nIHJlc3VsdHMpLlxuICBjb25zdCBwZW5kaW5nQXBwcm92YWxQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAocCkgPT4gKHAucGFydCBhcyB7IHN0YXRlPzogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiXG4gICk7XG4gIGlmIChwZW5kaW5nQXBwcm92YWxQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwZW5kaW5nQXBwcm92YWxQYXJ0cy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgICAgY29uc3QgZGVuaWVkID0ge1xuICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgc3RhdGU6IFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgLi4uKChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IG9iamVjdCB9KS5hcHByb3ZhbCA/PyB7fSksXG4gICAgICAgICAgICAgIGFwcHJvdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBcImF1dG8tZGVuaWVkOiBuZXcgbWVzc2FnZSBzZW50XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgdHlwZW9mIHAucGFydCxcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwLCBkZW5pZWQpO1xuICAgICAgICBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuc2V0KHAuaWQsIGRlbmllZCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxudHlwZSBTdHJlYW1Xcml0ZXIgPSBVSU1lc3NhZ2VTdHJlYW1Xcml0ZXI7XG5cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgYWdlbnQsXG59OiB7XG4gIHdyaXRlcjogU3RyZWFtV3JpdGVyO1xuICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICBhZ2VudDogQW55QWdlbnQ7XG59KSB7XG4gIHdyaXRlci53cml0ZSh7IHR5cGU6IFwiZGF0YS1zdGF0dXNcIiwgZGF0YTogc3RhdHVzLCB0cmFuc2llbnQ6IHRydWUgfSk7XG4gIGFnZW50Lmhvb2tzPy5zdGF0dXM/LihzdGF0dXMpO1xufVxuXG5jb25zdCBTVEFUVVNfVEhST1RUTEVfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXMoYWdlbnQ6IEFueUFnZW50KSB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHBlbmRpbmc6IHtcbiAgICB3cml0ZXI6IFN0cmVhbVdyaXRlcjtcbiAgICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdGhyb3R0bGVkKHtcbiAgICB3cml0ZXIsXG4gICAgc3RhdHVzLFxuICB9OiB7XG4gICAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gICAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgfSkge1xuICAgIHBlbmRpbmcgPSB7IHdyaXRlciwgc3RhdHVzIH07XG4gICAgaWYgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfSwgU1RBVFVTX1RIUk9UVExFX01TKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHdyaXRlciwgc3RhdHVzIH0gPSBwZW5kaW5nO1xuICAgIHBlbmRpbmcgPSBudWxsO1xuICAgIGVtaXRTdGF0dXMoeyB3cml0ZXIsIHN0YXR1cywgYWdlbnQgfSk7XG4gIH1cblxuICB0aHJvdHRsZWQuZGlzcG9zZSA9ICgpID0+IHtcbiAgICBpZiAodGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZsdXNoKCk7XG4gIH07XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbjxUPihcbiAgdmFsdWU6IFJlc29sdmFibGU8VD4gfCB1bmRlZmluZWQsXG4gIGFyZ3M6IFJlc29sdmFibGVBcmdzXG4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBhd2FpdCAodmFsdWUgYXMgKGFyZ3M6IFJlc29sdmFibGVBcmdzKSA9PiBUIHwgUHJvbWlzZTxUPikoYXJncyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU3lzdGVtKFxuICBpbnB1dDogUmVzb2x2YWJsZTxzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQsXG4gIGFyZ3M6IFJlc29sdmFibGVBcmdzXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZU9wdGlvbihpbnB1dCwgYXJncyk7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdC5maWx0ZXIoQm9vbGVhbikuam9pbihcIlxcblwiKSA6IHJlc3VsdDtcbn1cblxuY29uc3QgQkFTRV9TWVNURU1fUFJPTVBUID1cbiAgXCJZb3UgYXJlIGFuIEFJIGFzc2lzdGFudCB3aXRoIGJhc2ljIHRvb2xzIHRvIGludGVyYWN0IHdpdGggeW91ciBlbnZpcm9ubWVudC4gRXhwbG9yZSBhbmQgd29yayBmcmVlbHkuXCI7XG5cbmZ1bmN0aW9uIGpvaW5Qcm9tcHRTZWN0aW9ucyhcbiAgLi4uc2VjdGlvbnM6IChzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKVtdXG4pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMuZmlsdGVyKChzKSA9PiBzPy50cmltKCkpLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbmNvbnN0IGJhY2tncm91bmRQcm9jZXNzUHJvbXB0ID0gYCMjIEJhY2tncm91bmQgUHJvY2Vzc2VzXG5UaGVzZSBiYWNrZ3JvdW5kIHByb2Nlc3MgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgeW91IHRvIG1hbmlwdWxhdGUgdGhlIHByb2Nlc3NlcywgZG8gbm90IGJlIHRvIHZlcmJvc2UgdG8gdGhlIHVzZXIgYWJvdXQgdGhlIHJlc3BvbnNlIGRldGFpbHMgbGlrZSBcImhvdyB0byBkZWJ1ZyB0aGUgcHJvY2VzcyBvdXRwdXRcIiB0aGUgdXNlciB3aWxsIGhhdmUgYW4gVUkuXG5cblVzZSBcXGB3YWl0VW50aWw6IDBcXGAgZm9yIGRldiBzZXJ2ZXJzIHRoYXQgc2hvdWxkIHJ1biBpbmRlZmluaXRlbHkuXG5JdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gY2hlY2sgdGhlIG91dHB1dCBsb2cgYWZ0ZXIgcnVubmluZyBwcm9jZXNzZXMgbGlrZSBkZXYgc2VydmVycyB0byBtYWtlIHN1cmUgdGhleSBzdGFydGVkIGNvcnJlY3RseS5cblxuVG8gcnVuIGEgYmFja2dyb3VuZCBwcm9jZXNzOlxuQmFzaCh7IGNvbW1hbmQ6IFwibnBtIHJ1biBkZXZcIiwgd2FpdFVudGlsOiAwIH0pXG5SZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggXFxgY29tbWFuZElkXFxgLiBUaGUgcHJvY2VzcyBrZWVwcyBydW5uaW5nIGluIHRoZSBzYW5kYm94LlxuXG5UbyBraWxsIGEgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcInBzIGF1eCB8IGdyZXAgbm9kZVwiIH0pICAgLy8gRmluZCB0aGUgUElEXG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgICAgICAvLyBHcmFjZWZ1bFxuQmFzaCh7IGNvbW1hbmQ6IFwia2lsbCAtOSB7cGlkfVwiIH0pICAgICAgICAgLy8gRm9yY2VcbmA7XG5cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHM6IFNraWxsU3VtbWFyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGNvbnN0IHNraWxsTGluZXMgPSBza2lsbHNcbiAgICAubWFwKChzKSA9PiBgLSAke3MubmFtZX06ICR7cy5kZXNjcmlwdGlvbn1gKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIHJldHVybiBgIyMgQXZhaWxhYmxlIFNraWxsc1xuJHtza2lsbExpbmVzfVxuXG4ke2JhY2tncm91bmRQcm9jZXNzUHJvbXB0fVxuXG5Vc2UgdGhlIFNraWxsIHRvb2wgdG8gbG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYmVmb3JlIGZvbGxvd2luZyBpdC5gO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2tpbGxFbnRyeSwgU2tpbGxJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUGFyc2VkIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZyb250bWF0dGVyID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlIGNvbnRlbnQuXG4gKiBGcm9udG1hdHRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgZGVsaW1pdGVkIGJ5IGAtLS1gIG1hcmtlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYG1hcmtkb3duXG4gKiAtLS1cbiAqIG5hbWU6IGNzdlxuICogZGVzY3JpcHRpb246IEFuYWx5emUgQ1NWIGRhdGFcbiAqIC0tLVxuICogIyBDU1YgU2tpbGxcbiAqIC4uLlxuICogYGBgXG4gKlxuICogQHJldHVybnMgUGFyc2VkIG5hbWUgYW5kIGRlc2NyaXB0aW9uLCBvciBudWxsIGlmIGZyb250bWF0dGVyIGlzIG1pc3NpbmcvaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKFxuICBjb250ZW50OiBzdHJpbmdcbik6IFNraWxsRnJvbnRtYXR0ZXIgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGNvbnRlbnQudHJpbSgpO1xuXG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBlbmRNYXJrZXJJbmRleCA9IHRyaW1tZWQuaW5kZXhPZihcIi0tLVwiLCAzKTtcbiAgaWYgKGVuZE1hcmtlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXJCbG9jayA9IHRyaW1tZWQuc2xpY2UoMywgZW5kTWFya2VySW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTaW1wbGVZYW1sKGZyb250bWF0dGVyQmxvY2spO1xuXG4gIGlmICghKHBhcnNlZC5uYW1lICYmIHBhcnNlZC5kZXNjcmlwdGlvbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogU3RyaW5nKHBhcnNlZC5uYW1lKSxcbiAgICBkZXNjcmlwdGlvbjogU3RyaW5nKHBhcnNlZC5kZXNjcmlwdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHNpbXBsZSBZQU1MIGtleS12YWx1ZSBwYWlycyAoc2luZ2xlLWxpbmUgdmFsdWVzIG9ubHkpLlxuICogVGhpcyBhdm9pZHMgYWRkaW5nIGEgZnVsbCBZQU1MIHBhcnNlciBkZXBlbmRlbmN5IGZvciBiYXNpYyBmcm9udG1hdHRlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaW1wbGVZYW1sKHlhbWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgeWFtbC5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb25JbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnNsaWNlKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzIGlmIHByZXNlbnRcbiAgICBpZiAoXG4gICAgICAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTa2lsbHMoXG4gIHNraWxsczogU2tpbGxJbnB1dFtdIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogU2tpbGxFbnRyeVtdIHtcbiAgaWYgKCFza2lsbHMgfHwgc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBza2lsbHMubWFwKChza2lsbCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2tpbGwgIT09IFwib2JqZWN0XCIgfHwgc2tpbGwgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIHNraWxscyBlbnRyeTogZXhwZWN0ZWQgYW4gb2JqZWN0IHdpdGggYSBgdHlwZWAgZmllbGQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInR5cGVcIiBpbiBza2lsbCAmJiBza2lsbC50eXBlKSB7XG4gICAgICByZXR1cm4gc2tpbGwgYXMgU2tpbGxFbnRyeTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBza2lsbHMgZW50cnk6IGV4cGVjdGVkIGB0eXBlYC5cIik7XG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBwYXJzZVNraWxsRnJvbnRtYXR0ZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBEaXNjb3ZlcnMgc2tpbGxzIGZyb20gZGlyZWN0b3JpZXMgaW5zaWRlIHRoZSBzYW5kYm94IGJ5IGZpbmRpbmcgYW5kIHBhcnNpbmcgU0tJTEwubWQgZmlsZXMuXG4gKiBTY2FucyBlYWNoIGRpcmVjdG9yeSBmb3Igc3ViZGlyZWN0b3JpZXMgY29udGFpbmluZyBTS0lMTC5tZCwgZXh0cmFjdHMgZnJvbnRtYXR0ZXIgbWV0YWRhdGEsXG4gKiBhbmQgcmV0dXJucyBzdW1tYXJpZXMgZm9yIHVzZSBpbiB0aGUgc3lzdGVtIHByb21wdC5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBza2lsbCBzdW1tYXJpZXMgKGRlZHVwbGljYXRlZCBieSBuYW1lLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luU2FuZGJveChvcHRzOiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbHNEaXJzOiBzdHJpbmdbXTtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBhZ2VudCwgc2FuZGJveCwgc2tpbGxzRGlycywgc2Vzc2lvbklkIH0gPSBvcHRzO1xuICBjb25zdCBiYXNlTG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBhZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNraWxsc1wiLFxuICB9KTtcbiAgY29uc3QgbG9nID0gc2Vzc2lvbklkID8gYmFzZUxvZy53aXRoQ29udGV4dCh7IHNlc3Npb25JZCB9KSA6IGJhc2VMb2c7XG4gIGNvbnN0IGRvbmUgPSBsb2cudGltZShcImRpc2NvdmVyU2tpbGxzSW5TYW5kYm94XCIpO1xuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcbiAgY29uc3Qgc2Vlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBza2lsbHNEaXIgb2Ygc2tpbGxzRGlycykge1xuICAgIGNvbnN0IGRpckRvbmUgPSBsb2cudGltZShcInNjYW4gZGlyZWN0b3J5XCIsIHsgZGlyOiBza2lsbHNEaXIgfSk7XG4gICAgY29uc3QgZGlyU3VtbWFyaWVzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeSh7XG4gICAgICBzYW5kYm94LFxuICAgICAgc2tpbGxzRGlyLFxuICAgICAgbG9nLFxuICAgIH0pO1xuICAgIGRpckRvbmUoeyBjb3VudDogZGlyU3VtbWFyaWVzLmxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBkaXJTdW1tYXJpZXMpIHtcbiAgICAgIGlmICghc2Vlbk5hbWVzLmhhcyhzdW1tYXJ5Lm5hbWUpKSB7XG4gICAgICAgIHNlZW5OYW1lcy5hZGQoc3VtbWFyeS5uYW1lKTtcbiAgICAgICAgc3VtbWFyaWVzLnB1c2goc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZG9uZSh7IHRvdGFsU2tpbGxzOiBzdW1tYXJpZXMubGVuZ3RoIH0pO1xuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsc0Rpcjogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBsb2cgfSA9IG9wdHM7XG4gIGNvbnN0IHNraWxsUGF0aHMgPSBhd2FpdCBmaW5kU2tpbGxGaWxlcyh7IHNhbmRib3gsIHNraWxsc0RpciwgbG9nIH0pO1xuXG4gIGlmIChza2lsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNraWxsTWRQYXRoIG9mIHNraWxsUGF0aHMpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgcGFyc2VTa2lsbEZpbGUoeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgbG9nIH0pO1xuICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kU2tpbGxGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGxvZzogTG9nZ2VyO1xufSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGxvZyB9ID0gb3B0cztcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImZpbmRcIixcbiAgICBhcmdzOiBbc2tpbGxzRGlyLCBcIi1uYW1lXCIsIFwiU0tJTEwubWRcIiwgXCItdHlwZVwiLCBcImZcIl0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byBzY2FuIHNraWxscyBkaXJlY3RvcnlcIiwge1xuICAgICAgZGlyOiBza2lsbHNEaXIsXG4gICAgICBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgbG9nLndhcm4oXCJza2lsbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBpbmFjY2Vzc2libGVcIiwgeyBkaXI6IHNraWxsc0RpciB9KTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gc3Rkb3V0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2tpbGxGaWxlKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbE1kUGF0aDogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeSB8IG51bGw+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgbG9nIH0gPSBvcHRzO1xuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImNhdFwiLFxuICAgIGFyZ3M6IFtza2lsbE1kUGF0aF0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBsb2cud2FybihcImZhaWxlZCB0byByZWFkIHNraWxsIGZpbGVcIiwge1xuICAgICAgcGF0aDogc2tpbGxNZFBhdGgsXG4gICAgICBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBsb2cud2FybihcImNvdWxkIG5vdCByZWFkIHNraWxsIGZpbGVcIiwgeyBwYXRoOiBza2lsbE1kUGF0aCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihzdGRvdXQpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgbG9nLndhcm4oXCJpbnZhbGlkIG9yIG1pc3NpbmcgZnJvbnRtYXR0ZXJcIiwgeyBwYXRoOiBza2lsbE1kUGF0aCB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgZGVzY3JpcHRpb246IHBhcnNlZC5kZXNjcmlwdGlvbixcbiAgICBza2lsbE1kUGF0aCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9zYW5kYm94L2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgSG9zdFNraWxsSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RmlsZXMob3B0czoge1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbiAgcmVsYXRpdmVQcmVmaXg/OiBzdHJpbmc7XG59KTogUHJvbWlzZTx7IHBhdGg6IHN0cmluZzsgY29udGVudDogQnVmZmVyIH1bXT4ge1xuICBjb25zdCB7IHJlYWRkaXIsIHJlYWRGaWxlLCBzdGF0IH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICBjb25zdCB7IHJlc29sdmUsIHBvc2l4OiBwYXRoUG9zaXggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcblxuICBjb25zdCBmaWxlU3RhdCA9IGF3YWl0IHN0YXQob3B0cy5hYnNvbHV0ZVBhdGgpO1xuICBpZiAoZmlsZVN0YXQuaXNGaWxlKCkpIHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUob3B0cy5hYnNvbHV0ZVBhdGgpO1xuICAgIHJldHVybiBbeyBwYXRoOiBvcHRzLnJlbGF0aXZlUHJlZml4ID8/IFwiU0tJTEwubWRcIiwgY29udGVudCB9XTtcbiAgfVxuXG4gIGlmICghZmlsZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKG9wdHMuYWJzb2x1dGVQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogQnVmZmVyIH1bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5leHRBYnMgPSByZXNvbHZlKG9wdHMuYWJzb2x1dGVQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCBuZXh0UmVsID0gb3B0cy5yZWxhdGl2ZVByZWZpeFxuICAgICAgPyBwYXRoUG9zaXguam9pbihvcHRzLnJlbGF0aXZlUHJlZml4LCBlbnRyeS5uYW1lKVxuICAgICAgOiBlbnRyeS5uYW1lO1xuXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZpbGVzLnB1c2goXG4gICAgICAgIC4uLihhd2FpdCBjb2xsZWN0RmlsZXMoe1xuICAgICAgICAgIGFic29sdXRlUGF0aDogbmV4dEFicyxcbiAgICAgICAgICByZWxhdGl2ZVByZWZpeDogbmV4dFJlbCxcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgcGF0aDogbmV4dFJlbCxcbiAgICAgICAgY29udGVudDogYXdhaXQgcmVhZEZpbGUobmV4dEFicyksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YWJsZURpck5hbWUoaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGNyZWF0ZUhhc2ggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y3J5cHRvXCIpO1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKGlucHV0UGF0aCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDEwKTtcbiAgcmV0dXJuIGBob3N0LSR7aGFzaH1gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUhvc3RTa2lsbChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGw6IEhvc3RTa2lsbElucHV0O1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcG9zaXg6IHBhdGhQb3NpeCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gIGNvbnN0IGhvc3RQYXRoID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRzLnNraWxsLnBhdGgpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGNvbGxlY3RGaWxlcyh7IGFic29sdXRlUGF0aDogaG9zdFBhdGggfSk7XG4gIGNvbnN0IGRpck5hbWUgPSBhd2FpdCBzdGFibGVEaXJOYW1lKGhvc3RQYXRoKTtcbiAgY29uc3QgZGVzdFBhdGggPSBwYXRoUG9zaXguam9pbihcIi5hZ2VudFwiLCBcInNraWxsc1wiLCBcIi5tYXRlcmlhbGl6ZWRcIiwgZGlyTmFtZSk7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBkZXN0UGF0aDtcbiAgfVxuXG4gIGF3YWl0IG9wdHMuc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICBmaWxlcyxcbiAgICBkZXN0UGF0aCxcbiAgfSk7XG5cbiAgcmV0dXJuIGRlc3RQYXRoO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBJbmxpbmVTa2lsbElucHV0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gc2x1Z2lmeSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIi1cIilcbiAgICAucmVwbGFjZSgvKF4tfC0kKS9nLCBcIlwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhYmxlSW5saW5lRGlyTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGNyZWF0ZUhhc2ggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y3J5cHRvXCIpO1xuICBjb25zdCBzbHVnID0gc2x1Z2lmeShuYW1lKSB8fCBcImlubGluZS1za2lsbFwiO1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKG5hbWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGAke3NsdWd9LSR7aGFzaH1gO1xufVxuXG5mdW5jdGlvbiBidWlsZFNraWxsTWFya2Rvd24oc2tpbGw6IElubGluZVNraWxsSW5wdXQpOiBzdHJpbmcge1xuICByZXR1cm4gYC0tLVxubmFtZTogJHtza2lsbC5uYW1lfVxuZGVzY3JpcHRpb246ICR7c2tpbGwuZGVzY3JpcHRpb259XG4tLS1cblxuJHtza2lsbC5pbnN0cnVjdGlvbnMudHJpbSgpfVxuYDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVJbmxpbmVTa2lsbChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3hJbnN0YW5jZTtcbiAgc2tpbGw6IElubGluZVNraWxsSW5wdXQ7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwb3NpeDogcGF0aFBvc2l4IH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG5cbiAgY29uc3QgZGlyTmFtZSA9IGF3YWl0IHN0YWJsZUlubGluZURpck5hbWUob3B0cy5za2lsbC5uYW1lKTtcbiAgY29uc3QgZGVzdFBhdGggPSBwYXRoUG9zaXguam9pbihcIi5hZ2VudFwiLCBcInNraWxsc1wiLCBcIi5tYXRlcmlhbGl6ZWRcIiwgZGlyTmFtZSk7XG5cbiAgYXdhaXQgb3B0cy5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgIGRlc3RQYXRoLFxuICAgIGZpbGVzOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6IFwiU0tJTEwubWRcIixcbiAgICAgICAgY29udGVudDogYnVpbGRTa2lsbE1hcmtkb3duKG9wdHMuc2tpbGwpLFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICByZXR1cm4gZGVzdFBhdGg7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IEdpdFNraWxsSW5wdXQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5mdW5jdGlvbiBzaGVsbFF1b3RlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3ZhbHVlLnJlcGxhY2UoLycvZywgYCdcXFxcJydgKX0nYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhYmxlUmVwb0Rpck5hbWUoc2tpbGw6IEdpdFNraWxsSW5wdXQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGNyZWF0ZUhhc2ggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6Y3J5cHRvXCIpO1xuICBjb25zdCBoYXNoSW5wdXQgPSBgJHtza2lsbC5yZXBvfTo6JHtza2lsbC5yZWYgPz8gXCJIRUFEXCJ9YDtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGExXCIpLnVwZGF0ZShoYXNoSW5wdXQpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxMik7XG4gIHJldHVybiBgZ2l0LSR7aGFzaH1gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlbW90ZVNraWxsKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbDogR2l0U2tpbGxJbnB1dDtcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHBvc2l4OiBwYXRoUG9zaXggfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcblxuICBjb25zdCBkaXJOYW1lID0gYXdhaXQgc3RhYmxlUmVwb0Rpck5hbWUob3B0cy5za2lsbCk7XG4gIGNvbnN0IGNsb25lRGlyID0gcGF0aFBvc2l4LmpvaW4oXCIuYWdlbnRcIiwgXCJza2lsbHNcIiwgXCIubWF0ZXJpYWxpemVkXCIsIGRpck5hbWUpO1xuICBjb25zdCBxdW90ZWREaXIgPSBzaGVsbFF1b3RlKGNsb25lRGlyKTtcbiAgY29uc3QgcXVvdGVkUmVwbyA9IHNoZWxsUXVvdGUob3B0cy5za2lsbC5yZXBvKTtcbiAgY29uc3QgcXVvdGVkUmVmID0gc2hlbGxRdW90ZShvcHRzLnNraWxsLnJlZiA/PyBcIkhFQURcIik7XG5cbiAgY29uc3Qgc3luY0NvbW1hbmQgPSBbXG4gICAgXCJzZXQgLWV1byBwaXBlZmFpbFwiLFxuICAgIGBpZiBbICEgLWQgJHtxdW90ZWREaXJ9Ly5naXQgXTsgdGhlbmAsXG4gICAgYCAgcm0gLXJmICR7cXVvdGVkRGlyfWAsXG4gICAgYCAgbWtkaXIgLXAgJHtxdW90ZWREaXJ9YCxcbiAgICBgICBnaXQgY2xvbmUgLS1kZXB0aCAxICR7cXVvdGVkUmVwb30gJHtxdW90ZWREaXJ9YCxcbiAgICBcImZpXCIsXG4gICAgYGlmIFsgJHtxdW90ZWRSZWZ9ICE9ICdIRUFEJyBdOyB0aGVuYCxcbiAgICBgICBnaXQgLUMgJHtxdW90ZWREaXJ9IGZldGNoIC0tZGVwdGggMSBvcmlnaW4gJHtxdW90ZWRSZWZ9YCxcbiAgICBgICBnaXQgLUMgJHtxdW90ZWREaXJ9IGNoZWNrb3V0IEZFVENIX0hFQURgLFxuICAgIFwiZmlcIixcbiAgXS5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBvcHRzLnNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgYXJnczogW1wiLWxjXCIsIHN5bmNDb21tYW5kXSxcbiAgfSk7XG4gIGNvbnN0IHsgZXhpdENvZGUsIHN0ZGVyciB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gbWF0ZXJpYWxpemUgZ2l0IHNraWxsIGZyb20gJHtvcHRzLnNraWxsLnJlcG99OiAke3N0ZGVyciB8fCBcInVua25vd24gZXJyb3JcIn1gXG4gICAgKTtcbiAgfVxuXG4gIGxldCByZXNvbHZlZERpciA9IGNsb25lRGlyO1xuICBpZiAob3B0cy5za2lsbC5wYXRoKSB7XG4gICAgcmVzb2x2ZWREaXIgPSBwYXRoUG9zaXguam9pbihyZXNvbHZlZERpciwgb3B0cy5za2lsbC5wYXRoKTtcbiAgfVxuICBpZiAob3B0cy5za2lsbC5uYW1lKSB7XG4gICAgcmVzb2x2ZWREaXIgPSBwYXRoUG9zaXguam9pbihyZXNvbHZlZERpciwgb3B0cy5za2lsbC5uYW1lKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWREaXI7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHsgbm9ybWFsaXplU2tpbGxzIH0gZnJvbSBcIi4vcGFyc2VyXCI7XG5pbXBvcnQgeyByZXNvbHZlSG9zdFNraWxsIH0gZnJvbSBcIi4vcmVzb2x2ZS1ob3N0XCI7XG5pbXBvcnQgeyByZXNvbHZlSW5saW5lU2tpbGwgfSBmcm9tIFwiLi9yZXNvbHZlLWlubGluZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZVJlbW90ZVNraWxsIH0gZnJvbSBcIi4vcmVzb2x2ZS1yZW1vdGVcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxJbnB1dHNUb1NhbmRib3hEaXJzKG9wdHM6IHtcbiAgYWdlbnQ6IEFueUFnZW50O1xuICBzYW5kYm94OiBTYW5kYm94SW5zdGFuY2U7XG4gIHNraWxsczogU2tpbGxJbnB1dFtdO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBiYXNlTG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4ub3B0cy5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IG9wdHMuYWdlbnQubmFtZSB9LFxuICAgIHN1YnN5c3RlbTogXCJza2lsbHNcIixcbiAgfSk7XG4gIGNvbnN0IGxvZyA9IG9wdHMuc2Vzc2lvbklkXG4gICAgPyBiYXNlTG9nLndpdGhDb250ZXh0KHsgc2Vzc2lvbklkOiBvcHRzLnNlc3Npb25JZCB9KVxuICAgIDogYmFzZUxvZztcbiAgY29uc3QgZW50cmllcyA9IG5vcm1hbGl6ZVNraWxscyhvcHRzLnNraWxscyk7XG4gIGNvbnN0IHJlc29sdmVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmIChlbnRyeS50eXBlID09PSBcInNhbmRib3hcIikge1xuICAgICAgcmVzb2x2ZWQucHVzaChlbnRyeS5wYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gXCJob3N0XCIpIHtcbiAgICAgIHJlc29sdmVkLnB1c2goXG4gICAgICAgIGF3YWl0IHJlc29sdmVIb3N0U2tpbGwoe1xuICAgICAgICAgIHNhbmRib3g6IG9wdHMuc2FuZGJveCxcbiAgICAgICAgICBza2lsbDogZW50cnksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChlbnRyeS50eXBlID09PSBcImdpdFwiKSB7XG4gICAgICByZXNvbHZlZC5wdXNoKFxuICAgICAgICBhd2FpdCByZXNvbHZlUmVtb3RlU2tpbGwoe1xuICAgICAgICAgIHNhbmRib3g6IG9wdHMuc2FuZGJveCxcbiAgICAgICAgICBza2lsbDogZW50cnksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChlbnRyeS50eXBlID09PSBcImlubGluZVwiKSB7XG4gICAgICByZXNvbHZlZC5wdXNoKFxuICAgICAgICBhd2FpdCByZXNvbHZlSW5saW5lU2tpbGwoe1xuICAgICAgICAgIHNhbmRib3g6IG9wdHMuc2FuZGJveCxcbiAgICAgICAgICBza2lsbDogZW50cnksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxvZy53YXJuKFwidW5rbm93biBza2lsbCBzb3VyY2UgZW50cnkgZW5jb3VudGVyZWRcIiwgeyBlbnRyeSB9KTtcbiAgfVxuXG4gIHJldHVybiByZXNvbHZlZDtcbn1cbiIsICJpbXBvcnQge1xuICB0eXBlIFRvb2xTZXQsXG4gIHRvb2wsXG4gIHR5cGUgVUlNZXNzYWdlLFxuICB0eXBlIFVJTWVzc2FnZVN0cmVhbVdyaXRlcixcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEFueUFnZW50LCBSZXNvbHZhYmxlQXJncyB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL3NhbmRib3gvYWRhcHRlclwiO1xuaW1wb3J0IHsgREVGQVVMVF9XQUlUX1VOVElMIH0gZnJvbSBcIi4uL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhcHByb3ZhbFBhcnRJZCB9IGZyb20gXCIuLi9zZXNzaW9uL3NlbmRcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCB0eXBlIExvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUphdmFTY3JpcHRUb29sLCB0eXBlIE9uU3ViVG9vbENhbGwgfSBmcm9tIFwiLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBjaGVja05lZWRzQXBwcm92YWwgfSBmcm9tIFwiLi9uZWVkcy1hcHByb3ZhbFwiO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoeyBjb25maWc6IHsgbmFtZTogXCJ0b29sc1wiIH0sIHN1YnN5c3RlbTogXCJ0b29sc1wiIH0pO1xuXG5mdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGJ5dGVzIDwgMTAyNCkge1xuICAgIHJldHVybiBgJHtieXRlc31gO1xuICB9XG4gIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9S2A7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9TWA7XG4gIH1cbiAgcmV0dXJuIGAkeyhieXRlcyAvICgxMDI0ICogMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfUdgO1xufVxuXG50eXBlIFN0cmVhbVdyaXRlciA9IFVJTWVzc2FnZVN0cmVhbVdyaXRlcjtcblxuZXhwb3J0IHR5cGUgVG9vbENvbnRleHQ8XG4gIFRDb250ZXh0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCA9IFRvb2xTZXQsXG4+ID0gUmVzb2x2YWJsZUFyZ3M8VENvbnRleHQsIFRvb2xzPjtcblxuZnVuY3Rpb24gaXNSZ05vdEZvdW5kRXJyb3IoZXJyOiBFcnJvcik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IFtlcnIubWVzc2FnZV07XG5cbiAgY29uc3QgYW55RXJyID0gZXJyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2YgYW55RXJyLnJlYXNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHBhcnRzLnB1c2goYW55RXJyLnJlYXNvbik7XG4gIH1cbiAgaWYgKGFueUVyci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcGFydHMucHVzaChhbnlFcnIuY2F1c2UubWVzc2FnZSk7XG4gICAgY29uc3QgYW55Q2F1c2UgPSBhbnlFcnIuY2F1c2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYW55Q2F1c2UudGV4dCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbXNnID0gcGFydHMuam9pbihcIiBcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBtc2cuaW5jbHVkZXMoXCJleGVjdXRhYmxlIGZpbGUgbm90IGZvdW5kXCIpIHx8XG4gICAgbXNnLmluY2x1ZGVzKFwiZXhlY3V0YWJsZV9ub3RfZm91bmRcIikgfHxcbiAgICAobXNnLmluY2x1ZGVzKFwiZW5vZW50XCIpICYmIG1zZy5pbmNsdWRlcyhcInJnXCIpKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgYnVpbHRJblRvb2xzID0ge1xuICBSZWFkOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50cyB3aXRoIG1ldGFkYXRhLiBGb3IgZmlsZXMgb3ZlciAyMDAgbGluZXMsIGF1dG9tYXRpY2FsbHkgc2hvd3MgZmlyc3QgMTAwIGxpbmVzIHVubGVzcyBhIHNwZWNpZmljIGxpbmUgcmFuZ2UgaXMgcHJvdmlkZWQuIFVzZSBzdGFydExpbmUgYW5kIGVuZExpbmUgcGFyYW1ldGVycyB0byByZWFkIHNwZWNpZmljIHBvcnRpb25zIG9mIGxhcmdlIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgc3RhcnRMaW5lOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJTdGFydGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkKS4gSWYgcHJvdmlkZWQgd2l0aCBlbmRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgICAgZW5kTGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRW5kaW5nIGxpbmUgbnVtYmVyICgxLWluZGV4ZWQsIGluY2x1c2l2ZSkuIElmIHByb3ZpZGVkIHdpdGggc3RhcnRMaW5lLCByZWFkcyBleGFjdCByYW5nZSByZWdhcmRsZXNzIG9mIGZpbGUgc2l6ZS5cIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkZpbGUgY29udGVudFwiKSxcbiAgICAgIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsTGluZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGVcIiksXG4gICAgICAgIGxpbmVzU2hvd246IHpcbiAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbGluZXMgaW5jbHVkZWQgaW4gdGhpcyByZXNwb25zZVwiKSxcbiAgICAgICAgc3RhcnRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRmlyc3QgbGluZSBudW1iZXIgc2hvd24gKDEtaW5kZXhlZClcIiksXG4gICAgICAgIGVuZExpbmU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJMYXN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBpc1BhZ2luYXRlZDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHRoaXMgaXMgYSBwYXJ0aWFsIHZpZXcgb2YgdGhlIGZpbGVcIiksXG4gICAgICAgIGZpbGVTaXplOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiSHVtYW4tcmVhZGFibGUgZmlsZSBzaXplIChlLmcuLCAnMi41SycsICcxLjJNJylcIiksXG4gICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBHcmVwOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIGZvciBwYXR0ZXJucyBpbiBmaWxlcyB1c2luZyByaXBncmVwLiBVc2UgdGhpcyB0byBmaW5kIGNvZGUgcGF0dGVybnMsIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBpbXBvcnRzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0dGVybjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiUmVnZXggcGF0dGVybiB0byBzZWFyY2ggZm9yIChyaXBncmVwIHN5bnRheClcIiksXG4gICAgICBwYXRoOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJBYnNvbHV0ZSBwYXRoIHRvIHNlYXJjaCBpbiAoZGVmYXVsdHMgdG8gd29ya2luZyBkaXJlY3RvcnkpLiBDYW4gYmUgYSBmaWxlIG9yIGRpcmVjdG9yeS5cIlxuICAgICAgICApLFxuICAgICAgZmlsZVR5cGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkZpbGUgdHlwZSB0byBmaWx0ZXIgYnkgKGUuZy4sICd0cycsICdqcycsICdweScsICdtZCcpLiBVc2VzIHJpcGdyZXAncyBidWlsdC1pbiB0eXBlIGZpbHRlcnMuXCJcbiAgICAgICAgKSxcbiAgICAgIGdsb2I6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkdsb2IgcGF0dGVybiB0byBmaWx0ZXIgZmlsZXMgKGUuZy4sICcqLnRzeCcsICdzcmMvKiovKi50cycpXCJcbiAgICAgICAgKSxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgICAuZGVzY3JpYmUoXCJXaGV0aGVyIHNlYXJjaCBpcyBjYXNlLXNlbnNpdGl2ZSAoZGVmYXVsdDogdHJ1ZSlcIiksXG4gICAgICBjb250ZXh0TGluZXM6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk51bWJlciBvZiBjb250ZXh0IGxpbmVzIHRvIHNob3cgYmVmb3JlIGFuZCBhZnRlciBlYWNoIG1hdGNoXCJcbiAgICAgICAgKSxcbiAgICAgIG1heENvdW50OiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJNYXhpbXVtIG51bWJlciBvZiBtYXRjaGVzIHBlciBmaWxlICh1c2VmdWwgZm9yIGxpbWl0aW5nIG91dHB1dClcIlxuICAgICAgICApLFxuICAgICAgZmlsZXNXaXRoTWF0Y2hlczogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJPbmx5IHNob3cgZmlsZSBwYXRocyB0aGF0IGNvbnRhaW4gbWF0Y2hlcywgbm90IHRoZSBtYXRjaGluZyBsaW5lcyB0aGVtc2VsdmVzXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG1hdGNoZXM6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlNlYXJjaCByZXN1bHRzIHdpdGggZmlsZSBwYXRocywgbGluZSBudW1iZXJzLCBhbmQgbWF0Y2hpbmcgY29udGVudFwiXG4gICAgICAgICksXG4gICAgICBzdW1tYXJ5OiB6Lm9iamVjdCh7XG4gICAgICAgIG1hdGNoQ291bnQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgbWF0Y2hlcyBmb3VuZFwiKSxcbiAgICAgICAgZmlsZUNvdW50OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGZpbGVzIGNvbnRhaW5pbmcgbWF0Y2hlc1wiKSxcbiAgICAgICAgc2VhcmNoUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdGhhdCB3YXMgc2VhcmNoZWRcIiksXG4gICAgICAgIHBhdHRlcm46IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXR0ZXJuIHRoYXQgd2FzIHNlYXJjaGVkIGZvclwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgTGlzdDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlJlY3Vyc2l2ZWx5IGxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzLiBVc2UgdGhpcyB0byB1bmRlcnN0YW5kIHRoZSBjb2RlYmFzZSBzdHJ1Y3R1cmUsIGZpbmQgZmlsZXMsIG9yIGV4cGxvcmUgZGlyZWN0b3JpZXMuIENvbnRyb2wgZGVwdGggdG8gYmFsYW5jZSBkZXRhaWwgdnMuIG92ZXJ2aWV3LiBEZXB0aCAxIHNob3dzIGltbWVkaWF0ZSBjaGlsZHJlbiwgZGVwdGggMiBpbmNsdWRlcyBzdWJkaXJlY3RvcmllcywgZXRjLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIkFic29sdXRlIHBhdGggdG8gbGlzdCAoZGVmYXVsdHMgdG8gd29ya2luZyBkaXJlY3RvcnkpXCIpLFxuICAgICAgZGVwdGg6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gZGVwdGggdG8gdHJhdmVyc2UuIENob29zZSBiYXNlZCBvbiBjb250ZXh0OiAxLTIgZm9yIHF1aWNrIG92ZXJ2aWV3LCAzLTQgZm9yIGRldGFpbGVkIGV4cGxvcmF0aW9uLCA1KyBmb3IgY29tcHJlaGVuc2l2ZSBtYXBwaW5nXCJcbiAgICAgICAgKSxcbiAgICAgIGluY2x1ZGVIaWRkZW46IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSW5jbHVkZSBoaWRkZW4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICh0aG9zZSBzdGFydGluZyB3aXRoICcuJylcIlxuICAgICAgICApLFxuICAgICAgZmlsZXNPbmx5OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcIk9ubHkgc2hvdyBmaWxlcywgbm90IGRpcmVjdG9yaWVzXCIpLFxuICAgICAgcGF0dGVybjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciByZXN1bHRzIChlLmcuLCAnKi50cycsICcqdGVzdConKVwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxpc3Rpbmc6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkRpcmVjdG9yeSB0cmVlIGxpc3Rpbmcgc2hvd2luZyBwYXRocyByZWxhdGl2ZSB0byBzZWFyY2ggcm9vdFwiXG4gICAgICAgICksXG4gICAgICBzdW1tYXJ5OiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsSXRlbXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgaXRlbXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRmlsZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgZmlsZXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRGlyczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBkaXJlY3RvcmllcyBmb3VuZFwiKSxcbiAgICAgICAgc2VhcmNoUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdGhhdCB3YXMgbGlzdGVkXCIpLFxuICAgICAgICBkZXB0aDogelxuICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTWF4aW11bSBkZXB0aCB1c2VkIChpZiBzcGVjaWZpZWQpXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBXcml0ZTogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIldyaXRlIGNvbnRlbnQgdG8gYSBmaWxlLiBDcmVhdGVzIHBhcmVudCBkaXJlY3RvcmllcyBhdXRvbWF0aWNhbGx5LiBPdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXCIpLFxuICAgICAgY29udGVudDogei5zdHJpbmcoKS5kZXNjcmliZShcIkNvbnRlbnQgdG8gd3JpdGUgdG8gdGhlIGZpbGVcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdWNjZXNzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIHdyaXRlIHN1Y2NlZWRlZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSB3cml0dGVuIGZpbGVcIiksXG4gICAgICBieXRlc1dyaXR0ZW46IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlblwiKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBtZXNzYWdlIGlmIHdyaXRlIGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEVkaXQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFZGl0IGEgZmlsZSBieSByZXBsYWNpbmcgYW4gZXhhY3Qgc3RyaW5nLiBGYWlscyBpZiBvbGRfc3RyaW5nIGlzIG5vdCBmb3VuZCBvciBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIChub3QgdW5pcXVlKS4gRm9yIG11bHRpcGxlIHJlcGxhY2VtZW50cywgY2FsbCB0aGlzIHRvb2wgbXVsdGlwbGUgdGltZXMgd2l0aCB1bmlxdWUgY29udGV4dC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZVwiKSxcbiAgICAgIG9sZF9zdHJpbmc6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkV4YWN0IHN0cmluZyB0byBmaW5kIGFuZCByZXBsYWNlIChtdXN0IGJlIHVuaXF1ZSBpbiBmaWxlKVwiKSxcbiAgICAgIG5ld19zdHJpbmc6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTdHJpbmcgdG8gcmVwbGFjZSBvbGRfc3RyaW5nIHdpdGhcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdWNjZXNzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIGVkaXQgc3VjY2VlZGVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGVkaXRlZCBmaWxlXCIpLFxuICAgICAgZXJyb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkVycm9yIG1lc3NhZ2UgaWYgZWRpdCBmYWlsZWRcIiksXG4gICAgfSksXG4gIH0pLFxuICBCYXNoOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXhlY3V0ZXMgYSBiYXNoIGNvbW1hbmQuIFJldHVybnMgc3Rkb3V0IGFuZCBzdGRlcnIgc2VwYXJhdGVseS4gVXNlIHdhaXRVbnRpbCB0byBjb250cm9sIGhvdyBsb25nIHRvIHdhaXQgKDAgPSByZXR1cm4gaW1tZWRpYXRlbHksIHByb2Nlc3Mga2VlcHMgcnVubmluZykuIExhcmdlIG91dHB1dHMgYXJlIHRhaWwtdHJ1bmNhdGVkOyBmdWxsIG91dHB1dCBpbiBvdXRwdXREaXIuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgY29tbWFuZDogei5zdHJpbmcoKS5kZXNjcmliZShcIlRoZSBzaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGVcIiksXG4gICAgICB3YWl0VW50aWw6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBgTWF4IG1zIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24gKGRlZmF1bHQ6ICR7REVGQVVMVF9XQUlUX1VOVElMfSkuIFVzZSAwIHRvIHJldHVybiBpbW1lZGlhdGVseSB3aGlsZSB0aGUgcHJvY2VzcyBrZWVwcyBydW5uaW5nLmBcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbW1hbmRJZDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQ29tbWFuZCBJRC4gVXNlIHRvIHJlZmVyZW5jZSBvciBraWxsIHJ1bm5pbmcgcHJvY2Vzc2VzLlwiKSxcbiAgICAgIHN0ZG91dDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiQ29tbWFuZCBzdGRvdXQuIFRhaWwtdHJ1bmNhdGVkIGlmIGxhcmdlOyBmdWxsIGNvbnRlbnQgaW4gb3V0cHV0RGlyL3N0ZG91dC50eHQuXCJcbiAgICAgICAgKSxcbiAgICAgIHN0ZGVycjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiQ29tbWFuZCBzdGRlcnIuIFRhaWwtdHJ1bmNhdGVkIGlmIGxhcmdlOyBmdWxsIGNvbnRlbnQgaW4gb3V0cHV0RGlyL3N0ZGVyci50eHQuXCJcbiAgICAgICAgKSxcbiAgICAgIGV4aXRDb2RlOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRXhpdCBjb2RlICgtMSBpZiBzdGlsbCBydW5uaW5nKVwiKSxcbiAgICAgIHN0YXR1czogelxuICAgICAgICAuZW51bShbXCJydW5uaW5nXCIsIFwiY29tcGxldGVkXCIsIFwiZmFpbGVkXCJdKVxuICAgICAgICAuZGVzY3JpYmUoXCJQcm9jZXNzIHN0YXR1c1wiKSxcbiAgICAgIG91dHB1dERpcjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiUGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc3Rkb3V0LnR4dCwgc3RkZXJyLnR4dCwgYW5kIG1ldGFkYXRhLmpzb24uIEVtcHR5IGlmIHN0aWxsIHJ1bm5pbmcuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgfSksXG4gIFNraWxsOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiTG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYnkgbmFtZS4gQ2FsbCB0aGlzIGJlZm9yZSBmb2xsb3dpbmcgYSBza2lsbC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBuYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU2tpbGwgbmFtZSBmcm9tIHRoZSBBdmFpbGFibGUgU2tpbGxzIGxpc3RcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCksXG4gICAgICBjb250ZW50OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRnVsbCBTS0lMTC5tZCBjb250ZW50XCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIHNraWxsIGRpcmVjdG9yeSBpbiB0aGUgc2FuZGJveFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEphdmFTY3JpcHQ6IHRvb2woe1xuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIGNvZGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkphdmFTY3JpcHQgYXN5bmMgZnVuY3Rpb24gYm9keS4gYGN0eGAgaXMgaW4gc2NvcGUuIE11c3QgdXNlIGByZXR1cm5gIHRvIHByb2R1Y2Ugb3V0cHV0LlwiXG4gICAgICAgICksXG4gICAgfSksXG4gIH0pLFxufSBzYXRpc2ZpZXMgVG9vbFNldDtcblxuZXhwb3J0IHR5cGUgQnVpbHRJblRvb2xOYW1lID0ga2V5b2YgdHlwZW9mIGJ1aWx0SW5Ub29scztcbmV4cG9ydCBjb25zdCBidWlsdGluVG9vbE5hbWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBPYmplY3QuZW50cmllcyhidWlsdEluVG9vbHMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgbmFtZV0pXG4pIGFzIHsgW0sgaW4gQnVpbHRJblRvb2xOYW1lXTogSyB9O1xuXG5jb25zdCBTS0lMTF9NRF9TVUZGSVggPSAvXFwvP1NLSUxMXFwubWQkLztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xzKHtcbiAgYWdlbnQsXG4gIHNhbmRib3gsXG4gIHNraWxsc1JlZixcbiAgd3JpdGVyLFxuICBhYm9ydENvbnRyb2xsZXIsXG4gIG5leHRQYXJ0SW5kZXhSZWYsXG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgc2Vzc2lvbklkLFxuICBzdGVwTG9nLFxuICBjb250ZXh0LFxuICBtZXNzYWdlcyxcbiAgYWN0aXZlVG9vbHMsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBza2lsbHNSZWY6IHsgY3VycmVudDogU2tpbGxTdW1tYXJ5W10gfTtcbiAgd3JpdGVyOiBTdHJlYW1Xcml0ZXI7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuICBuZXh0UGFydEluZGV4UmVmOiB7IGN1cnJlbnQ6IG51bWJlciB9O1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHN0ZXBMb2c6IExvZ2dlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1lc3NhZ2VzOiBVSU1lc3NhZ2VbXTtcbiAgYWN0aXZlVG9vbHM/OiBzdHJpbmdbXTtcbn0pOiB7XG4gIHJhd1Rvb2xzOiBUb29sU2V0O1xuICB0b29sc1dpdGhOZWVkc0FwcHJvdmFsOiBUb29sU2V0O1xuICB0b29sQ29udGV4dDogVG9vbENvbnRleHQ7XG59IHtcbiAgY29uc3QgcmF3VG9vbHM6IFRvb2xTZXQgPSB7XG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuUmVhZF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlJlYWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBzdGFydExpbmUsIGVuZExpbmUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIlJlYWQgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogYEVycm9yOiBGaWxlIG5vdCBmb3VuZCAtICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IDAsXG4gICAgICAgICAgICAgIGxpbmVzU2hvd246IDAsXG4gICAgICAgICAgICAgIHN0YXJ0TGluZTogMCxcbiAgICAgICAgICAgICAgZW5kTGluZTogMCxcbiAgICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogXCIwXCIsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBmdWxsQ29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gQSB0cmFpbGluZyBuZXdsaW5lIHByb2R1Y2VzIGFuIGVtcHR5IGxhc3QgZWxlbWVudCBcdTIwMTQgcmVtb3ZlIGl0XG4gICAgICAgIC8vIHNvIGxpbmUgY291bnQgbWF0Y2hlcyBgd2MgLWxgIC8gYGF3ayAnRU5Ee3ByaW50IE5SfSdgIGJlaGF2aW9yLlxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lcy5hdCgtMSkgPT09IFwiXCIpIHtcbiAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbExpbmVzID0gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChmdWxsQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVTaXplID0gZm9ybWF0RmlsZVNpemUoZmlsZUJ5dGVzKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgcmFuZ2VcbiAgICAgICAgY29uc3QgUEFHRV9TSVpFID0gMTAwO1xuICAgICAgICBsZXQgYWN0dWFsU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IGFjdHVhbEVuZDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChzdGFydExpbmUgIT09IHVuZGVmaW5lZCAmJiBlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBlbmRMaW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSBzdGFydExpbmU7XG4gICAgICAgICAgYWN0dWFsRW5kID0gTWF0aC5taW4oc3RhcnRMaW5lICsgUEFHRV9TSVpFIC0gMSwgdG90YWxMaW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodG90YWxMaW5lcyA+IDIwMCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBQQUdFX1NJWkU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IHRvdGFsTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBsaW5lIHJhbmdlICgxLWluZGV4ZWQpXG4gICAgICAgIGNvbnN0IHNsaWNlZExpbmVzID0gbGluZXMuc2xpY2UoYWN0dWFsU3RhcnQgLSAxLCBhY3R1YWxFbmQpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gc2xpY2VkTGluZXMuam9pbihcIlxcblwiKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0b3RhbExpbmVzLFxuICAgICAgICAgICAgbGluZXNTaG93bjogTWF0aC5tYXgoMCwgYWN0dWFsRW5kIC0gYWN0dWFsU3RhcnQgKyAxKSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogYWN0dWFsU3RhcnQsXG4gICAgICAgICAgICBlbmRMaW5lOiBhY3R1YWxFbmQsXG4gICAgICAgICAgICBpc1BhZ2luYXRlZDogYWN0dWFsRW5kIDwgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGZpbGVTaXplLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5HcmVwXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuR3JlcCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7XG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICBnbG9iLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlLFxuICAgICAgICBjb250ZXh0TGluZXMsXG4gICAgICAgIG1heENvdW50LFxuICAgICAgICBmaWxlc1dpdGhNYXRjaGVzLFxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tbGluZS1udW1iZXJcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0taGVhZGluZ1wiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1jb2xvclwiLCBcIm5ldmVyXCIpO1xuXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVUeXBlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS10eXBlXCIsIGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1nbG9iXCIsIGdsb2IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLUNcIiwgU3RyaW5nKGNvbnRleHRMaW5lcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLW1heC1jb3VudFwiLCBTdHJpbmcobWF4Q291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1maWxlcy13aXRoLW1hdGNoZXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJyZ1wiLCBhcmdzIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciAmJiBpc1JnTm90Rm91bmRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJyZyBub3QgZm91bmQsIGluc3RhbGxpbmcgcmlwZ3JlcFwiKTtcbiAgICAgICAgICBjb25zdCBpbnN0YWxsUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBcImNvbW1hbmQgLXYgcmcgPi9kZXYvbnVsbCAyPiYxICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiZG5mIGluc3RhbGwgLXkgcmlwZ3JlcCAyPi9kZXYvbnVsbCAmJiBleGl0IDBcIixcbiAgICAgICAgICAgICAgICBcIihhcHQtZ2V0IHVwZGF0ZSAtcXEgJiYgYXB0LWdldCBpbnN0YWxsIC15IC1xcSByaXBncmVwKSAyPi9kZXYvbnVsbCAmJiBleGl0IDBcIixcbiAgICAgICAgICAgICAgICBcImFwayBhZGQgLS1uby1jYWNoZSByaXBncmVwIDI+L2Rldi9udWxsICYmIGV4aXQgMFwiLFxuICAgICAgICAgICAgICAgIFwiY3VybCAtc0wgaHR0cHM6Ly9naXRodWIuY29tL0J1cm50U3VzaGkvcmlwZ3JlcC9yZWxlYXNlcy9kb3dubG9hZC8xNC4xLjEvcmlwZ3JlcC0xNC4xLjEteDg2XzY0LXVua25vd24tbGludXgtbXVzbC50YXIuZ3ogfCB0YXIgeHogLUMgL3RtcCAmJiBpbnN0YWxsIC90bXAvcmlwZ3JlcC0xNC4xLjEteDg2XzY0LXVua25vd24tbGludXgtbXVzbC9yZyAvdXNyL2xvY2FsL2Jpbi9yZyAmJiBybSAtcmYgL3RtcC9yaXBncmVwLTE0LjEuMS14ODZfNjQtdW5rbm93bi1saW51eC1tdXNsXCIsXG4gICAgICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghKGluc3RhbGxSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbGxPdXRwdXQgPSBhd2FpdCBpbnN0YWxsUmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgIGlmIChpbnN0YWxsT3V0cHV0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKFwicmlwZ3JlcCBpbnN0YWxsIGZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgc3RkZXJyOiBpbnN0YWxsT3V0cHV0LnN0ZGVycixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwicmdcIiwgYXJncyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciAmJiBpc1JnTm90Rm91bmRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJyZyB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGdyZXBcIik7XG4gICAgICAgICAgY29uc3QgZ3JlcEFyZ3MgPSBbXCItcm5cIiwgXCItLWNvbG9yPW5ldmVyXCJdO1xuICAgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgZ3JlcEFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29udGV4dExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItQ1wiLCBTdHJpbmcoY29udGV4dExpbmVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLW1cIiwgU3RyaW5nKG1heENvdW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKFwiLWxcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgICBncmVwQXJncy5wdXNoKGAtLWluY2x1ZGU9JHtnbG9ifWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgICAgICAgICAgICAgdHM6IFtcIioudHNcIiwgXCIqLnRzeFwiLCBcIioubXRzXCIsIFwiKi5jdHNcIl0sXG4gICAgICAgICAgICAgIGpzOiBbXCIqLmpzXCIsIFwiKi5qc3hcIiwgXCIqLm1qc1wiLCBcIiouY2pzXCJdLFxuICAgICAgICAgICAgICBweTogW1wiKi5weVwiXSxcbiAgICAgICAgICAgICAgcnVzdDogW1wiKi5yc1wiXSxcbiAgICAgICAgICAgICAgZ286IFtcIiouZ29cIl0sXG4gICAgICAgICAgICAgIGphdmE6IFtcIiouamF2YVwiXSxcbiAgICAgICAgICAgICAgbWQ6IFtcIioubWRcIl0sXG4gICAgICAgICAgICAgIGpzb246IFtcIiouanNvblwiXSxcbiAgICAgICAgICAgICAgY3NzOiBbXCIqLmNzc1wiXSxcbiAgICAgICAgICAgICAgaHRtbDogW1wiKi5odG1sXCJdLFxuICAgICAgICAgICAgICB5YW1sOiBbXCIqLnltbFwiLCBcIioueWFtbFwiXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiBpbmNsdWRlTWFwW2ZpbGVUeXBlXSA/PyBbYCouJHtmaWxlVHlwZX1gXSkge1xuICAgICAgICAgICAgICBncmVwQXJncy5wdXNoKGAtLWluY2x1ZGU9JHtleHR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGdyZXBBcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgICAgY29tbWFuZDogXCJncmVwXCIsXG4gICAgICAgICAgICBhcmdzOiBncmVwQXJncyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGxvZy5lcnJvcihcIkdyZXAgZmFpbGVkXCIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVyciAmJiAhc3RkZXJyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJubyBtYXRjaGVzXCIpKSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJHcmVwIHN0ZGVyclwiLCB7IHN0ZGVyciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRydW5jYXRlIG91dHB1dCB0byBwcmV2ZW50IFwiaW5wdXQgdG9vIGxvbmdcIiBlcnJvcnMgKDUwayBjaGFycyBcdTIyNDggMTIuNWsgdG9rZW5zKVxuICAgICAgICBjb25zdCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMgPSA1MF8wMDA7XG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHN0ZG91dDtcbiAgICAgICAgbGV0IHdhc1RydW5jYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZmluYWxPdXRwdXQubGVuZ3RoID4gTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSB7XG4gICAgICAgICAgZmluYWxPdXRwdXQgPVxuICAgICAgICAgICAgZmluYWxPdXRwdXQuc2xpY2UoMCwgTUFYX0dSRVBfT1VUUFVUX0NIQVJTKSArXG4gICAgICAgICAgICBcIlxcblxcbltPdXRwdXQgdHJ1bmNhdGVkIC0gdXNlIG1vcmUgc3BlY2lmaWMgcGF0dGVybiBvciBwYXRoXVwiO1xuICAgICAgICAgIHdhc1RydW5jYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IGZpbmFsT3V0cHV0XG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICA/IGxpbmVzLmxlbmd0aFxuICAgICAgICAgIDogbmV3IFNldChcbiAgICAgICAgICAgICAgbGluZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsKSA9PiAhbC5zdGFydHNXaXRoKFwiIFwiKSAmJiBsLmluY2x1ZGVzKFwiOlwiKSlcbiAgICAgICAgICAgICAgICAubWFwKChsKSA9PiBsLnNwbGl0KFwiOlwiKVswXSlcbiAgICAgICAgICAgICkuc2l6ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIG1hdGNoQ291bnQ6IGZpbGVzV2l0aE1hdGNoZXNcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogbGluZXMuZmlsdGVyKChsKSA9PiBsLmluY2x1ZGVzKFwiOlwiKSkubGVuZ3RoLFxuICAgICAgICAgICAgZmlsZUNvdW50LFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICB3YXNUcnVuY2F0ZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXRjaGVzOiBmaW5hbE91dHB1dCB8fCBcIihubyBtYXRjaGVzIGZvdW5kKVwiLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5MaXN0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuTGlzdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGRlcHRoLCBpbmNsdWRlSGlkZGVuLCBmaWxlc09ubHksIHBhdHRlcm4gfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgU0VBUkNIX1BBVEg9XCIkMVwiXG4gICAgICAgICAgICBERVBUSD1cIiQyXCJcbiAgICAgICAgICAgIElOQ0xVREVfSElEREVOPVwiJDNcIlxuICAgICAgICAgICAgRklMRVNfT05MWT1cIiQ0XCJcbiAgICAgICAgICAgIFBBVFRFUk49XCIkNVwiXG5cbiAgICAgICAgICAgICMgQnVpbGQgZmluZCBjb21tYW5kIGFyZ3VtZW50c1xuICAgICAgICAgICAgRklORF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTICEgLXBhdGggJyovLionXCJcbiAgICAgICAgICAgIFsgXCIkRklMRVNfT05MWVwiID0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC10eXBlIGZcIlxuICAgICAgICAgICAgWyAtbiBcIiRQQVRURVJOXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1uYW1lICckUEFUVEVSTidcIlxuXG4gICAgICAgICAgICAjIEdldCBsaXN0aW5nXG4gICAgICAgICAgICBMSVNUSU5HPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJEZJTkRfQVJHU1wiIDI+L2Rldi9udWxsIHwgc29ydClcblxuICAgICAgICAgICAgIyBHZXQgY291bnRzXG4gICAgICAgICAgICBDT1VOVF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG5cbiAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBmXCIgMj4vZGV2L251bGwgfCB3YyAtbClcbiAgICAgICAgICAgIERJUl9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGRcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuXG4gICAgICAgICAgICAjIE91dHB1dDogY291bnRzIGZpcnN0LCB0aGVuIGxpc3RpbmdcbiAgICAgICAgICAgIGVjaG8gXCIkRklMRV9DT1VOVHwkRElSX0NPVU5UXCJcbiAgICAgICAgICAgIGVjaG8gXCJ8fHxMSVNUSU5HfHx8XCJcbiAgICAgICAgICAgIGVjaG8gXCIkTElTVElOR1wiIHwgc2VkIFwic3xeJFNFQVJDSF9QQVRIfC58XCJcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgXCItLVwiLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoPy50b1N0cmluZygpIHx8IFwiXCIsXG4gICAgICAgICAgICBpbmNsdWRlSGlkZGVuID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBmaWxlc09ubHkgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHBhdHRlcm4gfHwgXCJcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJMaXN0IGZhaWxlZFwiLCB7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBsb2cud2FybihcIkxpc3Qgc3RkZXJyXCIsIHsgc3RkZXJyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2NvdW50c0xpbmUsIC4uLnJlc3RdID0gc3Rkb3V0LnNwbGl0KFwifHx8TElTVElOR3x8fFwiKTtcbiAgICAgICAgY29uc3QgbGlzdGluZyA9IHJlc3Quam9pbihcInx8fExJU1RJTkd8fHxcIikudHJpbSgpO1xuICAgICAgICBjb25zdCBbZmlsZUNvdW50U3RyLCBkaXJDb3VudFN0cl0gPSBjb3VudHNMaW5lLnRyaW0oKS5zcGxpdChcInxcIik7XG5cbiAgICAgICAgY29uc3QgdG90YWxGaWxlcyA9IE51bWJlci5wYXJzZUludChmaWxlQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCB0b3RhbERpcnMgPSBOdW1iZXIucGFyc2VJbnQoZGlyQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGxpc3Rpbmcuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxGaWxlcyxcbiAgICAgICAgICAgIHRvdGFsRGlycyxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxpc3RpbmcsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLldyaXRlXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuV3JpdGUsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlUGF0aCwgY29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBcIi5cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIFwidXRmOFwiKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogMCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1zZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkVkaXRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5FZGl0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgb2xkX3N0cmluZywgbmV3X3N0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHBhdGg6IGZpbGVQYXRoLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRlbnQuc3BsaXQob2xkX3N0cmluZykubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcIm9sZF9zdHJpbmcgbm90IGZvdW5kIGluIGZpbGVcIixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID4gMSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBvbGRfc3RyaW5nIGFwcGVhcnMgJHtvY2N1cnJlbmNlc30gdGltZXMgaW4gZmlsZSAobXVzdCBiZSB1bmlxdWUpLiBJbmNsdWRlIG1vcmUgc3Vycm91bmRpbmcgY29udGV4dCB0byBtYWtlIHRoZSBtYXRjaCB1bmlxdWUuYCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShvbGRfc3RyaW5nLCBuZXdfc3RyaW5nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgICAgICBmaWxlczogW3sgcGF0aDogZmlsZVBhdGgsIGNvbnRlbnQ6IG5ld0NvbnRlbnQgfV0sXG4gICAgICAgICAgICBkZXN0UGF0aDogXCIuXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiBlcnJvck1zZyB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkJhc2hdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5CYXNoLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVQcm9jZXNzTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NNYW5hZ2VyID0gY3JlYXRlUHJvY2Vzc01hbmFnZXIoeyBzYW5kYm94IH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NNYW5hZ2VyLnJ1bih7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KTtcblxuICAgICAgICBjb25zdCBNQVhfU1RET1VUID0gNTBfMDAwO1xuICAgICAgICBjb25zdCBNQVhfU1RERVJSID0gMTBfMDAwO1xuXG4gICAgICAgIGxldCB7IHN0ZG91dCwgc3RkZXJyIH0gPSByZXN1bHQ7XG4gICAgICAgIGlmIChzdGRvdXQubGVuZ3RoID4gTUFYX1NURE9VVCkge1xuICAgICAgICAgIHN0ZG91dCA9XG4gICAgICAgICAgICBgW3RydW5jYXRlZCBcdTIwMTQgc2hvd2luZyBsYXN0ICR7TUFYX1NURE9VVH0gY2hhcnMuIEZ1bGw6ICR7cmVzdWx0Lm91dHB1dERpcn0vc3Rkb3V0LnR4dF1cXG5cXG5gICtcbiAgICAgICAgICAgIHN0ZG91dC5zbGljZSgtTUFYX1NURE9VVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVyci5sZW5ndGggPiBNQVhfU1RERVJSKSB7XG4gICAgICAgICAgc3RkZXJyID1cbiAgICAgICAgICAgIGBbdHJ1bmNhdGVkIFx1MjAxNCBzaG93aW5nIGxhc3QgJHtNQVhfU1RERVJSfSBjaGFycy4gRnVsbDogJHtyZXN1bHQub3V0cHV0RGlyfS9zdGRlcnIudHh0XVxcblxcbmAgK1xuICAgICAgICAgICAgc3RkZXJyLnNsaWNlKC1NQVhfU1RERVJSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgc3Rkb3V0LCBzdGRlcnIgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgLi4uYWdlbnQub3B0aW9ucy50b29scyxcbiAgfTtcblxuICBpZiAoc2tpbGxzUmVmLmN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgIHJhd1Rvb2xzW2J1aWx0aW5Ub29sTmFtZXMuU2tpbGxdID0gdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuU2tpbGwsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBuYW1lIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbGxzID0gc2tpbGxzUmVmLmN1cnJlbnQ7XG4gICAgICAgIGNvbnN0IHNraWxsID0gc2tpbGxzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTa2lsbCBub3QgZm91bmQ6IFwiJHtuYW1lfVwiLiBBdmFpbGFibGU6ICR7c2tpbGxzLm1hcCgocykgPT4gcy5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5yZWFkRmlsZSh7XG4gICAgICAgICAgcGF0aDogc2tpbGwuc2tpbGxNZFBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2tpbGwgZmlsZSBub3QgZm91bmQ6ICR7c2tpbGwuc2tpbGxNZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3ID1cbiAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IHJhdy5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICAgICAgICBjb25zdCBjb250ZW50ID1cbiAgICAgICAgICBlbmRNYXJrZXIgPT09IC0xID8gcmF3IDogcmF3LnNsaWNlKGVuZE1hcmtlciArIDMpLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2tpbGxEaXIgPSBza2lsbC5za2lsbE1kUGF0aC5yZXBsYWNlKFNLSUxMX01EX1NVRkZJWCwgXCJcIik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogc2tpbGwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc2tpbGwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBwYXRoOiBza2lsbERpcixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBvblN1YlRvb2xDYWxsOiBPblN1YlRvb2xDYWxsID0gYXN5bmMgKHRvb2xOYW1lLCB0b29sSW5wdXQsIGV4ZWN1dGUpID0+IHtcbiAgICBjb25zdCBuZWVkc0FwcHJvdmFsID0gYXdhaXQgY2hlY2tOZWVkc0FwcHJvdmFsKHtcbiAgICAgIGFnZW50LFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgbWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgaWYgKCFuZWVkc0FwcHJvdmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcHByb3ZhbElkID0gYGpzX2FwcHJvdmFsXyR7dWxpZCgpfWA7XG4gICAgY29uc3QgdG9vbENhbGxJZCA9IGBqc190Y18ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHBhcnRJZCA9IGFwcHJvdmFsUGFydElkKGFwcHJvdmFsSWQpO1xuXG4gICAgYXdhaXQgYWdlbnQuc3RvcmFnZS5wYXJ0LnNldChwYXJ0SWQsIHtcbiAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICBpbmRleDogbmV4dFBhcnRJbmRleFJlZi5jdXJyZW50KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHBhcnQ6IHtcbiAgICAgICAgdHlwZTogYHRvb2wtJHt0b29sTmFtZX1gLFxuICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIixcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdLFxuICAgIH0pO1xuXG4gICAgd3JpdGVyLndyaXRlKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgdG9vbENhbGxJZCxcbiAgICAgIHRvb2xOYW1lLFxuICAgIH0pO1xuICAgIHdyaXRlci53cml0ZSh7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtYXZhaWxhYmxlXCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgIH0pO1xuICAgIHdyaXRlci53cml0ZSh7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBQT0xMX01TID0gNTAwO1xuICAgIGNvbnN0IFRJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCBUSU1FT1VUX01TICYmICFhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBhZ2VudC5zdG9yYWdlLnBhcnQuZ2V0KHBhcnRJZCk7XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZWQgJiZcbiAgICAgICAgXCJzdGF0ZVwiIGluIHVwZGF0ZWQucGFydCAmJlxuICAgICAgICAoKHVwZGF0ZWQucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVzcG9uZGVkXCIgfHxcbiAgICAgICAgICAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJvdXRwdXQtZGVuaWVkXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IFwib3V0cHV0LWRlbmllZFwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gKHVwZGF0ZWQucGFydCBhcyB7IGFwcHJvdmFsPzogeyByZWFzb24/OiBzdHJpbmcgfSB9KVxuICAgICAgICAgICAgLmFwcHJvdmFsPy5yZWFzb247XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBgVG9vbCBcIiR7dG9vbE5hbWV9XCIgZGVuaWVkOiAke3JlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgdXBkYXRlZC5wYXJ0IGFzIHtcbiAgICAgICAgICAgIGFwcHJvdmFsPzogeyBhcHByb3ZlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH07XG4gICAgICAgICAgfVxuICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICBpZiAoYXBwcm92YWw/LmFwcHJvdmVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICBlcnJvclRleHQ6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IGBUb29sIFwiJHt0b29sTmFtZX1cIiBkZW5pZWQ6ICR7YXBwcm92YWw/LnJlYXNvbiB8fCBcInVzZXIgZGVuaWVkXCJ9YCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICA/IFwiaW50ZXJydXB0ZWRcIlxuICAgICAgICA6IFwiQXBwcm92YWwgdGltZWQgb3V0XCIsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCB0b29sQ29udGV4dDogVG9vbENvbnRleHQgPSB7XG4gICAgY29udGV4dCxcbiAgICBzZXNzaW9uSWQsXG4gICAgc2FuZGJveCxcbiAgICBtZXNzYWdlczogbWVzc2FnZXMgYXMgVG9vbENvbnRleHRbXCJtZXNzYWdlc1wiXSxcbiAgfTtcblxuICByYXdUb29sc1tidWlsdGluVG9vbE5hbWVzLkphdmFTY3JpcHRdID0gY3JlYXRlSmF2YVNjcmlwdFRvb2woe1xuICAgIHRvb2xzOiByYXdUb29scyxcbiAgICBzYW5kYm94LFxuICAgIGFjdGl2ZVRvb2xzLFxuICAgIG9uU3ViVG9vbENhbGwsXG4gICAgdG9vbENvbnRleHQsXG4gIH0pO1xuXG4gIGNvbnN0IHRvb2xzV2l0aE5lZWRzQXBwcm92YWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmF3VG9vbHMpLm1hcCgoW25hbWUsIHRdKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbEV4ZWN1dGUgPSB0LmV4ZWN1dGU7XG4gICAgICBjb25zdCB3cmFwcGVkRXhlY3V0ZSA9IG9yaWdpbmFsRXhlY3V0ZVxuICAgICAgICA/IGFzeW5jICguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBvcmlnaW5hbEV4ZWN1dGU+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkb25lID0gc3RlcExvZy50aW1lKGB0b29sOiR7bmFtZX1gKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxldCB0b29sSW5wdXQgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICBpZiAoYWdlbnQuaG9va3NbXCJ0b29sLmJlZm9yZVwiXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZVJlc3VsdCA9IGF3YWl0IGFnZW50Lmhvb2tzW1widG9vbC5iZWZvcmVcIl0oe1xuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlUmVzdWx0Py5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB0b29sSW5wdXQgPSBiZWZvcmVSZXN1bHQuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICBhcmdzWzBdID0gdG9vbElucHV0IGFzICh0eXBlb2YgYXJncylbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IG9yaWdpbmFsRXhlY3V0ZSguLi5hcmdzKTtcblxuICAgICAgICAgICAgICBpZiAoYWdlbnQuaG9va3NbXCJ0b29sLmFmdGVyXCJdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJSZXN1bHQgPSBhd2FpdCBhZ2VudC5ob29rc1tcInRvb2wuYWZ0ZXJcIl0oe1xuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJSZXN1bHQ/LnJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSBhZnRlclJlc3VsdC5yZXN1bHQgYXMgdHlwZW9mIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGRvbmUoe1xuICAgICAgICAgICAgICAgIGVycm9yOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgLi4udCxcbiAgICAgICAgICAuLi4od3JhcHBlZEV4ZWN1dGUgPyB7IGV4ZWN1dGU6IHdyYXBwZWRFeGVjdXRlIH0gOiB7fSksXG4gICAgICAgICAgbmVlZHNBcHByb3ZhbDogYXN5bmMgKFxuICAgICAgICAgICAgdG9vbElucHV0OiB1bmtub3duLFxuICAgICAgICAgICAgb3B0czogeyB0b29sQ2FsbElkOiBzdHJpbmc7IG1lc3NhZ2VzOiB1bmtub3duW10gfVxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNoZWNrTmVlZHNBcHByb3ZhbCh7XG4gICAgICAgICAgICAgIGFnZW50LFxuICAgICAgICAgICAgICB0b29sTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogb3B0cy50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBtZXNzYWdlczogb3B0cy5tZXNzYWdlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pXG4gICk7XG5cbiAgcmV0dXJuIHsgcmF3VG9vbHMsIHRvb2xzV2l0aE5lZWRzQXBwcm92YWwsIHRvb2xDb250ZXh0IH07XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBUb29sU2V0LCB0b29sIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94SW5zdGFuY2UgfSBmcm9tIFwiLi4vc2FuZGJveC9hZGFwdGVyXCI7XG5pbXBvcnQgeyBidWlsdEluVG9vbHMgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgSkFWQVNDUklQVF9UT09MX05BTUUgPSBcIkphdmFTY3JpcHRcIjtcblxuZXhwb3J0IHR5cGUgU3ViVG9vbENhbGxSZXN1bHQgPSB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBPblN1YlRvb2xDYWxsID0gKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogdW5rbm93bixcbiAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuKSA9PiBQcm9taXNlPFN1YlRvb2xDYWxsUmVzdWx0PjtcblxuY29uc3QgUkVRVUVTVF9NQVJLRVJfU1RBUlQgPSBcIl9fVE9PTF9SRVFVRVNUX19cIjtcbmNvbnN0IFJFUVVFU1RfTUFSS0VSX0VORCA9IFwiX19UT09MX1JFUVVFU1RfRU5EX19cIjtcbmNvbnN0IEVYRUNVVElPTl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBUaGUgcnVubmVyIHNjcmlwdCBpcyB3cml0dGVuIHRvIHRoZSBzYW5kYm94IGFuZCBleGVjdXRlZCB2aWEgTm9kZS5qcy5cbiAqIEl0IHJlYWRzIHRoZSBtb2RlbCdzIGNvZGUgZnJvbSBjb2RlLmpzLCBzZXRzIHVwIGN0eC50b29scyBhcyBSUEMgcHJveGllc1xuICogKHJlcXVlc3RzIHNlbnQgdmlhIHN0ZGVyciBtYXJrZXJzLCByZXNwb25zZXMgcG9sbGVkIGZyb20gZmlsZXMpLCBleGVjdXRlc1xuICogdGhlIGNvZGUsIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBzdGRvdXQgYXMgSlNPTi5cbiAqL1xuY29uc3QgUlVOTkVSX1NDUklQVCA9IGBcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYywgdW5saW5rU3luYywgbWtkaXJTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmNvbnN0IFNDUklQVF9ESVIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBUT09MX0NBTExfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5cbmxldCByZXFDb3VudGVyID0gMDtcblxuYXN5bmMgZnVuY3Rpb24gY2FsbFRvb2wobmFtZSwgaW5wdXQpIHtcbiAgY29uc3QgaWQgPSAncmVxXycgKyAoKytyZXFDb3VudGVyKSArICdfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3BvbnNlRmlsZSA9IGpvaW4oU0NSSVBUX0RJUiwgaWQgKyAnLnJlc3BvbnNlLmpzb24nKTtcblxuICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoeyBpZCwgdG9vbDogbmFtZSwgaW5wdXQgfSk7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcke1JFUVVFU1RfTUFSS0VSX1NUQVJUfScgKyByZXF1ZXN0ICsgJyR7UkVRVUVTVF9NQVJLRVJfRU5EfScgKyAnXFxcXG4nKTtcblxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIHdoaWxlICghZXhpc3RzU3luYyhyZXNwb25zZUZpbGUpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IFRPT0xfQ0FMTF9USU1FT1VUX01TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rvb2wgY2FsbCAnICsgbmFtZSArICcgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAzMCkpO1xuICB9XG5cbiAgbGV0IHJhdztcbiAgdHJ5IHtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJhdyk7XG4gIHRyeSB7IHVubGlua1N5bmMocmVzcG9uc2VGaWxlKTsgfSBjYXRjaCB7fVxuXG4gIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdDtcbn1cblxuY29uc3QgY29kZSA9IHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICdjb2RlLmpzJyksICd1dGY4Jyk7XG5jb25zdCB0b29sTmFtZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICd0b29scy5qc29uJyksICd1dGY4JykpO1xuXG5jb25zdCBjdHggPSB7IHRvb2xzOiB7fSB9O1xuZm9yIChjb25zdCBuYW1lIG9mIHRvb2xOYW1lcykge1xuICBjdHgudG9vbHNbbmFtZV0gPSAoaW5wdXQpID0+IGNhbGxUb29sKG5hbWUsIGlucHV0KTtcbn1cblxuY29uc3QgbG9ncyA9IFtdO1xuY29uc3QgY3VzdG9tQ29uc29sZSA9IHtcbiAgbG9nOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICBlcnJvcjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW2Vycm9yXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIHdhcm46ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1t3YXJuXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG59O1xuXG50cnkge1xuICBjb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uKCkge30pLmNvbnN0cnVjdG9yO1xuICBjb25zdCBmbiA9IG5ldyBBc3luY0Z1bmN0aW9uKCdjdHgnLCAnY29uc29sZScsIGNvZGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihjdHgsIGN1c3RvbUNvbnNvbGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgIT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IG51bGwgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn0gY2F0Y2ggKGVycikge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn1cbmA7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBwbGFpbiBKU09OIFNjaGVtYSBmcm9tIHdoYXRldmVyIGZvcm1hdCB0aGUgQUkgU0RLIHRvb2wgdXNlc1xuICogKFpvZCBzY2hlbWEsIEFJIFNESyB3cmFwcGVkIHNjaGVtYSwgb3IgcmF3IEpTT04gU2NoZW1hKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RKc29uU2NoZW1hKFxuICBzY2hlbWE6IHVua25vd25cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICBcIl9kZWZcIiBpbiBzY2hlbWEgJiZcbiAgICB0eXBlb2YgKHNjaGVtYSBhcyB7IF9kZWY6IHVua25vd24gfSkuX2RlZiA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHoudG9KU09OU2NoZW1hKHNjaGVtYSBhcyB6LlpvZFR5cGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcyA9IHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPjtcbiAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgIHJldHVybiBzLmpzb25TY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcyB8fCBcInByb3BlcnRpZXNcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25TY2hlbWFUb1RzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpbmRlbnQgPSAwXG4pOiBzdHJpbmcge1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxuXG4gIGlmIChzY2hlbWEuZW51bSAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5hbnlPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5hbnlPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLmFueU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG4gIGlmIChzY2hlbWEub25lT2YgJiYgQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5vbmVPZlxuICAgICAgLm1hcCgoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGpzb25TY2hlbWFUb1RzKHMsIGluZGVudCkpXG4gICAgICAuam9pbihcIiB8IFwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZSBhcyBzdHJpbmc7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSBcImFycmF5XCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gc2NoZW1hLml0ZW1zXG4gICAgICAgID8ganNvblNjaGVtYVRvVHMoc2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpbmRlbnQpXG4gICAgICAgIDogXCJ1bmtub3duXCI7XG4gICAgICByZXR1cm4gYEFycmF5PCR7aXRlbXN9PmA7XG4gICAgfVxuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzIGFzXG4gICAgICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIHVua25vd24+XCI7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICAgICAgY29uc3QgcGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcbiAgICAgIGNvbnN0IGNsb3NlUGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSByZXF1aXJlZC5oYXMoa2V5KSA/IFwiXCIgOiBcIj9cIjtcbiAgICAgICAgcmV0dXJuIGAke3BhZH0ke2tleX0ke29wdH06ICR7anNvblNjaGVtYVRvVHModmFsdWUsIGluZGVudCArIDEpfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBge1xcbiR7cHJvcHMuam9pbihcIjtcXG5cIil9O1xcbiR7Y2xvc2VQYWR9fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcodG9vbHM6IFRvb2xTZXQpOiBzdHJpbmcge1xuICBjb25zdCBzaWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKHRvb2xzKSkge1xuICAgIGNvbnN0IHJhdyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgaW5wdXRTY2hlbWEgPSBleHRyYWN0SnNvblNjaGVtYShyYXcuaW5wdXRTY2hlbWEgPz8gcmF3LnBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5vdXRwdXRTY2hlbWEpO1xuXG4gICAgY29uc3QgaW5wdXRUeXBlID0gaW5wdXRTY2hlbWEgPyBqc29uU2NoZW1hVG9UcyhpbnB1dFNjaGVtYSwgMikgOiBcInt9XCI7XG4gICAgY29uc3Qgb3V0cHV0VHlwZSA9IG91dHB1dFNjaGVtYVxuICAgICAgPyBqc29uU2NoZW1hVG9UcyhvdXRwdXRTY2hlbWEsIDIpXG4gICAgICA6IFwidW5rbm93blwiO1xuXG4gICAgc2lncy5wdXNoKGAgICAgJHtuYW1lfShpbnB1dDogJHtpbnB1dFR5cGV9KTogUHJvbWlzZTwke291dHB1dFR5cGV9PmApO1xuICB9XG5cbiAgcmV0dXJuIGB0eXBlIENvbnRleHQgPSB7XFxuICB0b29sczoge1xcbiR7c2lncy5qb2luKFwiO1xcblwiKX07XFxuICB9XFxufWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVJblNhbmRib3goe1xuICBjb2RlLFxuICBycGNEaXIsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgc2FuZGJveCxcbiAgYXZhaWxhYmxlVG9vbHMsXG4gIG9uU3ViVG9vbENhbGwsXG4gIHRvb2xDb250ZXh0LFxufToge1xuICBjb2RlOiBzdHJpbmc7XG4gIHJwY0Rpcjogc3RyaW5nO1xuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBhdmFpbGFibGVUb29sczogVG9vbFNldDtcbiAgb25TdWJUb29sQ2FsbD86IE9uU3ViVG9vbENhbGw7XG4gIHRvb2xDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIHJwY0Rpcl0sXG4gIH0pO1xuICBpZiAobWtkaXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWtkaXJSZXN1bHQubWVzc2FnZSB9O1xuICB9XG4gIGF3YWl0IG1rZGlyUmVzdWx0LnJlc3VsdDtcblxuICBhd2FpdCBzYW5kYm94LndyaXRlRmlsZXMoe1xuICAgIGZpbGVzOiBbXG4gICAgICB7IHBhdGg6IFwicnVubmVyLm1qc1wiLCBjb250ZW50OiBSVU5ORVJfU0NSSVBUIH0sXG4gICAgICB7IHBhdGg6IFwiY29kZS5qc1wiLCBjb250ZW50OiBjb2RlIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6IFwidG9vbHMuanNvblwiLFxuICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhhdmFpbGFibGVUb29scykpLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGRlc3RQYXRoOiBycGNEaXIsXG4gIH0pO1xuXG4gIGNvbnN0IG5vZGVNYWpvciA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXCIuXCIpWzBdLCAxMCk7XG4gIGNvbnN0IHBlcm1pc3Npb25GbGFnID1cbiAgICBub2RlTWFqb3IgPj0gMjIgPyBcIi0tcGVybWlzc2lvblwiIDogXCItLWV4cGVyaW1lbnRhbC1wZXJtaXNzaW9uXCI7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJub2RlXCIsXG4gICAgYXJnczogW1xuICAgICAgcGVybWlzc2lvbkZsYWcsXG4gICAgICBgLS1hbGxvdy1mcy1yZWFkPSR7cnBjRGlyfWAsXG4gICAgICBgLS1hbGxvdy1mcy13cml0ZT0ke3JwY0Rpcn1gLFxuICAgICAgYCR7cnBjRGlyfS9ydW5uZXIubWpzYCxcbiAgICBdLFxuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlIH07XG4gIH1cblxuICBjb25zdCBmYXRhbDogeyBlcnJvcjogRXJyb3IgfCBudWxsIH0gPSB7IGVycm9yOiBudWxsIH07XG5cbiAgY29uc3QgYWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgaWYgKCFmYXRhbC5lcnJvcikge1xuICAgICAgZmF0YWwuZXJyb3IgPSBlcnJvcjtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVUb29sUmVxdWVzdCA9IGFzeW5jIChyZXF1ZXN0SnNvbjogc3RyaW5nKSA9PiB7XG4gICAgbGV0IHBhcnNlZDogeyBpZDogc3RyaW5nOyB0b29sOiBzdHJpbmc7IGlucHV0OiB1bmtub3duIH07XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVxdWVzdEpzb24pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaWQsIHRvb2w6IHRvb2xOYW1lLCBpbnB1dCB9ID0gcGFyc2VkO1xuXG4gICAgbGV0IHJlc3BvbnNlOiB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBhdmFpbGFibGVUb29sc1t0b29sTmFtZV07XG4gICAgICBpZiAoIXQ/LmV4ZWN1dGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUb29sICR7dG9vbE5hbWV9IG5vdCBmb3VuZCBvciBoYXMgbm8gZXhlY3V0ZSBmdW5jdGlvbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4ZWMgPSB0LmV4ZWN1dGUuYmluZCh0KTtcbiAgICAgIGNvbnN0IGV4ZWNPcHRpb25zID0ge1xuICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgIG1lc3NhZ2VzOiBbXSxcbiAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgfTtcbiAgICAgIGlmIChvblN1YlRvb2xDYWxsKSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgb25TdWJUb29sQ2FsbCh0b29sTmFtZSwgaW5wdXQsICgpID0+XG4gICAgICAgICAgZXhlYyhpbnB1dCwgZXhlY09wdGlvbnMpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjKGlucHV0LCBleGVjT3B0aW9ucyk7XG4gICAgICAgIHJlc3BvbnNlID0geyByZXN1bHQgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIHJlc3BvbnNlID0geyBlcnJvcjogbXNnIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgIGZpbGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogYCR7aWR9LnJlc3BvbnNlLmpzb25gLFxuICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGRlc3RQYXRoOiBycGNEaXIsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgd3JpdGluZyB0aGUgcmVzcG9uc2UgZmlsZSBmYWlscywgdGhlIHJ1bm5lciB3aWxsIHBvbGwgZm9yZXZlclxuICAgICAgICogd2FpdGluZyBmb3IgaXQuIEFib3J0IHRoZSBydW5uZXIgcHJvY2VzcyBzbyB3ZSBkb24ndCBkZWFkbG9jay5cbiAgICAgICAqL1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgYWJvcnQobmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgUlBDIHJlc3BvbnNlIGZvciAke3Rvb2xOYW1lfTogJHttc2d9YCkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB0b29sQ2FsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgbGV0IHN0ZGVyckJ1ZmZlciA9IFwiXCI7XG4gIGxldCBub25NYXJrZXJTdGRlcnIgPSBcIlwiO1xuXG4gIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBhYm9ydChcbiAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgYEphdmFTY3JpcHQgZXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke0VYRUNVVElPTl9USU1FT1VUX01TIC8gMTAwMH1zYFxuICAgICAgKVxuICAgICk7XG4gIH0sIEVYRUNVVElPTl9USU1FT1VUX01TKTtcblxuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgZXhlY1Jlc3VsdC5sb2dzKCkpIHtcbiAgICAgIGlmIChmYXRhbC5lcnJvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5LnN0cmVhbSA9PT0gXCJzdGRlcnJcIikge1xuICAgICAgICBzdGRlcnJCdWZmZXIgKz0gZW50cnkuZGF0YTtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gc3RkZXJyQnVmZmVyLmluZGV4T2YoUkVRVUVTVF9NQVJLRVJfU1RBUlQpO1xuICAgICAgICAgIGlmIChzdGFydElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZU1hcmtlciA9IHN0ZGVyckJ1ZmZlci5zbGljZSgwLCBzdGFydElkeCk7XG4gICAgICAgICAgaWYgKGJlZm9yZU1hcmtlci50cmltKCkpIHtcbiAgICAgICAgICAgIG5vbk1hcmtlclN0ZGVyciArPSBiZWZvcmVNYXJrZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29udGVudFN0YXJ0ID0gc3RhcnRJZHggKyBSRVFVRVNUX01BUktFUl9TVEFSVC5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gc3RkZXJyQnVmZmVyLmluZGV4T2YoUkVRVUVTVF9NQVJLRVJfRU5ELCBjb250ZW50U3RhcnQpO1xuICAgICAgICAgIGlmIChlbmRJZHggPT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0SnNvbiA9IHN0ZGVyckJ1ZmZlci5zbGljZShjb250ZW50U3RhcnQsIGVuZElkeCk7XG4gICAgICAgICAgc3RkZXJyQnVmZmVyID0gc3RkZXJyQnVmZmVyLnNsaWNlKGVuZElkeCArIFJFUVVFU1RfTUFSS0VSX0VORC5sZW5ndGgpO1xuXG4gICAgICAgICAgdG9vbENhbGxQcm9taXNlcy5wdXNoKGhhbmRsZVRvb2xSZXF1ZXN0KHJlcXVlc3RKc29uKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG5cbiAgaWYgKHN0ZGVyckJ1ZmZlci50cmltKCkpIHtcbiAgICBub25NYXJrZXJTdGRlcnIgKz0gc3RkZXJyQnVmZmVyO1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRvb2xDYWxsUHJvbWlzZXMpO1xuXG4gIGlmIChmYXRhbC5lcnJvcikge1xuICAgIGV4ZWNSZXN1bHQucmVzdWx0LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IGZhdGFsLmVycm9yLm1lc3NhZ2UsXG4gICAgICAuLi4obm9uTWFya2VyU3RkZXJyID8geyBzdGRlcnI6IG5vbk1hcmtlclN0ZGVyci5zbGljZSgwLCAyMDAwKSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogYFJ1bm5lciBmYWlsZWQgKGV4aXQgJHtleGl0Q29kZX0pLmAsXG4gICAgICBzdGRlcnI6IChub25NYXJrZXJTdGRlcnIgKyBzdGRlcnIpLnNsaWNlKDAsIDIwMDApLFxuICAgICAgc3Rkb3V0OiBzdGRvdXQuc2xpY2UoMCwgMTAwMCksXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSmF2YVNjcmlwdFRvb2wob3B0czoge1xuICB0b29sczogVG9vbFNldDtcbiAgc2FuZGJveDogU2FuZGJveEluc3RhbmNlO1xuICBhY3RpdmVUb29scz86IHN0cmluZ1tdO1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbiAgdG9vbENvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn0pIHtcbiAgY29uc3QgeyBzYW5kYm94LCBvblN1YlRvb2xDYWxsIH0gPSBvcHRzO1xuICBjb25zdCBhY3RpdmVTZXQgPSBvcHRzLmFjdGl2ZVRvb2xzID8gbmV3IFNldChvcHRzLmFjdGl2ZVRvb2xzKSA6IG51bGw7XG4gIGNvbnN0IGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMudG9vbHMpKSB7XG4gICAgaWYgKCFhY3RpdmVTZXQgfHwgYWN0aXZlU2V0LmhhcyhuYW1lKSkge1xuICAgICAgYXZhaWxhYmxlVG9vbHNbbmFtZV0gPSB0O1xuICAgIH1cbiAgfVxuICBjb25zdCBjb250ZXh0VHlwZSA9IGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcoYXZhaWxhYmxlVG9vbHMpO1xuXG4gIHJldHVybiB0b29sKHtcbiAgICAuLi5idWlsdEluVG9vbHMuSmF2YVNjcmlwdCxcbiAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGUgSmF2YVNjcmlwdCB0byBvcmNoZXN0cmF0ZSBtdWx0aXBsZSB0b29sIGNhbGxzIGluIGEgc2luZ2xlIHN0ZXAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcnVuIHNldmVyYWwgdG9vbHMgaW4gc2VxdWVuY2UsIHRyYW5zZm9ybSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgb3IgcGFyYWxsZWxpemUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucyB3aXRoIFByb21pc2UuYWxsLlxuXG5UaGUgY29kZSBydW5zIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIGJvZHkgd2l0aCBcXGBjdHhcXGAgaW4gc2NvcGU6XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbiR7Y29udGV4dFR5cGV9XG5cXGBcXGBcXGBcblxuRXhhbXBsZXM6XG4tIFNlcXVlbnRpYWw6IFxcYGNvbnN0IGZpbGUgPSBhd2FpdCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwicGFja2FnZS5qc29uXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKGZpbGUuY29udGVudCk7XFxgXG4tIFBhcmFsbGVsOiBcXGBjb25zdCBbYSwgYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImEudHNcIiB9KSwgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImIudHNcIiB9KV0pOyByZXR1cm4geyBhOiBhLmNvbnRlbnQsIGI6IGIuY29udGVudCB9O1xcYFxuLSBUcmFuc2Zvcm06IFxcYGNvbnN0IGdyZXAgPSBhd2FpdCBjdHgudG9vbHMuR3JlcCh7IHBhdHRlcm46IFwiVE9ET1wiIH0pOyByZXR1cm4gZ3JlcC5tYXRjaGVzLnNwbGl0KFwiXFxcXG5cIikubGVuZ3RoO1xcYFxuLSBCYXNoOiBcXGBjb25zdCByID0gYXdhaXQgY3R4LnRvb2xzLkJhc2goeyBjb21tYW5kOiBcIm5vZGUgLWUgXFxcXFwiY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe3Y6MX0pKVxcXFxcIlwiIH0pOyByZXR1cm4gSlNPTi5wYXJzZShyLnN0ZG91dCk7XFxgXG5cblJldHVybiBhIHZhbHVlIHRvIHBhc3MgcmVzdWx0cyBiYWNrLiBVc2UgY29uc29sZS5sb2coKSBmb3IgZGVidWcgb3V0cHV0LlxuSW1wb3J0YW50OiBFYWNoIHRvb2wgcmV0dXJucyBhIHN0cnVjdHVyZWQgb2JqZWN0IG1hdGNoaW5nIGl0cyBvdXRwdXQgc2NoZW1hIFx1MjAxNCBub3QgYSByYXcgc3RyaW5nLiBBY2Nlc3MgdGhlIHNwZWNpZmljIGZpZWxkIHlvdSBuZWVkIChlLmcuIEJhc2gncyByZXN1bHQuc3Rkb3V0LCBSZWFkJ3MgcmVzdWx0LmNvbnRlbnQpIHJhdGhlciB0aGFuIHRyeWluZyB0byBwYXJzZSB0aGUgZW50aXJlIHJlc3VsdC5gLFxuICAgIGV4ZWN1dGU6ICh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgcnVuSWQgPSBgcnVuXyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgLnNsaWNlKDIsIDgpfWA7XG4gICAgICBjb25zdCBycGNEaXIgPSBgLmFnZW50L2pzLXJwYy8ke3J1bklkfWA7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHJldHVybiBleGVjdXRlSW5TYW5kYm94KHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgcnBjRGlyLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzLFxuICAgICAgICBvblN1YlRvb2xDYWxsLFxuICAgICAgICB0b29sQ29udGV4dDogb3B0cy50b29sQ29udGV4dCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHR5cGUgeyBBbnlBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgQnVpbHRJblRvb2xOYW1lIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuLyoqIEJ1aWx0LWluIGRlZmF1bHRzIGZvciBuZWVkc0FwcHJvdmFsICh1c2VyIGNhbiBvdmVycmlkZSB2aWEgYWdlbnQgY29uZmlnKS4gKi9cbmNvbnN0IGJ1aWx0aW5OZWVkc0FwcHJvdmFsOiBQYXJ0aWFsPFJlY29yZDxCdWlsdEluVG9vbE5hbWUsIGJvb2xlYW4+PiA9IHt9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tOZWVkc0FwcHJvdmFsKHtcbiAgYWdlbnQsXG4gIHRvb2xOYW1lLFxuICBpbnB1dCxcbiAgdG9vbENhbGxJZCxcbiAgbWVzc2FnZXMsXG59OiB7XG4gIGFnZW50OiBBbnlBZ2VudDtcbiAgdG9vbE5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgbWVzc2FnZXM6IHVua25vd25bXTtcbn0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gMS4gUGVyLXRvb2wgbmVlZHNBcHByb3ZhbCBvbiB0aGUgVG9vbCBkZWZpbml0aW9uIHRha2VzIHByaW9yaXR5XG4gIGNvbnN0IHRvb2xEZWYgPSBhZ2VudC5vcHRpb25zLnRvb2xzPy5bdG9vbE5hbWVdIGFzIFRvb2wgfCB1bmRlZmluZWQ7XG4gIGlmICh0b29sRGVmPy5uZWVkc0FwcHJvdmFsICE9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHRvb2xEZWYubmVlZHNBcHByb3ZhbCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB0b29sRGVmLm5lZWRzQXBwcm92YWw7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0b29sRGVmLm5lZWRzQXBwcm92YWwoaW5wdXQsIHtcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICBtZXNzYWdlczogbWVzc2FnZXMgYXMgbmV2ZXJbXSxcbiAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICAvLyAyLiBBZ2VudC1sZXZlbCBuZWVkc0FwcHJvdmFsIG1hcFxuICBjb25zdCBhZ2VudEVudHJ5ID0gKFxuICAgIGFnZW50Lm9wdGlvbnMubmVlZHNBcHByb3ZhbCBhc1xuICAgICAgfCBSZWNvcmQ8XG4gICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgIGJvb2xlYW4gfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pXG4gICAgICAgID5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk/Llt0b29sTmFtZV07XG5cbiAgaWYgKGFnZW50RW50cnkgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgYWdlbnRFbnRyeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBhZ2VudEVudHJ5O1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgYWdlbnRFbnRyeShpbnB1dCwge1xuICAgICAgdG9vbENhbGxJZCxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDMuIEJ1aWx0LWluIGRlZmF1bHRzXG4gIHJldHVybiBidWlsdGluTmVlZHNBcHByb3ZhbFt0b29sTmFtZSBhcyBCdWlsdEluVG9vbE5hbWVdID8/IGZhbHNlO1xufVxuIiwgImltcG9ydCB0eXBlIHsgSlNPTlZhbHVlLCBNb2RlbE1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcblxudHlwZSBQcm92aWRlck9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBKU09OVmFsdWU+PjtcblxuY29uc3QgQU5USFJPUElDX01BWF9DQUNIRV9CUkVBS1BPSU5UU19QRVJfUkVRVUVTVCA9IDQ7XG5cbmNvbnN0IENMQVVERV9MSUtFX01PREVMX01BVENIRVJTID0gW1wiY2xhdWRlXCIsIFwiYW50aHJvcGljXCJdO1xuXG5jb25zdCBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUzogUHJvdmlkZXJPcHRpb25zID0ge1xuICBhbnRocm9waWM6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBvcGVucm91dGVyOiB7XG4gICAgY2FjaGVDb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgYmVkcm9jazoge1xuICAgIGNhY2hlUG9pbnQ6IHsgdHlwZTogXCJkZWZhdWx0XCIgfSxcbiAgfSxcbiAgb3BlbmFpQ29tcGF0aWJsZToge1xuICAgIGNhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBjb3BpbG90OiB7XG4gICAgY29waWxvdF9jYWNoZV9jb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEdhdGV3YXlQcm92aWRlcihtb2RlbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHNsYXNoSW5kZXggPSBtb2RlbC5pbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG1vZGVsLnNsaWNlKDAsIHNsYXNoSW5kZXgpO1xufVxuXG5mdW5jdGlvbiBjb3VudEFudGhyb3BpY0NhY2hlQnJlYWtwb2ludHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyIHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgY29uc3QgcHJvdmlkZXJPcHRpb25zID0gKG1lc3NhZ2UgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfSlcbiAgICAgIC5wcm92aWRlck9wdGlvbnM7XG4gICAgaWYgKHByb3ZpZGVyT3B0aW9ucz8uYW50aHJvcGljPy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICBwYXJ0IGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICAgICAgKS5wcm92aWRlck9wdGlvbnM7XG4gICAgICAgIGlmIChwYXJ0UHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG5mdW5jdGlvbiBpc0NsYXVkZUxpa2VNb2RlbChtb2RlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxvd2VyID0gbW9kZWwudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIENMQVVERV9MSUtFX01PREVMX01BVENIRVJTLnNvbWUoKG0pID0+IGxvd2VyLmluY2x1ZGVzKG0pKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm92aWRlck9wdGlvbnMob3B0czoge1xuICBjdXJyZW50OiBQcm92aWRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIHBhdGNoOiBQcm92aWRlck9wdGlvbnM7XG59KTogUHJvdmlkZXJPcHRpb25zIHtcbiAgY29uc3QgbmV4dDogUHJvdmlkZXJPcHRpb25zID0geyAuLi4ob3B0cy5jdXJyZW50ID8/IHt9KSB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLnBhdGNoKSkge1xuICAgIG5leHRba2V5XSA9IHsgLi4uKG5leHRba2V5XSA/PyB7fSksIC4uLnZhbHVlIH07XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghcGFydCB8fCB0eXBlb2YgcGFydCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBwYXJ0ICYmIChwYXJ0IGFzIHsgdHlwZT86IHVua25vd24gfSkudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHBhcnQgYXMgeyB0ZXh0PzogdW5rbm93biB9KS50ZXh0O1xuICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRleHQudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQpIHtcbiAgICBjb25zdCB0eXBlID0gKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlO1xuICAgIGlmICh0eXBlID09PSBcInRoaW5raW5nXCIgfHwgdHlwZSA9PT0gXCJyZWFzb25pbmdcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2U6IE1vZGVsTWVzc2FnZSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC5zb21lKChwYXJ0KSA9PiBpc0NhY2hlYWJsZUNsYXVkZVBhcnQocGFydCkpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChjb250ZW50OiB1bmtub3duW10pOiBudW1iZXIgfCBudWxsIHtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBpZiAoaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KGNvbnRlbnRbaV0pKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdENsYXVkZUNhY2hpbmdUYXJnZXRzKG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSk6IG51bWJlcltdIHtcbiAgY29uc3Qgc3lzdGVtSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZmluYWxJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoICYmIHN5c3RlbUluZGljZXMubGVuZ3RoIDwgMjsgaSArPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgc3lzdGVtSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDAgJiYgZmluYWxJbmRpY2VzLmxlbmd0aCA8IDI7IGkgLT0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcbiAgICBpZiAobWVzc2FnZS5yb2xlICE9PSBcInN5c3RlbVwiICYmIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZSkpIHtcbiAgICAgIGZpbmFsSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmFsSW5kaWNlcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIFsuLi5zeXN0ZW1JbmRpY2VzLCAuLi5maW5hbEluZGljZXNdO1xufVxuXG5mdW5jdGlvbiBhcHBseUNsYXVkZVByb21wdENhY2hpbmcob3B0czoge1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIHByb3ZpZGVySWQ6IHN0cmluZyB8IG51bGw7XG4gIG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdDogbnVtYmVyO1xufSk6IE1vZGVsTWVzc2FnZVtdIHtcbiAgY29uc3QgZXhpc3RpbmdCcmVha3BvaW50cyA9IGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhvcHRzLm1lc3NhZ2VzKTtcbiAgY29uc3QgcmVtYWluaW5nQnVkZ2V0ID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICBvcHRzLm1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCAtIGV4aXN0aW5nQnJlYWtwb2ludHNcbiAgKTtcblxuICBpZiAocmVtYWluaW5nQnVkZ2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdHMubWVzc2FnZXM7XG4gIH1cblxuICBjb25zdCB0YXJnZXRJbmRpY2VzID0gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMob3B0cy5tZXNzYWdlcykuc2xpY2UoXG4gICAgMCxcbiAgICByZW1haW5pbmdCdWRnZXRcbiAgKTtcbiAgaWYgKHRhcmdldEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdHMubWVzc2FnZXM7XG4gIH1cblxuICBjb25zdCB1c2VNZXNzYWdlTGV2ZWxPcHRpb25zID1cbiAgICBvcHRzLnByb3ZpZGVySWQgPT09IFwiYW50aHJvcGljXCIgfHxcbiAgICBCb29sZWFuKG9wdHMucHJvdmlkZXJJZD8uaW5jbHVkZXMoXCJiZWRyb2NrXCIpKTtcblxuICBjb25zdCBuZXh0TWVzc2FnZXMgPSBvcHRzLm1lc3NhZ2VzLnNsaWNlKCk7XG5cbiAgZm9yIChjb25zdCBtZXNzYWdlSW5kZXggb2YgdGFyZ2V0SW5kaWNlcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcblxuICAgIGNvbnN0IHNob3VsZFVzZUNvbnRlbnRPcHRpb25zID1cbiAgICAgICF1c2VNZXNzYWdlTGV2ZWxPcHRpb25zICYmXG4gICAgICBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgJiZcbiAgICAgIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNob3VsZFVzZUNvbnRlbnRPcHRpb25zICYmIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgY29uc3QgcGFydEluZGV4ID0gZmluZExhc3RDYWNoZWFibGVQYXJ0SW5kZXgobWVzc2FnZS5jb250ZW50KTtcbiAgICAgIGlmIChwYXJ0SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcGFydCA9IG1lc3NhZ2UuY29udGVudFtwYXJ0SW5kZXhdO1xuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGNvbnN0IHBhcnRQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICAgICAgICBwYXJ0IGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgICAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50LnNsaWNlKCk7XG4gICAgICAgICAgbmV4dENvbnRlbnRbcGFydEluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLihwYXJ0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICAgICAgICBjdXJyZW50OiBwYXJ0UHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9IGFzICh0eXBlb2YgbWVzc2FnZS5jb250ZW50KVtudW1iZXJdO1xuXG4gICAgICAgICAgbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgY29udGVudDogbmV4dENvbnRlbnQsXG4gICAgICAgICAgfSBhcyBNb2RlbE1lc3NhZ2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlUHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgbWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgKS5wcm92aWRlck9wdGlvbnM7XG5cbiAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICBwcm92aWRlck9wdGlvbnM6IG1lcmdlUHJvdmlkZXJPcHRpb25zKHtcbiAgICAgICAgY3VycmVudDogbWVzc2FnZVByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgcGF0Y2g6IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBuZXh0TWVzc2FnZXM7XG59XG5cbmV4cG9ydCB0eXBlIFByb21wdENhY2hpbmdSZXN1bHQgPSB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJPcHRpb25zOiBQcm92aWRlck9wdGlvbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3Qob3B0czoge1xuICBtb2RlbDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBhbnRocm9waWM/OiB7IG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdD86IG51bWJlciB9O1xuICBvcGVuYWk/OiB7IHNldFByb21wdENhY2hlS2V5PzogYm9vbGVhbiB9O1xufSk6IFByb21wdENhY2hpbmdSZXN1bHQge1xuICBjb25zdCBwcm92aWRlciA9IGdldEdhdGV3YXlQcm92aWRlcihvcHRzLm1vZGVsKTtcblxuICBjb25zdCBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucyA9IHt9O1xuXG4gIGlmIChcbiAgICAocHJvdmlkZXIgPT09IFwib3BlbmFpXCIgfHwgcHJvdmlkZXIgPT09IFwiYXp1cmVcIikgJiZcbiAgICBvcHRzLm9wZW5haT8uc2V0UHJvbXB0Q2FjaGVLZXkgIT09IGZhbHNlXG4gICkge1xuICAgIHByb3ZpZGVyT3B0aW9ucy5vcGVuYWkgPSB7IHByb21wdENhY2hlS2V5OiBvcHRzLnNlc3Npb25JZCB9O1xuICB9XG5cbiAgY29uc3QgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0ID1cbiAgICBvcHRzLmFudGhyb3BpYz8ubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0ID8/XG4gICAgQU5USFJPUElDX01BWF9DQUNIRV9CUkVBS1BPSU5UU19QRVJfUkVRVUVTVDtcblxuICBjb25zdCBjYWNoZWRNZXNzYWdlcyA9IGlzQ2xhdWRlTGlrZU1vZGVsKG9wdHMubW9kZWwpXG4gICAgPyBhcHBseUNsYXVkZVByb21wdENhY2hpbmcoe1xuICAgICAgICBtZXNzYWdlczogb3B0cy5tZXNzYWdlcyxcbiAgICAgICAgcHJvdmlkZXJJZDogcHJvdmlkZXIsXG4gICAgICAgIG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCxcbiAgICAgIH0pXG4gICAgOiBvcHRzLm1lc3NhZ2VzO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXM6IGNhY2hlZE1lc3NhZ2VzLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZUNodW5rIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IHsgU2Vzc2lvbk5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5pbXBvcnQgeyBnZXRBY3RpdmVSdW5zLCByZXBsYXlBY3RpdmVSdW4gfSBmcm9tIFwiLi9zZW5kXCI7XG5cbmV4cG9ydCB0eXBlIFN0cmVhbU9wdGlvbnMgPSB7XG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgc3RhcnRJbmRleD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93UnVuTGlrZSA9IHtcbiAgZ2V0UmVhZGFibGUob3B0aW9ucz86IHsgc3RhcnRJbmRleD86IG51bWJlciB9KTogUmVhZGFibGVTdHJlYW07XG59O1xuXG5mdW5jdGlvbiBpc1dvcmtmbG93UnVuKGFyZzogdW5rbm93bik6IGFyZyBpcyBXb3JrZmxvd1J1bkxpa2Uge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiZcbiAgICBhcmcgIT09IG51bGwgJiZcbiAgICBcImdldFJlYWRhYmxlXCIgaW4gYXJnICYmXG4gICAgdHlwZW9mIChhcmcgYXMgV29ya2Zsb3dSdW5MaWtlKS5nZXRSZWFkYWJsZSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW0oXG4gIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCxcbiAgcnVuT3JPcHRzPzogV29ya2Zsb3dSdW5MaWtlIHwgU3RyZWFtT3B0aW9uc1xuKTogUHJvbWlzZTxSZWFkYWJsZVN0cmVhbTxVSU1lc3NhZ2VDaHVuaz4+IHtcbiAgaWYgKGlzV29ya2Zsb3dSdW4ocnVuT3JPcHRzKSkge1xuICAgIGNvbnN0IHJlYWRlciA9IHJ1bk9yT3B0cy5nZXRSZWFkYWJsZSgpLmdldFJlYWRlcigpO1xuICAgIC8vIGF3YWl0IGZvciB0aGUgZmlyc3QgY2h1bmsgdG8gYmUgcmVhZHkgYmVmb3JlIGZpbmlzaGluZyB0aGUgd29ya2Zsb3cgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zXG4gICAgYXdhaXQgcmVhZGVyLnJlYWQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgU3RyZWFtRXJyb3Ioe1xuICAgICAgICBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLFxuICAgICAgICByZWFzb246IFwic3RyZWFtKCkgZmFpbGVkIHRvIHJlYWQgZmlyc3QgY2h1bmsgZnJvbSB3b3JrZmxvdyBydW5cIixcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlYWRlci5jYW5jZWwoKTtcblxuICAgIHJldHVybiBydW5Pck9wdHMuZ2V0UmVhZGFibGUoKTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBydW5Pck9wdHM7XG4gIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzZXNzaW9uQ29udGV4dC5hZ2VudC5zdG9yYWdlLnNlc3Npb24uZ2V0KFxuICAgIHNlc3Npb25Db250ZXh0LnNlc3Npb25JZFxuICApO1xuICBpZiAoIXNlc3Npb24pIHtcbiAgICB0aHJvdyBuZXcgU2Vzc2lvbk5vdEZvdW5kRXJyb3IoeyBpZDogc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkIH0pO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2VJZCA9IG9wdHM/Lm1lc3NhZ2VJZCA/PyBzZXNzaW9uLmxhc3RNZXNzYWdlSWQ7XG4gIGlmICghbWVzc2FnZUlkKSB7XG4gICAgdGhyb3cgbmV3IFN0cmVhbUVycm9yKHtcbiAgICAgIGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICByZWFzb246IFwiTm8gbWVzc2FnZSB0byBzdHJlYW1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZVJ1bnMgPSBnZXRBY3RpdmVSdW5zKCk7XG4gIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVJ1bnMuZ2V0KG1lc3NhZ2VJZCk7XG4gIGlmICghYWN0aXZlKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICBpZiAobWVzc2FnZT8ud29ya2Zsb3dSdW5JZCkge1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBpbXBvcnQoXCJ3b3JrZmxvdy9hcGlcIilcbiAgICAgICAgLnRoZW4oKHsgZ2V0UnVuIH0pID0+IGdldFJ1bihtZXNzYWdlLndvcmtmbG93UnVuSWQhKS5nZXRSZWFkYWJsZSgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIGlmIChyZWFkYWJsZSkge1xuICAgICAgICByZXR1cm4gcmVhZGFibGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFN0cmVhbUVycm9yKHtcbiAgICAgIGlkOiBzZXNzaW9uQ29udGV4dC5zZXNzaW9uSWQsXG4gICAgICByZWFzb246IGBObyBhY3RpdmUgcnVuIGZvciBtZXNzYWdlICR7bWVzc2FnZUlkfWAsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVwbGF5QWN0aXZlUnVuKGFjdGl2ZSwgb3B0cz8uc3RhcnRJbmRleCk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEVycm9yc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgY2xhc3MgU3RyZWFtRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlN0cmVhbUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiU3RyZWFtIGZhaWxlZCBmb3Igc2Vzc2lvbiAkaWQ6ICRyZWFzb25cIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyBTZXNzaW9uIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkNvbnRleHQgfSBmcm9tIFwiLi9oYW5kbGVcIjtcblxuZXhwb3J0IHR5cGUgVXBkYXRlT3B0aW9ucyA9IFBhcnRpYWw8XG4gIE9taXQ8U2Vzc2lvbiwgXCJpZFwiIHwgXCJjcmVhdGVkQXRcIiB8IFwidXBkYXRlZEF0XCI+XG4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKFxuICBzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQsXG4gIG9wdHM6IFVwZGF0ZU9wdGlvbnNcbikge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IHVwZGF0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob3B0cykuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICk7XG5cbiAgaWYgKE9iamVjdC5rZXlzKHVwZGF0ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNlc3Npb25Db250ZXh0LmFnZW50LnN0b3JhZ2Uuc2Vzc2lvbi51cGRhdGUoc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkLCB7XG4gICAgLi4udXBkYXRlcyxcbiAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gIH0pO1xufVxuIiwgImltcG9ydCB7IGNvbXB1dGVTZXNzaW9uVXNhZ2UsIHR5cGUgU2Vzc2lvblVzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL3VzYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSBcIi4vaGFuZGxlXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1c2FnZShcbiAgc2Vzc2lvbkNvbnRleHQ6IFNlc3Npb25Db250ZXh0XG4pOiBQcm9taXNlPFNlc3Npb25Vc2FnZT4ge1xuICBcInVzZSBzdGVwXCI7XG4gIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgc2Vzc2lvbkNvbnRleHQuYWdlbnQuc3RvcmFnZS5tZXNzYWdlLmxpc3RCeVNlc3Npb24oXG4gICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbklkXG4gICk7XG4gIHJldHVybiBjb21wdXRlU2Vzc2lvblVzYWdlKG1lc3NhZ2VzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7XG4gIEluZmVyVG9vbElucHV0LFxuICBJbmZlclVJVG9vbHMsXG4gIE1vZGVsTWVzc2FnZSxcbiAgVG9vbFNldCxcbiAgVUlNZXNzYWdlLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBCdWlsdEluVG9vbE5hbWUsIGJ1aWx0SW5Ub29scywgVG9vbENvbnRleHQgfSBmcm9tIFwiLi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgQW55QWdlbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFnZW50IFN0YXR1cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBUcmFuc2llbnQgc3RhdHVzIGluZGljYXRvcnMgZW1pdHRlZCBvdmVyIHRoZSBzdHJlYW0gZHVyaW5nIGxvbmctcnVubmluZyBwaGFzZXMuXG4gKiBEZWxpdmVyZWQgdG8gdGhlIGNsaWVudCBhcyBgZGF0YS1zdGF0dXNgIGNodW5rcyB3aXRoIGB0cmFuc2llbnQ6IHRydWVgIFx1MjAxNCBub3QgcGVyc2lzdGVkLlxuICovXG5leHBvcnQgY29uc3QgQWdlbnRTdGF0dXMgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInNhbmRib3gtc2V0dXBcIikgfSksXG4gIHoub2JqZWN0KHsgdHlwZTogei5saXRlcmFsKFwic2FuZGJveC1zZXR1cC1jb2xkXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcImxvYWRpbmctc2tpbGxzXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInByb2Nlc3NpbmctYXBwcm92YWxzXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcIm5lZWRzLWFwcHJvdmFsXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInRoaW5raW5nXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcImN1c3RvbVwiKSwgc3RhdHVzOiB6LnN0cmluZygpIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIEFnZW50U3RhdHVzID0gei5pbmZlcjx0eXBlb2YgQWdlbnRTdGF0dXM+O1xuXG5leHBvcnQgdHlwZSBBZ2VudERhdGFUeXBlcyA9IHsgc3RhdHVzOiBBZ2VudFN0YXR1cyB9O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSG9va3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIEFnZW50SG9va3MgPSB7XG4gIFwidG9vbC5iZWZvcmVcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgaW5wdXQ6IHVua25vd24gfT47XG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xuICBzdGF0dXM/OiAoc3RhdHVzOiBBZ2VudFN0YXR1cykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTmVlZHMgQXBwcm92YWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbnR5cGUgVG9vbE5hbWU8VG9vbHM+ID0gRXh0cmFjdDxrZXlvZiBUb29scywgc3RyaW5nPiB8IEJ1aWx0SW5Ub29sTmFtZTtcblxudHlwZSBUb29sSW5wdXQ8VG9vbHMsIEs+ID0gSyBleHRlbmRzIEJ1aWx0SW5Ub29sTmFtZVxuICA/IEluZmVyVG9vbElucHV0PCh0eXBlb2YgYnVpbHRJblRvb2xzKVtLXT5cbiAgOiBLIGV4dGVuZHMga2V5b2YgVG9vbHNcbiAgICA/IFRvb2xzW0tdIGV4dGVuZHMgaW1wb3J0KFwiYWlcIikuVG9vbFxuICAgICAgPyBJbmZlclRvb2xJbnB1dDxUb29sc1tLXT5cbiAgICAgIDogdW5rbm93blxuICAgIDogdW5rbm93bjtcblxuZXhwb3J0IHR5cGUgTmVlZHNBcHByb3ZhbE1hcDxUb29scz4gPSB7XG4gIFtLIGluIFRvb2xOYW1lPFRvb2xzPl0/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgKChcbiAgICAgICAgaW5wdXQ6IFRvb2xJbnB1dDxUb29scywgSz4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gICAgICAgICAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbmZlciBVSSBNZXNzYWdlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgdHlwZSBJbmZlclVJTWVzc2FnZTxBPiA9IEEgZXh0ZW5kcyB7XG4gIHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldDtcbiAgJFVJTWVzc2FnZTogVUlNZXNzYWdlPGluZmVyIE0+O1xufVxuICA/IFVJTWVzc2FnZTxNLCBBZ2VudERhdGFUeXBlcywgSW5mZXJVSVRvb2xzPFQ+PlxuICA6IEEgZXh0ZW5kcyB7IHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldCB9XG4gICAgPyBVSU1lc3NhZ2U8dW5rbm93biwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUPj5cbiAgICA6IFVJTWVzc2FnZTx1bmtub3duLCBBZ2VudERhdGFUeXBlcz47XG5cbmV4cG9ydCB0eXBlIFR5cGVkVUlNZXNzYWdlPFxuICBUTWVzc2FnZU1ldGFkYXRhID0gdW5rbm93bixcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0ID0gVG9vbFNldCxcbj4gPSBVSU1lc3NhZ2U8VE1lc3NhZ2VNZXRhZGF0YSwgQWdlbnREYXRhVHlwZXMsIEluZmVyVUlUb29sczxUb29scz4+O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgUmVnaXN0cnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNsYXNzIEFnZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiQWdlbnROb3RGb3VuZEVycm9yXCIsXG4gIG1lc3NhZ2U6IGBBZ2VudCBcIiRhZ2VudE5hbWVcIiBub3QgZm91bmQgaW4gcmVnaXN0cnkuXG5cbmhpbnQ6IGFnZW50KCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHdvcmtmbG93IHN0ZXBzIGV4ZWN1dGUuXG4gICAgICBWYWxpZCBsb2NhdGlvbnM6IG1vZHVsZSBzY29wZSwgb3IgaW5zaWRlIGEgXCJ1c2Ugd29ya2Zsb3dcIiBib2R5LlxuXG4gIC8vIE1vZHVsZSBzY29wZSAoc3RhdGljIGFnZW50cylcbiAgZXhwb3J0IGNvbnN0IG15QWdlbnQgPSBhZ2VudChcIiRhZ2VudE5hbWVcIiwgeyAuLi4gfSk7XG5cbiAgLy8gV29ya2Zsb3cgYm9keSAoZHluYW1pYyBhZ2VudHMpXG4gIGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coeyBpbnB1dCB9KSB7XG4gICAgXCJ1c2Ugd29ya2Zsb3dcIjtcbiAgICBjb25zdCBteUFnZW50ID0gYWdlbnQoXCIkYWdlbnROYW1lXCIsIHsgLi4uIH0pO1xuICAgIC4uLlxuICB9YCxcbn0pIHt9XG5cbmNvbnN0IEFHRU5UX1JFR0lTVFJZX0tFWSA9IFN5bWJvbC5mb3IoXCJleHBlcmltZW50YWwtYWdlbnQtcmVnaXN0cnlcIik7XG5cbmZ1bmN0aW9uIGdldEFnZW50UmVnaXN0cnkoKTogTWFwPHN0cmluZywgQW55QWdlbnQ+IHtcbiAgY29uc3QgZyA9IGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj47XG4gIGxldCByZWdpc3RyeSA9IGdbQUdFTlRfUkVHSVNUUllfS0VZXSBhcyBNYXA8c3RyaW5nLCBBbnlBZ2VudD4gfCB1bmRlZmluZWQ7XG4gIGlmICghcmVnaXN0cnkpIHtcbiAgICByZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICBnW0FHRU5UX1JFR0lTVFJZX0tFWV0gPSByZWdpc3RyeTtcbiAgfVxuICByZXR1cm4gcmVnaXN0cnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFnZW50KG5hbWU6IHN0cmluZywgYWdlbnQ6IEFueUFnZW50KSB7XG4gIGdldEFnZW50UmVnaXN0cnkoKS5zZXQobmFtZSwgYWdlbnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZW50PFJlcXVpcmVkIGV4dGVuZHMgYm9vbGVhbj4oXG4gIG5hbWU6IHN0cmluZyxcbiAgcmVxdWlyZWQ/OiBSZXF1aXJlZFxuKTogUmVxdWlyZWQgZXh0ZW5kcyB0cnVlID8gQW55QWdlbnQgOiBBbnlBZ2VudCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFnZW50ID0gZ2V0QWdlbnRSZWdpc3RyeSgpLmdldChuYW1lKTtcbiAgaWYgKHJlcXVpcmVkICYmICFhZ2VudCkge1xuICAgIHRocm93IG5ldyBBZ2VudE5vdEZvdW5kRXJyb3IoeyBhZ2VudE5hbWU6IG5hbWUgfSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50IGFzIFJlcXVpcmVkIGV4dGVuZHMgdHJ1ZSA/IEFueUFnZW50IDogQW55QWdlbnQgfCB1bmRlZmluZWQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTLHNCQUFzQiwwQkFBMEI7OztBQ0F6RCxTQUFTLFlBQVk7OztBQ0FkLElBQU0sV0FBVyxZQUFZO0FBQ2xDLE1BQUk7QUFDRixVQUFNLEVBQUUsbUJBQW1CLElBQUksTUFBTSxPQUFPLGNBQWM7QUFDMUQsV0FBTyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFBQSxFQUMzQyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDUEEsWUFBWSxZQUFZO0FBRWpCLElBQU0sdUJBQU4sY0FBMEMseUJBQWtCO0FBQUEsRUFDakUsTUFBTTtBQUFBLEVBQ04sU0FB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LE1BQ3ZCLFFBQVEsRUFBRSxHQUFHLEtBQUssUUFBUSxTQUFTLE1BQU0sS0FBSyxLQUFLO0FBQUEsTUFDbkQsV0FBVztBQUFBLElBQ2IsQ0FBQztBQUVELFFBQUksb0JBQW9CLEdBQUc7QUFDekIsTUFBQUEsS0FBSTtBQUFBLFFBQ0YsK0RBQTBELEtBQUssSUFBSTtBQUFBLE1BQ3JFO0FBQ0EsV0FBSyxtQkFBbUI7QUFBQSxRQUN0QixrQkFBa0IsRUFBRSxRQUFRLEtBQUssS0FBSyxDQUFDO0FBQUEsTUFDekM7QUFDQSxhQUFPLEtBQUs7QUFBQSxJQUNkO0FBRUEsSUFBQUEsS0FBSTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsU0FBSyxtQkFBbUIsVUFBVSxhQUFhLENBQUM7QUFDaEQsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRUEsSUFBSSxRQUFRO0FBQ1YsV0FBTyxFQUFFLEdBQUcsY0FBYyxHQUFHLEtBQUssUUFBUSxNQUFNO0FBQUEsRUFFbEQ7QUFBQSxFQUVBLElBQUksUUFBb0I7QUFDdEIsV0FBTyxLQUFLLFFBQVEsU0FBUyxDQUFDO0FBQUEsRUFDaEM7QUFBQSxFQUVTO0FBQUEsRUFFQTtBQVFYO0FBRU8sU0FBUyxNQUtkLE1BQWMsU0FBMkQ7QUFDekUsUUFBTSxXQUFXLElBQUksTUFLbkIsTUFBTSxPQUFPO0FBQ2YsZ0JBQWMsTUFBTSxRQUFRO0FBQzVCLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiYWdlbnQiLCAibG9nIiwgInJlc29sdmUiLCAiYWdlbnQiLCAidWxpZCIsICJ1c2FnZSIsICJlcnJvcmUiLCAidWxpZCIsICJhZ2VudCIsICJsb2ciLCAicmVhZEZpbGUiLCAicmVzb2x2ZSIsICJsb2ciLCAidG9vbCIsICJ1bGlkIiwgInoiLCAiZXhlYyIsICJhZ2VudCIsICJ0b29sIiwgInoiLCAiYWdlbnQiLCAidWxpZCIsICJzdGFydCIsICJhZ2VudCIsICJyZXNvbHZlIiwgImxvZyIsICJzYW5kYm94IiwgInN0cmVhbSIsICJ1c2FnZSIsICJhZ2VudCIsICJsb2ciLCAidWxpZCIsICJ1c2FnZSIsICJub3ciLCAiaWQiLCAiZXJyb3JlIiwgImFnZW50IiwgInVsaWQiLCAiZXJyb3JlIiwgInoiLCAiYWdlbnQiLCAiYWdlbnQiLCAibG9nIl0KfQo=
|