experimental-agent 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +9 -0
  2. package/dist/agent-workflow.d.mts +1 -1
  3. package/dist/agent-workflow.d.ts +1 -1
  4. package/dist/agent-workflow.js +352 -104
  5. package/dist/agent-workflow.mjs +1 -1
  6. package/dist/{chunk-W4SSZPDX.mjs → chunk-24UDM5XV.mjs} +4 -4
  7. package/dist/chunk-2ZXHR6T6.mjs +401 -0
  8. package/dist/chunk-4WDKWMVB.mjs +389 -0
  9. package/dist/chunk-IACG26TC.mjs +2212 -0
  10. package/dist/chunk-NGLND33F.mjs +1247 -0
  11. package/dist/{chunk-E7TOPGHY.mjs → chunk-RXPVLORL.mjs} +3 -3
  12. package/dist/{chunk-HJGPUEFC.mjs → chunk-YRYXN7W4.mjs} +7 -1
  13. package/dist/client-Bkuq-Dfa.d.mts +2340 -0
  14. package/dist/client-Bkuq-Dfa.d.ts +2340 -0
  15. package/dist/{client-YUU54ZZH.mjs → client-SNN3XDKO.mjs} +2 -2
  16. package/dist/client.d.mts +1 -1
  17. package/dist/client.d.ts +1 -1
  18. package/dist/client.js +1 -1
  19. package/dist/client.mjs +1 -1
  20. package/dist/{handler-LDFBSCRA.mjs → handler-WFNQWR6V.mjs} +2 -1
  21. package/dist/index.d.mts +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.js +623 -220
  24. package/dist/index.mjs +78 -40
  25. package/dist/lifecycle-workflow.d.mts +1 -1
  26. package/dist/lifecycle-workflow.d.ts +1 -1
  27. package/dist/lifecycle-workflow.js +88 -6
  28. package/dist/lifecycle-workflow.mjs +1 -1
  29. package/dist/local-fs-handlers-ESZBRAWK.mjs +439 -0
  30. package/dist/next/loader.js +3 -3
  31. package/dist/next/loader.mjs +1 -1
  32. package/dist/next.js +10 -4
  33. package/dist/next.mjs +9 -3
  34. package/dist/{sandbox-GPCA35PJ.mjs → sandbox-IFK5MVRM.mjs} +3 -3
  35. package/dist/{storage-LL6IA24R.mjs → storage-FCSHTDLC.mjs} +3 -3
  36. package/package.json +2 -2
  37. package/dist/chunk-2SPAJ777.mjs +0 -365
  38. package/dist/chunk-6J462JGP.mjs +0 -1267
  39. package/dist/chunk-ILPVXRI5.mjs +0 -2026
  40. package/dist/chunk-ORE6LK2L.mjs +0 -344
  41. package/dist/client-CKLwB-ES.d.mts +0 -2115
  42. package/dist/client-CKLwB-ES.d.ts +0 -2115
  43. package/dist/local-fs-handlers-SY2RDXZE.mjs +0 -314
package/dist/index.js CHANGED
@@ -192,7 +192,7 @@ chmod +x $HOME/.agent/bin/run.sh`
192
192
  });
193
193
 
194
194
  // src/errors.ts
195
- var errore, SessionNotFoundError, SessionError, SandboxNotFoundError, StorageError, SandboxError, MessageNotFoundError;
195
+ var errore, SessionNotFoundError, SessionError, SandboxNotFoundError, StorageError, StorageConflictError, SandboxError, MessageNotFoundError;
196
196
  var init_errors = __esm({
197
197
  "src/errors.ts"() {
198
198
  "use strict";
@@ -217,6 +217,11 @@ var init_errors = __esm({
217
217
  message: "$reason"
218
218
  }) {
219
219
  };
220
+ StorageConflictError = class extends errore.createTaggedError({
221
+ name: "StorageConflictError",
222
+ message: "$reason"
223
+ }) {
224
+ };
220
225
  SandboxError = class extends errore.createTaggedError({
221
226
  name: "SandboxError",
222
227
  message: "$reason"
@@ -242,7 +247,12 @@ function getStorageClient(rpcFn, name) {
242
247
  async function rpc(method, params) {
243
248
  const result = await rpcFn({ name, method, params });
244
249
  if ("error" in result) {
245
- throw new StorageError({ reason: result.error.message });
250
+ if (result.error.code === "CONFLICT") {
251
+ throw new StorageConflictError({ reason: result.error.message });
252
+ }
253
+ throw new StorageError({
254
+ reason: `[${result.error.code}] ${result.error.message}`
255
+ });
246
256
  }
247
257
  return result.result;
248
258
  }
@@ -272,6 +282,19 @@ function getStorageClient(rpcFn, name) {
272
282
  return new StorageError({ reason: String(e), cause: e });
273
283
  }
274
284
  },
285
+ update: async (opts) => {
286
+ try {
287
+ return await rpc("session.update", opts);
288
+ } catch (e) {
289
+ if (e instanceof StorageConflictError) {
290
+ return e;
291
+ }
292
+ if (e instanceof StorageError) {
293
+ return e;
294
+ }
295
+ return new StorageError({ reason: String(e), cause: e });
296
+ }
297
+ },
275
298
  delete: async (id) => {
276
299
  try {
277
300
  await rpc("session.delete", { id });
@@ -297,6 +320,22 @@ function getStorageClient(rpcFn, name) {
297
320
  return new StorageError({ reason: String(e), cause: e });
298
321
  }
299
322
  },
323
+ listBySandbox: async (opts) => {
324
+ try {
325
+ return await rpc("session.listBySandbox", {
326
+ sandboxId: opts.sandboxId,
327
+ tags: opts.tags,
328
+ order: opts.order,
329
+ cursor: opts.cursor,
330
+ limit: opts.limit
331
+ });
332
+ } catch (e) {
333
+ if (e instanceof StorageError) {
334
+ return e;
335
+ }
336
+ return new StorageError({ reason: String(e), cause: e });
337
+ }
338
+ },
300
339
  tag: {
301
340
  set: async ({ sessionId, tags }) => {
302
341
  try {
@@ -442,6 +481,16 @@ function getStorageClient(rpcFn, name) {
442
481
  return new StorageError({ reason: String(e), cause: e });
443
482
  }
444
483
  },
484
+ update: async (opts) => {
485
+ try {
486
+ return await rpc("sandbox.update", opts);
487
+ } catch (e) {
488
+ if (e instanceof StorageError) {
489
+ return e;
490
+ }
491
+ return new StorageError({ reason: String(e), cause: e });
492
+ }
493
+ },
445
494
  list: async (opts) => {
446
495
  try {
447
496
  return await rpc("sandbox.list", {
@@ -946,7 +995,7 @@ function ListResultSchema(itemSchema) {
946
995
  nextCursor: import_zod3.z.string().nullable()
947
996
  });
948
997
  }
949
- var import_zod3, VercelLifecycleConfigSchema, NetworkPolicySchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, CommandBaseSchema, CommandSchema, SetupSnapshotSchema, methods, STORAGE_RPC_METHODS;
998
+ var import_zod3, VercelLifecycleConfigSchema, NetworkPolicySchema, SandboxConfigSchema, GenerationSchema, SessionSchema, StepUsageSchema, UsageSummarySchema, MessageUsageSchema, InterruptedLastPartSchema, MessageSchema, PartSchema, CommandResultSchema, SandboxRecordSchema, SessionUpdateSchema, SandboxUpdateSchema, CommandBaseSchema, CommandSchema, SetupSnapshotSchema, methods, STORAGE_RPC_METHODS;
950
999
  var init_rpc = __esm({
951
1000
  "src/storage/rpc.ts"() {
952
1001
  "use strict";
@@ -1036,6 +1085,10 @@ var init_rpc = __esm({
1036
1085
  steps: import_zod3.z.array(StepUsageSchema),
1037
1086
  summary: UsageSummarySchema
1038
1087
  });
1088
+ InterruptedLastPartSchema = import_zod3.z.object({
1089
+ index: import_zod3.z.number(),
1090
+ part: import_zod3.z.unknown()
1091
+ });
1039
1092
  MessageSchema = import_zod3.z.object({
1040
1093
  id: import_zod3.z.string(),
1041
1094
  sessionId: import_zod3.z.string(),
@@ -1044,6 +1097,7 @@ var init_rpc = __esm({
1044
1097
  startedAt: import_zod3.z.number().nullable(),
1045
1098
  completedAt: import_zod3.z.number().nullable(),
1046
1099
  interruptedAt: import_zod3.z.number().nullable(),
1100
+ interruptedLastPart: InterruptedLastPartSchema.nullable().default(null),
1047
1101
  usage: MessageUsageSchema.nullable()
1048
1102
  });
1049
1103
  PartSchema = import_zod3.z.object({
@@ -1075,6 +1129,16 @@ var init_rpc = __esm({
1075
1129
  })
1076
1130
  ]).optional()
1077
1131
  });
1132
+ SessionUpdateSchema = SessionSchema.omit({
1133
+ id: true,
1134
+ generation: true
1135
+ }).partial().extend({
1136
+ id: SessionSchema.shape.id,
1137
+ generation: GenerationSchema.nullable().optional()
1138
+ }).strict();
1139
+ SandboxUpdateSchema = SandboxRecordSchema.omit({ id: true }).partial().extend({
1140
+ id: SandboxRecordSchema.shape.id
1141
+ }).strict();
1078
1142
  CommandBaseSchema = import_zod3.z.object({
1079
1143
  id: import_zod3.z.string(),
1080
1144
  sessionId: import_zod3.z.string(),
@@ -1114,6 +1178,10 @@ var init_rpc = __esm({
1114
1178
  params: SessionSchema,
1115
1179
  result: SessionSchema
1116
1180
  },
1181
+ "session.update": {
1182
+ params: SessionUpdateSchema,
1183
+ result: SessionSchema
1184
+ },
1117
1185
  "session.list": {
1118
1186
  params: import_zod3.z.object({
1119
1187
  tags: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional(),
@@ -1206,6 +1274,10 @@ var init_rpc = __esm({
1206
1274
  params: SandboxRecordSchema,
1207
1275
  result: import_zod3.z.void()
1208
1276
  },
1277
+ "sandbox.update": {
1278
+ params: SandboxUpdateSchema,
1279
+ result: SandboxRecordSchema
1280
+ },
1209
1281
  "sandbox.list": {
1210
1282
  params: import_zod3.z.object({
1211
1283
  tags: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional(),
@@ -1300,6 +1372,15 @@ async function handleStorageRpc(body, handlers) {
1300
1372
  const result = await handler(parsed.data);
1301
1373
  return { result };
1302
1374
  } catch (e) {
1375
+ const isConflict = e instanceof StorageConflictError || e instanceof Error && e.name === "StorageConflictError";
1376
+ if (isConflict) {
1377
+ return {
1378
+ error: {
1379
+ code: "CONFLICT",
1380
+ message: e instanceof Error ? e.message : String(e)
1381
+ }
1382
+ };
1383
+ }
1303
1384
  return {
1304
1385
  error: {
1305
1386
  code: "INTERNAL_ERROR",
@@ -1311,6 +1392,7 @@ async function handleStorageRpc(body, handlers) {
1311
1392
  var init_handler = __esm({
1312
1393
  "src/storage/handler.ts"() {
1313
1394
  "use strict";
1395
+ init_errors();
1314
1396
  init_rpc();
1315
1397
  }
1316
1398
  });
@@ -1386,8 +1468,8 @@ async function checkAndSnapshotStep(input) {
1386
1468
  ...getTestCredentials()
1387
1469
  });
1388
1470
  const snapshot = await sandbox.snapshot();
1389
- await storage.sandbox.set({
1390
- ...record,
1471
+ await storage.sandbox.update({
1472
+ id: record.id,
1391
1473
  acquiringLockId: null,
1392
1474
  acquiringLockAt: null,
1393
1475
  providerMetadata: {
@@ -1888,8 +1970,8 @@ var init_vercel = __esm({
1888
1970
  }
1889
1971
  const lockedRecord = locked;
1890
1972
  async function releaseSandboxLock() {
1891
- await storage.sandbox.set({
1892
- ...lockedRecord,
1973
+ await storage.sandbox.update({
1974
+ id: lockedRecord.id,
1893
1975
  acquiringLockId: null,
1894
1976
  acquiringLockAt: null
1895
1977
  }).catch(() => void 0);
@@ -2003,12 +2085,8 @@ var init_vercel = __esm({
2003
2085
  }
2004
2086
  const existingVercel = existing.providerMetadata?.provider === "vercel" ? existing.providerMetadata : null;
2005
2087
  if (existingVercel?.sandboxId) {
2006
- await storage.sandbox.set({
2088
+ await storage.sandbox.update({
2007
2089
  id: existing.id,
2008
- config: existing.config,
2009
- tags: existing.tags,
2010
- createdAt: existing.createdAt,
2011
- lastActivityAt: existing.lastActivityAt,
2012
2090
  acquiringLockId: null,
2013
2091
  acquiringLockAt: null,
2014
2092
  providerMetadata: {
@@ -2031,11 +2109,8 @@ var init_vercel = __esm({
2031
2109
  return;
2032
2110
  }
2033
2111
  const existingVercel = existing.providerMetadata?.provider === "vercel" ? existing.providerMetadata : null;
2034
- await storage.sandbox.set({
2112
+ await storage.sandbox.update({
2035
2113
  id: existing.id,
2036
- config: existing.config,
2037
- tags: existing.tags,
2038
- createdAt: existing.createdAt,
2039
2114
  lastActivityAt: now,
2040
2115
  acquiringLockId: null,
2041
2116
  acquiringLockAt: null,
@@ -2062,14 +2137,9 @@ var init_vercel = __esm({
2062
2137
  }
2063
2138
  return errore3.tryAsync({
2064
2139
  try: async () => {
2065
- const existing = await storage.sandbox.get(id);
2066
2140
  const snapshot = await sandbox2.snapshot();
2067
- await storage.sandbox.set({
2141
+ await storage.sandbox.update({
2068
2142
  id,
2069
- config,
2070
- tags: existing instanceof Error ? null : existing?.tags ?? null,
2071
- createdAt: existing instanceof Error ? null : existing?.createdAt ?? null,
2072
- lastActivityAt: existing instanceof Error ? null : existing?.lastActivityAt ?? null,
2073
2143
  acquiringLockId: null,
2074
2144
  acquiringLockAt: null,
2075
2145
  providerMetadata: {
@@ -2091,16 +2161,8 @@ var init_vercel = __esm({
2091
2161
  return errore3.tryAsync({
2092
2162
  try: async () => {
2093
2163
  await sandbox2.stop();
2094
- const existing = await storage.sandbox.get(id);
2095
- if (existing instanceof Error || !existing) {
2096
- return void 0;
2097
- }
2098
- await storage.sandbox.set({
2099
- id: existing.id,
2100
- config: existing.config,
2101
- tags: existing.tags,
2102
- createdAt: existing.createdAt,
2103
- lastActivityAt: existing.lastActivityAt,
2164
+ await storage.sandbox.update({
2165
+ id,
2104
2166
  acquiringLockId: null,
2105
2167
  acquiringLockAt: null,
2106
2168
  providerMetadata: {
@@ -2450,6 +2512,8 @@ function createFilesystemHandlers(basePath) {
2450
2512
  const sandboxDir = (0, import_node_path.join)(resolvedBase, "sandbox");
2451
2513
  const commandDir = (0, import_node_path.join)(resolvedBase, "command");
2452
2514
  const setupDir = (0, import_node_path.join)(resolvedBase, "setup");
2515
+ const lockDir = (0, import_node_path.join)(resolvedBase, ".locks");
2516
+ const LOCK_STALE_MS = 3e4;
2453
2517
  async function ensureDir(dir) {
2454
2518
  await (0, import_promises.mkdir)(dir, { recursive: true });
2455
2519
  }
@@ -2465,6 +2529,46 @@ function createFilesystemHandlers(basePath) {
2465
2529
  await ensureDir((0, import_node_path.dirname)(filePath));
2466
2530
  await (0, import_promises.writeFile)(filePath, JSON.stringify(data, null, 2));
2467
2531
  }
2532
+ async function withRecordLock(key, fn) {
2533
+ const lockName = Buffer.from(key).toString("base64url");
2534
+ const lockPath = (0, import_node_path.join)(lockDir, `${lockName}.lock`);
2535
+ const metadataPath = (0, import_node_path.join)(lockPath, "metadata.json");
2536
+ await ensureDir(lockDir);
2537
+ while (true) {
2538
+ try {
2539
+ await (0, import_promises.mkdir)(lockPath);
2540
+ await writeJsonFile(metadataPath, {
2541
+ pid: process.pid,
2542
+ createdAt: Date.now()
2543
+ });
2544
+ break;
2545
+ } catch (e) {
2546
+ if (!(e instanceof Error) || e.code !== "EEXIST") {
2547
+ throw e;
2548
+ }
2549
+ const metadata = await readJson(metadataPath);
2550
+ if (metadata?.createdAt && Date.now() - metadata.createdAt > LOCK_STALE_MS) {
2551
+ await (0, import_promises.rm)(lockPath, { recursive: true, force: true });
2552
+ continue;
2553
+ }
2554
+ await new Promise((r) => setTimeout(r, 10));
2555
+ }
2556
+ }
2557
+ try {
2558
+ return await fn();
2559
+ } finally {
2560
+ await (0, import_promises.rm)(lockPath, { recursive: true, force: true });
2561
+ }
2562
+ }
2563
+ function removeUndefined(input) {
2564
+ const result = {};
2565
+ for (const [key, value] of Object.entries(input)) {
2566
+ if (value !== void 0) {
2567
+ result[key] = value;
2568
+ }
2569
+ }
2570
+ return result;
2571
+ }
2468
2572
  async function readAllFromDir(dir) {
2469
2573
  try {
2470
2574
  const files = await (0, import_promises.readdir)(dir);
@@ -2482,17 +2586,57 @@ function createFilesystemHandlers(basePath) {
2482
2586
  return await readJson(sessionPath) ?? null;
2483
2587
  },
2484
2588
  "session.set": async (session) => {
2485
- const now = Date.now();
2486
- const sessionPath = (0, import_node_path.join)(sessionDir, `${session.id}.json`);
2487
- const existing = await readJson(sessionPath);
2488
- const newSession = {
2489
- ...session,
2490
- tags: session.tags ?? existing?.tags ?? {},
2491
- createdAt: existing?.createdAt ?? session.createdAt ?? now,
2492
- updatedAt: now
2493
- };
2494
- await writeJsonFile(sessionPath, newSession);
2495
- return newSession;
2589
+ return await withRecordLock(`session:${session.id}`, async () => {
2590
+ const now = Date.now();
2591
+ const sessionPath = (0, import_node_path.join)(sessionDir, `${session.id}.json`);
2592
+ const existing = await readJson(sessionPath);
2593
+ const newSession = {
2594
+ ...session,
2595
+ tags: session.tags ?? existing?.tags ?? {},
2596
+ createdAt: existing?.createdAt ?? session.createdAt ?? now,
2597
+ updatedAt: now
2598
+ };
2599
+ await writeJsonFile(sessionPath, newSession);
2600
+ return newSession;
2601
+ });
2602
+ },
2603
+ "session.update": async (opts) => {
2604
+ return await withRecordLock(`session:${opts.id}`, async () => {
2605
+ const sessionPath = (0, import_node_path.join)(sessionDir, `${opts.id}.json`);
2606
+ const existing = await readJson(sessionPath);
2607
+ if (!existing) {
2608
+ throw new Error(`Session ${opts.id} not found`);
2609
+ }
2610
+ const rawPatch = removeUndefined({
2611
+ ...opts,
2612
+ id: void 0
2613
+ });
2614
+ if (Object.keys(rawPatch).length === 0) {
2615
+ return existing;
2616
+ }
2617
+ if (Object.hasOwn(rawPatch, "runId")) {
2618
+ const nextRunId = rawPatch.runId;
2619
+ if (existing.runId !== null && nextRunId === null) {
2620
+ throw new StorageConflictError({
2621
+ reason: "runId cannot be cleared once set"
2622
+ });
2623
+ }
2624
+ if (existing.runId !== null && nextRunId !== existing.runId) {
2625
+ throw new StorageConflictError({
2626
+ reason: `runId is already set to ${existing.runId}`
2627
+ });
2628
+ }
2629
+ }
2630
+ const patch = rawPatch;
2631
+ const updatedAt = patch.updatedAt !== void 0 ? patch.updatedAt : Date.now();
2632
+ const updatedSession = {
2633
+ ...existing,
2634
+ ...patch,
2635
+ updatedAt
2636
+ };
2637
+ await writeJsonFile(sessionPath, updatedSession);
2638
+ return updatedSession;
2639
+ });
2496
2640
  },
2497
2641
  "session.delete": async ({ id }) => {
2498
2642
  try {
@@ -2559,20 +2703,22 @@ function createFilesystemHandlers(basePath) {
2559
2703
  return paginate({ items: filtered, cursor, limit });
2560
2704
  },
2561
2705
  "session.tag.set": async ({ sessionId, tags }) => {
2562
- const sessionPath = (0, import_node_path.join)(sessionDir, `${sessionId}.json`);
2563
- const existing = await readJson(sessionPath);
2564
- if (!existing) {
2565
- throw new Error(`Session ${sessionId} not found`);
2566
- }
2567
- const mergedTags = { ...existing.tags, ...tags };
2568
- const now = Date.now();
2569
- const updatedSession = {
2570
- ...existing,
2571
- tags: mergedTags,
2572
- updatedAt: now
2573
- };
2574
- await writeJsonFile(sessionPath, updatedSession);
2575
- return updatedSession;
2706
+ return await withRecordLock(`session:${sessionId}`, async () => {
2707
+ const sessionPath = (0, import_node_path.join)(sessionDir, `${sessionId}.json`);
2708
+ const existing = await readJson(sessionPath);
2709
+ if (!existing) {
2710
+ throw new Error(`Session ${sessionId} not found`);
2711
+ }
2712
+ const mergedTags = { ...existing.tags, ...tags };
2713
+ const now = Date.now();
2714
+ const updatedSession = {
2715
+ ...existing,
2716
+ tags: mergedTags,
2717
+ updatedAt: now
2718
+ };
2719
+ await writeJsonFile(sessionPath, updatedSession);
2720
+ return updatedSession;
2721
+ });
2576
2722
  },
2577
2723
  "message.get": async ({ id }) => {
2578
2724
  return await readJson((0, import_node_path.join)(messageDir, `${id}.json`));
@@ -2621,14 +2767,39 @@ function createFilesystemHandlers(basePath) {
2621
2767
  return data;
2622
2768
  },
2623
2769
  "sandbox.set": async (record) => {
2624
- const safeName = Buffer.from(record.id).toString("base64url");
2625
- const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2626
- const existing = await readJson(sandboxPath);
2627
- const newRecord = {
2628
- ...record,
2629
- tags: record.tags ?? existing?.tags ?? null
2630
- };
2631
- await writeJsonFile(sandboxPath, newRecord);
2770
+ await withRecordLock(`sandbox:${record.id}`, async () => {
2771
+ const safeName = Buffer.from(record.id).toString("base64url");
2772
+ const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2773
+ const existing = await readJson(sandboxPath);
2774
+ const newRecord = {
2775
+ ...record,
2776
+ tags: record.tags ?? existing?.tags ?? null
2777
+ };
2778
+ await writeJsonFile(sandboxPath, newRecord);
2779
+ });
2780
+ },
2781
+ "sandbox.update": async (opts) => {
2782
+ return await withRecordLock(`sandbox:${opts.id}`, async () => {
2783
+ const safeName = Buffer.from(opts.id).toString("base64url");
2784
+ const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2785
+ const existing = await readJson(sandboxPath);
2786
+ if (!existing) {
2787
+ throw new Error(`Sandbox ${opts.id} not found`);
2788
+ }
2789
+ const patch = removeUndefined({
2790
+ ...opts,
2791
+ id: void 0
2792
+ });
2793
+ if (Object.keys(patch).length === 0) {
2794
+ return existing;
2795
+ }
2796
+ const updatedSandbox = {
2797
+ ...existing,
2798
+ ...patch
2799
+ };
2800
+ await writeJsonFile(sandboxPath, updatedSandbox);
2801
+ return updatedSandbox;
2802
+ });
2632
2803
  },
2633
2804
  "sandbox.list": async ({ tags, order, cursor, limit }) => {
2634
2805
  const allSandboxes = await readAllFromDir(sandboxDir);
@@ -2649,32 +2820,32 @@ function createFilesystemHandlers(basePath) {
2649
2820
  return paginate({ items: filtered, cursor, limit });
2650
2821
  },
2651
2822
  "sandbox.tag.set": async ({ sandboxId, tags }) => {
2652
- const safeName = Buffer.from(sandboxId).toString("base64url");
2653
- const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2654
- const existing = await readJson(sandboxPath);
2655
- if (!existing) {
2656
- throw new Error(`Sandbox ${sandboxId} not found`);
2657
- }
2658
- const mergedTags = { ...existing.tags, ...tags };
2659
- const updatedSandbox = {
2660
- ...existing,
2661
- tags: mergedTags
2662
- };
2663
- await writeJsonFile(sandboxPath, updatedSandbox);
2664
- return updatedSandbox;
2823
+ return await withRecordLock(`sandbox:${sandboxId}`, async () => {
2824
+ const safeName = Buffer.from(sandboxId).toString("base64url");
2825
+ const sandboxPath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2826
+ const existing = await readJson(sandboxPath);
2827
+ if (!existing) {
2828
+ throw new Error(`Sandbox ${sandboxId} not found`);
2829
+ }
2830
+ const mergedTags = { ...existing.tags, ...tags };
2831
+ const updatedSandbox = {
2832
+ ...existing,
2833
+ tags: mergedTags
2834
+ };
2835
+ await writeJsonFile(sandboxPath, updatedSandbox);
2836
+ return updatedSandbox;
2837
+ });
2665
2838
  },
2666
2839
  "sandbox.getBySession": async ({ sessionId }) => {
2667
- const allSandboxes = await readAllFromDir(sandboxDir);
2668
- const matching = allSandboxes.filter(
2669
- (s) => s.id.startsWith(`${sessionId}-`)
2670
- );
2671
- if (matching.length === 0) {
2840
+ const sessionPath = (0, import_node_path.join)(sessionDir, `${sessionId}.json`);
2841
+ const session = await readJson(sessionPath);
2842
+ if (!session?.sandboxId) {
2672
2843
  return null;
2673
2844
  }
2674
- matching.sort(
2675
- (a, b) => (b.lastActivityAt ?? 0) - (a.lastActivityAt ?? 0)
2845
+ const safeName = Buffer.from(session.sandboxId).toString("base64url");
2846
+ return await readJson(
2847
+ (0, import_node_path.join)(sandboxDir, `${safeName}.json`)
2676
2848
  );
2677
- return matching[0];
2678
2849
  },
2679
2850
  "command.get": async ({ id }) => {
2680
2851
  return await readJson((0, import_node_path.join)(commandDir, `${id}.json`));
@@ -2688,41 +2859,47 @@ function createFilesystemHandlers(basePath) {
2688
2859
  return await readJson((0, import_node_path.join)(setupDir, `${safeName}.json`));
2689
2860
  },
2690
2861
  "setup.set": async (snapshot) => {
2691
- const safeName = Buffer.from(snapshot.key).toString("base64url");
2692
- await writeJsonFile((0, import_node_path.join)(setupDir, `${safeName}.json`), snapshot);
2862
+ await withRecordLock(`setup:${snapshot.key}`, async () => {
2863
+ const safeName = Buffer.from(snapshot.key).toString("base64url");
2864
+ await writeJsonFile((0, import_node_path.join)(setupDir, `${safeName}.json`), snapshot);
2865
+ });
2693
2866
  },
2694
2867
  "setup.acquireLock": async ({ key, lockId, lockTimeoutMs }) => {
2695
- const safeName = Buffer.from(key).toString("base64url");
2696
- const filePath = (0, import_node_path.join)(setupDir, `${safeName}.json`);
2697
- const existing = await readJson(filePath);
2698
- if (existing?.acquiringLockId && existing.acquiringLockAt && Date.now() - existing.acquiringLockAt < lockTimeoutMs) {
2699
- return null;
2700
- }
2701
- const now = Date.now();
2702
- const snapshot = {
2703
- key,
2704
- snapshotId: existing?.snapshotId ?? null,
2705
- createdAt: existing?.createdAt ?? now,
2706
- lastUsedAt: existing?.lastUsedAt ?? null,
2707
- acquiringLockId: lockId,
2708
- acquiringLockAt: now
2709
- };
2710
- await writeJsonFile(filePath, snapshot);
2711
- return snapshot;
2868
+ return await withRecordLock(`setup:${key}`, async () => {
2869
+ const safeName = Buffer.from(key).toString("base64url");
2870
+ const filePath = (0, import_node_path.join)(setupDir, `${safeName}.json`);
2871
+ const existing = await readJson(filePath);
2872
+ if (existing?.acquiringLockId && existing.acquiringLockAt && Date.now() - existing.acquiringLockAt < lockTimeoutMs) {
2873
+ return null;
2874
+ }
2875
+ const now = Date.now();
2876
+ const snapshot = {
2877
+ key,
2878
+ snapshotId: existing?.snapshotId ?? null,
2879
+ createdAt: existing?.createdAt ?? now,
2880
+ lastUsedAt: existing?.lastUsedAt ?? null,
2881
+ acquiringLockId: lockId,
2882
+ acquiringLockAt: now
2883
+ };
2884
+ await writeJsonFile(filePath, snapshot);
2885
+ return snapshot;
2886
+ });
2712
2887
  },
2713
2888
  "sandbox.acquireLock": async ({ record, lockTimeoutMs }) => {
2714
- const safeName = Buffer.from(record.id).toString("base64url");
2715
- const filePath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2716
- const existing = await readJson(filePath);
2717
- if (existing?.acquiringLockId && existing.acquiringLockAt && Date.now() - existing.acquiringLockAt < lockTimeoutMs) {
2718
- return null;
2719
- }
2720
- const newRecord = {
2721
- ...record,
2722
- tags: record.tags ?? existing?.tags ?? null
2723
- };
2724
- await writeJsonFile(filePath, newRecord);
2725
- return newRecord;
2889
+ return await withRecordLock(`sandbox:${record.id}`, async () => {
2890
+ const safeName = Buffer.from(record.id).toString("base64url");
2891
+ const filePath = (0, import_node_path.join)(sandboxDir, `${safeName}.json`);
2892
+ const existing = await readJson(filePath);
2893
+ if (existing?.acquiringLockId && existing.acquiringLockAt && Date.now() - existing.acquiringLockAt < lockTimeoutMs) {
2894
+ return null;
2895
+ }
2896
+ const newRecord = {
2897
+ ...record,
2898
+ tags: record.tags ?? existing?.tags ?? null
2899
+ };
2900
+ await writeJsonFile(filePath, newRecord);
2901
+ return newRecord;
2902
+ });
2726
2903
  },
2727
2904
  "command.list": async ({ sessionId, includeFinished, cursor, limit }) => {
2728
2905
  const allCommands = await readAllFromDir(commandDir);
@@ -2742,6 +2919,7 @@ var init_local_fs_handlers = __esm({
2742
2919
  import_promises = require("fs/promises");
2743
2920
  import_node_path = require("path");
2744
2921
  import_fast_deep_equal = __toESM(require("fast-deep-equal"));
2922
+ init_errors();
2745
2923
  init_paginate();
2746
2924
  }
2747
2925
  });
@@ -2749,10 +2927,12 @@ var init_local_fs_handlers = __esm({
2749
2927
  // src/index.ts
2750
2928
  var src_exports = {};
2751
2929
  __export(src_exports, {
2930
+ AgentStatus: () => AgentStatus,
2752
2931
  MessageNotFoundError: () => MessageNotFoundError,
2753
2932
  SandboxError: () => SandboxError,
2754
2933
  SandboxNotFoundError: () => SandboxNotFoundError,
2755
2934
  SessionNotFoundError: () => SessionNotFoundError,
2935
+ StorageConflictError: () => StorageConflictError,
2756
2936
  StorageError: () => StorageError,
2757
2937
  agent: () => agent,
2758
2938
  builtinToolNames: () => builtinToolNames,
@@ -2768,6 +2948,7 @@ var errore4 = __toESM(require("errore"));
2768
2948
  var import_fast_deep_equal2 = __toESM(require("fast-deep-equal"));
2769
2949
  var import_ulid4 = require("ulid");
2770
2950
  var import_api2 = require("workflow/api");
2951
+ var z5 = __toESM(require("zod"));
2771
2952
 
2772
2953
  // src/agent-workflow.ts
2773
2954
  var import_workflow3 = require("workflow");
@@ -3011,7 +3192,7 @@ try {
3011
3192
  } catch (err) {
3012
3193
  const output = {
3013
3194
  success: false,
3014
- error: err instanceof Error ? err.message + '\\n' + err.stack : String(err),
3195
+ error: err instanceof Error ? err.message : String(err),
3015
3196
  };
3016
3197
  if (logs.length > 0) output.logs = logs;
3017
3198
  process.stdout.write(JSON.stringify(output));
@@ -3326,6 +3507,7 @@ var builtInTools = {
3326
3507
  Read: (0, import_ai2.tool)({
3327
3508
  description: "Reads a file and returns its contents with metadata. For files over 200 lines, automatically shows first 100 lines unless a specific line range is provided. Use startLine and endLine parameters to read specific portions of large files.",
3328
3509
  inputSchema: import_zod2.z.object({
3510
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3329
3511
  path: import_zod2.z.string().describe("Path to the file relative to workspace root"),
3330
3512
  startLine: import_zod2.z.number().optional().describe(
3331
3513
  "Starting line number (1-indexed). If provided with endLine, reads exact range regardless of file size."
@@ -3350,6 +3532,7 @@ var builtInTools = {
3350
3532
  Grep: (0, import_ai2.tool)({
3351
3533
  description: "Search for patterns in files using ripgrep. Use this to find code patterns, function definitions, imports, etc.",
3352
3534
  inputSchema: import_zod2.z.object({
3535
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3353
3536
  pattern: import_zod2.z.string().describe("Regex pattern to search for (ripgrep syntax)"),
3354
3537
  path: import_zod2.z.string().optional().describe(
3355
3538
  "Path to search in (defaults to workspace root). Can be a file or directory."
@@ -3386,6 +3569,7 @@ var builtInTools = {
3386
3569
  List: (0, import_ai2.tool)({
3387
3570
  description: "Recursively list directory contents. Use this to understand the codebase structure, find files, or explore directories. Control depth to balance detail vs. overview. Depth 1 shows immediate children, depth 2 includes subdirectories, etc.",
3388
3571
  inputSchema: import_zod2.z.object({
3572
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3389
3573
  path: import_zod2.z.string().optional().describe("Path to list (defaults to workspace root)"),
3390
3574
  depth: import_zod2.z.number().optional().describe(
3391
3575
  "Maximum depth to traverse. Choose based on context: 1-2 for quick overview, 3-4 for detailed exploration, 5+ for comprehensive mapping"
@@ -3412,6 +3596,7 @@ var builtInTools = {
3412
3596
  Write: (0, import_ai2.tool)({
3413
3597
  description: "Write content to a file. Creates parent directories automatically. Overwrites existing files.",
3414
3598
  inputSchema: import_zod2.z.object({
3599
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3415
3600
  path: import_zod2.z.string().describe("Path to the file relative to workspace root"),
3416
3601
  content: import_zod2.z.string().describe("Content to write to the file")
3417
3602
  }),
@@ -3425,6 +3610,7 @@ var builtInTools = {
3425
3610
  Edit: (0, import_ai2.tool)({
3426
3611
  description: "Edit a file by replacing an exact string. Fails if old_string is not found or appears multiple times (not unique). For multiple replacements, call this tool multiple times with unique context.",
3427
3612
  inputSchema: import_zod2.z.object({
3613
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3428
3614
  path: import_zod2.z.string().describe("Path to the file relative to workspace root"),
3429
3615
  old_string: import_zod2.z.string().describe("Exact string to find and replace (must be unique in file)"),
3430
3616
  new_string: import_zod2.z.string().describe("String to replace old_string with")
@@ -3438,6 +3624,7 @@ var builtInTools = {
3438
3624
  Bash: (0, import_ai2.tool)({
3439
3625
  description: "Executes a bash command inside the workspace. CWD persists between commands within a session. Use waitUntil:0 for background processes (dev servers).",
3440
3626
  inputSchema: import_zod2.z.object({
3627
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3441
3628
  command: import_zod2.z.string().describe("The shell command to execute"),
3442
3629
  waitUntil: import_zod2.z.number().optional().describe(
3443
3630
  `Max ms to wait for completion (default: ${DEFAULT_WAIT_UNTIL}). Use 0 to run in background and return immediately.`
@@ -3454,8 +3641,22 @@ var builtInTools = {
3454
3641
  outputFile: import_zod2.z.string().describe("Path to output log (for background processes)")
3455
3642
  })
3456
3643
  }),
3644
+ Skill: (0, import_ai2.tool)({
3645
+ description: "Load a skill's full instructions by name. Call this before following a skill.",
3646
+ inputSchema: import_zod2.z.object({
3647
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3648
+ name: import_zod2.z.string().describe("Skill name from the Available Skills list")
3649
+ }),
3650
+ outputSchema: import_zod2.z.object({
3651
+ name: import_zod2.z.string(),
3652
+ description: import_zod2.z.string(),
3653
+ content: import_zod2.z.string().describe("Full SKILL.md content"),
3654
+ path: import_zod2.z.string().describe("Path to the skill directory in the sandbox")
3655
+ })
3656
+ }),
3457
3657
  JavaScript: (0, import_ai2.tool)({
3458
3658
  inputSchema: import_zod2.z.object({
3659
+ label: import_zod2.z.string().describe("A label that describes the action being performed"),
3459
3660
  code: import_zod2.z.string().describe(
3460
3661
  "JavaScript async function body. `ctx` is in scope. Must use `return` to produce output."
3461
3662
  )
@@ -3465,6 +3666,7 @@ var builtInTools = {
3465
3666
  var builtinToolNames = Object.fromEntries(
3466
3667
  Object.entries(builtInTools).map(([name]) => [name, name])
3467
3668
  );
3669
+ var SKILL_MD_SUFFIX = /\/?SKILL\.md$/;
3468
3670
  function getTools(context) {
3469
3671
  const tools = {
3470
3672
  [builtinToolNames.Read]: (0, import_ai2.tool)({
@@ -3764,6 +3966,41 @@ function getTools(context) {
3764
3966
  }
3765
3967
  })
3766
3968
  };
3969
+ if (context.session.skillsDir?.length) {
3970
+ tools[builtinToolNames.Skill] = (0, import_ai2.tool)({
3971
+ ...builtInTools.Skill,
3972
+ execute: async ({ name }) => {
3973
+ const skills = context.skillsRef.current;
3974
+ const skill = skills.find(
3975
+ (s) => s.name.toLowerCase() === name.toLowerCase()
3976
+ );
3977
+ if (!skill) {
3978
+ throw new Error(
3979
+ `Skill not found: "${name}". Available: ${skills.map((s) => s.name).join(", ")}`
3980
+ );
3981
+ }
3982
+ const result = await context.sandbox.readFile({
3983
+ path: skill.skillMdPath
3984
+ });
3985
+ if (result instanceof Error) {
3986
+ throw result;
3987
+ }
3988
+ if (result === null) {
3989
+ throw new Error(`Skill file not found: ${skill.skillMdPath}`);
3990
+ }
3991
+ const raw = typeof result === "string" ? result : result.toString("utf-8");
3992
+ const endMarker = raw.indexOf("---", 3);
3993
+ const content = endMarker === -1 ? raw : raw.slice(endMarker + 3).trim();
3994
+ const skillDir = skill.skillMdPath.replace(SKILL_MD_SUFFIX, "");
3995
+ return {
3996
+ name: skill.name,
3997
+ description: skill.description,
3998
+ content,
3999
+ path: skillDir
4000
+ };
4001
+ }
4002
+ });
4003
+ }
3767
4004
  if (context.apiToolsMetadata.length > 0) {
3768
4005
  const apiTools = buildApiTools({
3769
4006
  rpc: context.input.rpc,
@@ -4039,6 +4276,23 @@ function isSubToolPart(part) {
4039
4276
  const p = part.part;
4040
4277
  return typeof p?.toolCallId === "string" && p.toolCallId.startsWith("js_tc_");
4041
4278
  }
4279
+ function isStreamingContent(part) {
4280
+ return typeof part === "object" && part !== null && "type" in part && (part.type === "text" || part.type === "reasoning");
4281
+ }
4282
+ function applyInterruptCutoff({
4283
+ parts,
4284
+ lastPart
4285
+ }) {
4286
+ return parts.filter((p) => p.index <= lastPart.index).map((p) => {
4287
+ if (p.index !== lastPart.index) {
4288
+ return p;
4289
+ }
4290
+ if (isStreamingContent(lastPart.part)) {
4291
+ return { ...p, part: lastPart.part };
4292
+ }
4293
+ return p;
4294
+ });
4295
+ }
4042
4296
  function assembleUIMessages(opts) {
4043
4297
  let filtered = opts.messages;
4044
4298
  if (opts.until !== void 0) {
@@ -4056,8 +4310,14 @@ function assembleUIMessages(opts) {
4056
4310
  partsByMessage.set(part.messageId, existing);
4057
4311
  }
4058
4312
  return filtered.map((m) => {
4059
- const messageParts = partsByMessage.get(m.id) ?? [];
4313
+ let messageParts = partsByMessage.get(m.id) ?? [];
4060
4314
  messageParts.sort((a, b) => a.index - b.index);
4315
+ if (m.interruptedLastPart != null) {
4316
+ messageParts = applyInterruptCutoff({
4317
+ parts: messageParts,
4318
+ lastPart: m.interruptedLastPart
4319
+ });
4320
+ }
4061
4321
  return {
4062
4322
  id: m.id,
4063
4323
  role: m.role,
@@ -4115,6 +4375,43 @@ function emitStatus({
4115
4375
  rpc({ method: "hook.status", params: { status } }).catch(() => {
4116
4376
  });
4117
4377
  }
4378
+ var STATUS_THROTTLE_MS = 500;
4379
+ function createThrottledEmitStatus(rpc) {
4380
+ let timer = null;
4381
+ let pending = null;
4382
+ function throttled({
4383
+ writer,
4384
+ status
4385
+ }) {
4386
+ pending = { writer, status };
4387
+ if (timer !== null) {
4388
+ return;
4389
+ }
4390
+ flush();
4391
+ timer = setTimeout(() => {
4392
+ timer = null;
4393
+ if (pending) {
4394
+ flush();
4395
+ }
4396
+ }, STATUS_THROTTLE_MS);
4397
+ }
4398
+ function flush() {
4399
+ if (!pending) {
4400
+ return;
4401
+ }
4402
+ const { writer, status } = pending;
4403
+ pending = null;
4404
+ emitStatus({ writer, status, rpc });
4405
+ }
4406
+ throttled.dispose = () => {
4407
+ if (timer !== null) {
4408
+ clearTimeout(timer);
4409
+ timer = null;
4410
+ }
4411
+ flush();
4412
+ };
4413
+ return throttled;
4414
+ }
4118
4415
  var BASE_SYSTEM_PROMPT = "You are an AI assistant with basic tools to interact with your environment. Explore and work freely.";
4119
4416
  function joinPromptSections(...sections) {
4120
4417
  return sections.filter((s) => s?.trim()).join("\n\n");
@@ -4143,14 +4440,13 @@ function buildSkillsContext(skills) {
4143
4440
  if (skills.length === 0) {
4144
4441
  return "";
4145
4442
  }
4146
- const skillLines = skills.map((s) => `- ${s.name}: ${s.description}
4147
- Path: ${s.skillMdPath}`).join("\n");
4443
+ const skillLines = skills.map((s) => `- ${s.name}: ${s.description}`).join("\n");
4148
4444
  return `## Available Skills
4149
4445
  ${skillLines}
4150
4446
 
4151
4447
  ${backgroundProcessPrompt}
4152
4448
 
4153
- You can use the Read tool to read any skill's SKILL.md file to learn more about it.`;
4449
+ Use the Skill tool to load a skill's full instructions before following it.`;
4154
4450
  }
4155
4451
  async function completeMessageStep({
4156
4452
  assistantMessageId,
@@ -4182,7 +4478,7 @@ async function completeMessageStep({
4182
4478
  }
4183
4479
  await writable.close();
4184
4480
  }
4185
- var INTERRUPT_POLL_INTERVAL_MS = 500;
4481
+ var INTERRUPT_POLL_INTERVAL_MS = 250;
4186
4482
  function pollForInterrupt({
4187
4483
  storage,
4188
4484
  messageId,
@@ -4193,6 +4489,9 @@ function pollForInterrupt({
4193
4489
  const firstCheck = new Promise((resolve2) => {
4194
4490
  resolveFirstCheck = resolve2;
4195
4491
  });
4492
+ const interruptedLastPartRef = {
4493
+ current: null
4494
+ };
4196
4495
  const poll = async () => {
4197
4496
  let isFirst = true;
4198
4497
  while (!signal.aborted) {
@@ -4204,6 +4503,7 @@ function pollForInterrupt({
4204
4503
  return;
4205
4504
  }
4206
4505
  if (message.interruptedAt !== null) {
4506
+ interruptedLastPartRef.current = message.interruptedLastPart;
4207
4507
  abortController.abort();
4208
4508
  if (isFirst) {
4209
4509
  resolveFirstCheck();
@@ -4220,7 +4520,7 @@ function pollForInterrupt({
4220
4520
  }
4221
4521
  };
4222
4522
  poll();
4223
- return { firstCheck };
4523
+ return { firstCheck, interruptedLastPartRef };
4224
4524
  }
4225
4525
  async function streamTextStep({
4226
4526
  assistantMessageId,
@@ -4228,16 +4528,18 @@ async function streamTextStep({
4228
4528
  event,
4229
4529
  writable,
4230
4530
  lastPartIndex,
4231
- stepIndexOffset
4531
+ stepIndexOffset,
4532
+ discoveredSkills
4232
4533
  }) {
4233
4534
  "use step";
4234
4535
  const { getStorage: getStorage2 } = await Promise.resolve().then(() => (init_client(), client_exports));
4235
4536
  const { getSandbox: getSandbox2 } = await Promise.resolve().then(() => (init_sandbox(), sandbox_exports));
4236
4537
  const rpc = input.rpc;
4538
+ const throttledEmitStatus = createThrottledEmitStatus(rpc);
4237
4539
  const storage = getStorage2({ config: input.storageConfig, rpc });
4238
4540
  const abortController = new AbortController();
4239
4541
  const pollController = new AbortController();
4240
- const { firstCheck } = pollForInterrupt({
4542
+ const { firstCheck, interruptedLastPartRef } = pollForInterrupt({
4241
4543
  storage,
4242
4544
  messageId: assistantMessageId,
4243
4545
  signal: pollController.signal,
@@ -4269,7 +4571,8 @@ async function streamTextStep({
4269
4571
  const sandbox2 = getSandbox2({
4270
4572
  sandboxRecord: sandboxRecord2,
4271
4573
  storageConfig: input.storageConfig,
4272
- storage
4574
+ storage,
4575
+ rpc
4273
4576
  });
4274
4577
  return { session: session2, sandbox: sandbox2, sandboxRecord: sandboxRecord2 };
4275
4578
  }),
@@ -4284,7 +4587,8 @@ async function streamTextStep({
4284
4587
  lastPartIndex,
4285
4588
  usageSteps: [],
4286
4589
  pendingApprovals: [],
4287
- maxSteps: void 0
4590
+ maxSteps: void 0,
4591
+ discoveredSkills
4288
4592
  };
4289
4593
  }
4290
4594
  if (messagesResult instanceof Error) {
@@ -4367,13 +4671,20 @@ async function streamTextStep({
4367
4671
  const POLL_MS = 500;
4368
4672
  const TIMEOUT_MS = 5 * 60 * 1e3;
4369
4673
  const start3 = Date.now();
4370
- while (Date.now() - start3 < TIMEOUT_MS) {
4674
+ while (Date.now() - start3 < TIMEOUT_MS && !abortController.signal.aborted) {
4371
4675
  const parts = await storage.part.listBySession(input.sessionId);
4372
4676
  if (!(parts instanceof Error)) {
4373
4677
  const updated = parts.items.find(
4374
- (p) => p.id === partId && "state" in p.part && p.part.state === "approval-responded"
4678
+ (p) => p.id === partId && "state" in p.part && (p.part.state === "approval-responded" || p.part.state === "output-denied")
4375
4679
  );
4376
4680
  if (updated) {
4681
+ const state = updated.part.state;
4682
+ if (state === "output-denied") {
4683
+ const reason = updated.part.approval?.reason;
4684
+ return {
4685
+ error: `Tool "${toolName}" denied: ${reason || "user denied"}`
4686
+ };
4687
+ }
4377
4688
  const approval = updated.part.approval;
4378
4689
  if (approval?.approved) {
4379
4690
  try {
@@ -4405,7 +4716,12 @@ async function streamTextStep({
4405
4716
  }
4406
4717
  await new Promise((r) => setTimeout(r, POLL_MS));
4407
4718
  }
4408
- return { error: "Approval timed out" };
4719
+ return {
4720
+ error: abortController.signal.aborted ? "interrupted" : "Approval timed out"
4721
+ };
4722
+ };
4723
+ const skillsRef = {
4724
+ current: discoveredSkills ?? []
4409
4725
  };
4410
4726
  const rawTools = getTools({
4411
4727
  input,
@@ -4413,6 +4729,7 @@ async function streamTextStep({
4413
4729
  sandbox,
4414
4730
  session,
4415
4731
  sandboxRecord,
4732
+ skillsRef,
4416
4733
  apiToolsMetadata,
4417
4734
  onSubToolCall
4418
4735
  });
@@ -4447,14 +4764,12 @@ async function streamTextStep({
4447
4764
  }
4448
4765
  ])
4449
4766
  );
4450
- let skillsRef = [];
4451
4767
  const result = (0, import_ai3.streamText)({
4452
4768
  // Placeholder to pass validation — prepareStep replaces messages entirely.
4453
4769
  messages: [{ role: "user", content: "." }],
4454
4770
  tools,
4455
4771
  model: session.model,
4456
4772
  abortSignal: abortController.signal,
4457
- activeTools: session.activeTools ?? void 0,
4458
4773
  stopWhen: (0, import_ai3.stepCountIs)(1),
4459
4774
  temperature: session.generation?.temperature,
4460
4775
  topK: session.generation?.topK,
@@ -4471,37 +4786,37 @@ async function streamTextStep({
4471
4786
  },
4472
4787
  prepareStep: async ({ model }) => {
4473
4788
  if (lastPartIndex === 0) {
4474
- if (sandbox._setupMeta) {
4789
+ const isFirstAssistantMessage = !messagesResult.items.some(
4790
+ (m) => m.role === "assistant" && m.id !== assistantMessageId && m.startedAt !== null
4791
+ );
4792
+ if (isFirstAssistantMessage && sandbox._setupMeta) {
4475
4793
  const meta = await sandbox._setupMeta;
4476
- emitStatus({
4794
+ throttledEmitStatus({
4477
4795
  writer: streamWriterRef.current,
4478
- status: meta.needsSetupRun ? { type: "sandbox-setup-cold" } : { type: "sandbox-setup" },
4479
- rpc
4796
+ status: meta.needsSetupRun ? { type: "sandbox-setup-cold" } : { type: "sandbox-setup" }
4480
4797
  });
4481
4798
  }
4482
4799
  if (sandbox._onReady) {
4483
4800
  await sandbox._onReady;
4484
4801
  }
4485
- emitStatus({
4486
- writer: streamWriterRef.current,
4487
- status: { type: "loading-skills" },
4488
- rpc
4489
- });
4490
- const skills = await discoverSkillsInSandbox({
4491
- sandbox,
4492
- skillsDirs: session.skillsDir || [],
4493
- debug: true
4494
- });
4495
- skillsRef = skills;
4802
+ if (!discoveredSkills) {
4803
+ const skillsDirs = session.skillsDir?.length ? session.skillsDir : [];
4804
+ if (skillsDirs.length > 0) {
4805
+ skillsRef.current = await discoverSkillsInSandbox({
4806
+ sandbox,
4807
+ skillsDirs,
4808
+ debug: true
4809
+ });
4810
+ }
4811
+ }
4496
4812
  }
4497
4813
  const approvedParts = allParts.filter(
4498
4814
  (p) => p.part && "state" in p.part && p.part.state === "approval-responded" && "approval" in p.part && p.part.approval?.approved === true
4499
4815
  );
4500
4816
  if (approvedParts.length > 0) {
4501
- emitStatus({
4817
+ throttledEmitStatus({
4502
4818
  writer: streamWriterRef.current,
4503
- status: { type: "processing-approvals" },
4504
- rpc
4819
+ status: { type: "processing-approvals" }
4505
4820
  });
4506
4821
  const preExecMessages = await (0, import_ai3.convertToModelMessages)(
4507
4822
  assembleUIMessages({
@@ -4555,12 +4870,11 @@ async function streamTextStep({
4555
4870
  })
4556
4871
  );
4557
4872
  }
4558
- emitStatus({
4873
+ throttledEmitStatus({
4559
4874
  writer: streamWriterRef.current,
4560
- status: { type: "thinking" },
4561
- rpc
4875
+ status: { type: "thinking" }
4562
4876
  });
4563
- const skillsContext = buildSkillsContext(skillsRef);
4877
+ const skillsContext = buildSkillsContext(skillsRef.current);
4564
4878
  const systemHeader = joinPromptSections(
4565
4879
  BASE_SYSTEM_PROMPT,
4566
4880
  session.system
@@ -4588,9 +4902,16 @@ async function streamTextStep({
4588
4902
  sessionId: input.sessionId,
4589
4903
  messages: modelMessages
4590
4904
  });
4905
+ let activeTools = session.activeTools ?? void 0;
4906
+ if (skillsRef.current.length === 0 && activeTools) {
4907
+ activeTools = activeTools.filter(
4908
+ (t) => t !== "Skill"
4909
+ );
4910
+ }
4591
4911
  return {
4592
4912
  messages: promptCaching.messages,
4593
- providerOptions: promptCaching.providerOptions
4913
+ providerOptions: promptCaching.providerOptions,
4914
+ activeTools
4594
4915
  };
4595
4916
  },
4596
4917
  onStepFinish: ({ usage }) => {
@@ -4631,10 +4952,9 @@ async function streamTextStep({
4631
4952
  }
4632
4953
  }
4633
4954
  if (hasApprovals) {
4634
- emitStatus({
4955
+ throttledEmitStatus({
4635
4956
  writer: streamWriterRef.current,
4636
- status: { type: "needs-approval" },
4637
- rpc
4957
+ status: { type: "needs-approval" }
4638
4958
  });
4639
4959
  }
4640
4960
  }
@@ -4642,42 +4962,79 @@ async function streamTextStep({
4642
4962
  );
4643
4963
  }
4644
4964
  });
4645
- await stream.pipeTo(writable, { preventClose: true });
4965
+ await stream.pipeTo(writable, {
4966
+ preventClose: true,
4967
+ preventAbort: true
4968
+ });
4646
4969
  } catch (err) {
4647
4970
  if (abortController.signal.aborted) {
4648
4971
  wasAborted = true;
4649
4972
  } else {
4650
- console.error("[streamTextStep] stream error:", err);
4651
4973
  throw err;
4652
4974
  }
4653
4975
  } finally {
4654
4976
  pollController.abort();
4977
+ throttledEmitStatus.dispose();
4655
4978
  }
4656
- await Promise.all(
4657
- stepParts.map(async (uiPart) => {
4658
- const result2 = await storage.part.set({
4659
- id: `part_${(0, import_ulid2.ulid)()}`,
4660
- index: nextPartIndex++,
4661
- messageId: assistantMessageId,
4662
- sessionId: input.sessionId,
4663
- part: uiPart
4664
- });
4665
- if (result2 instanceof Error) {
4666
- throw result2;
4979
+ if (abortController.signal.aborted) {
4980
+ wasAborted = true;
4981
+ }
4982
+ const lastPart = interruptedLastPartRef.current;
4983
+ if (wasAborted) {
4984
+ const terminalStates = /* @__PURE__ */ new Set([
4985
+ "output-available",
4986
+ "output-error",
4987
+ "output-denied",
4988
+ "done"
4989
+ ]);
4990
+ for (const part of stepParts) {
4991
+ if ("type" in part && typeof part.type === "string" && part.type.startsWith("tool-") && "state" in part && !terminalStates.has(part.state)) {
4992
+ part.state = "output-error";
4993
+ part.errorText = "interrupted";
4667
4994
  }
4668
- return result2;
4669
- })
4670
- );
4671
- if (setStartedPromise) {
4672
- const setStartedResult = await setStartedPromise;
4673
- if (setStartedResult instanceof Error) {
4674
- throw setStartedResult;
4675
4995
  }
4676
- for (const m of setStartedResult ?? []) {
4677
- if (m instanceof Error) {
4678
- throw m;
4996
+ }
4997
+ try {
4998
+ const basePartIndex = nextPartIndex;
4999
+ await Promise.all(
5000
+ stepParts.map(async (uiPart, i) => {
5001
+ const index = basePartIndex + i;
5002
+ if (lastPart != null && index > lastPart.index) {
5003
+ return;
5004
+ }
5005
+ const useClientPart = lastPart != null && index === lastPart.index;
5006
+ const content = useClientPart ? lastPart.part : uiPart;
5007
+ const result2 = await storage.part.set({
5008
+ id: `part_${(0, import_ulid2.ulid)()}`,
5009
+ index,
5010
+ messageId: assistantMessageId,
5011
+ sessionId: input.sessionId,
5012
+ part: content
5013
+ });
5014
+ if (result2 instanceof Error) {
5015
+ throw result2;
5016
+ }
5017
+ return result2;
5018
+ })
5019
+ );
5020
+ nextPartIndex = lastPart != null ? Math.min(basePartIndex + stepParts.length, lastPart.index + 1) : basePartIndex + stepParts.length;
5021
+ if (setStartedPromise) {
5022
+ const setStartedResult = await setStartedPromise;
5023
+ if (setStartedResult instanceof Error) {
5024
+ throw setStartedResult;
5025
+ }
5026
+ for (const m of setStartedResult ?? []) {
5027
+ if (m instanceof Error) {
5028
+ throw m;
5029
+ }
4679
5030
  }
4680
5031
  }
5032
+ } catch (err) {
5033
+ if (abortController.signal.aborted) {
5034
+ wasAborted = true;
5035
+ } else {
5036
+ throw err;
5037
+ }
4681
5038
  }
4682
5039
  const pendingApprovals = stepParts.filter(
4683
5040
  (p) => "state" in p && p.state === "approval-requested" && "approval" in p && !!p.approval?.id
@@ -4685,13 +5042,14 @@ async function streamTextStep({
4685
5042
  approvalId: p.approval.id,
4686
5043
  toolName: "type" in p ? String(p.type).replace("tool-", "") : "unknown"
4687
5044
  }));
4688
- const finalFinishReason = wasAborted ? "stop" : await result.finishReason;
5045
+ const finalFinishReason = wasAborted || lastPart != null ? "stop" : await result.finishReason;
4689
5046
  return {
4690
5047
  finishReason: finalFinishReason,
4691
5048
  lastPartIndex: nextPartIndex,
4692
5049
  usageSteps,
4693
5050
  pendingApprovals,
4694
- maxSteps: session.generation?.maxSteps
5051
+ maxSteps: session.generation?.maxSteps,
5052
+ discoveredSkills: skillsRef.current
4695
5053
  };
4696
5054
  }
4697
5055
 
@@ -4706,7 +5064,10 @@ async function agentWorkflow({
4706
5064
  const messageHook = agentMessageHook.create({ token: input.sessionId });
4707
5065
  const iterator = messageHook[Symbol.asyncIterator]();
4708
5066
  let pendingNext = iterator.next();
4709
- await onMessage({ event, input }).catch((e) => {
5067
+ let discoveredSkills = null;
5068
+ await onMessage({ event, input, discoveredSkills }).then((result) => {
5069
+ discoveredSkills = result?.discoveredSkills ?? discoveredSkills;
5070
+ }).catch((e) => {
4710
5071
  if (import_workflow3.FatalError.is(e)) {
4711
5072
  console.error("Message processing failed permanently:", e.message);
4712
5073
  return;
@@ -4719,7 +5080,9 @@ async function agentWorkflow({
4719
5080
  console.error("Unexpected: message hook iterator done");
4720
5081
  break;
4721
5082
  }
4722
- await onMessage({ event: result.value, input }).catch((e) => {
5083
+ await onMessage({ event: result.value, input, discoveredSkills }).then((result2) => {
5084
+ discoveredSkills = result2?.discoveredSkills ?? discoveredSkills;
5085
+ }).catch((e) => {
4723
5086
  if (import_workflow3.FatalError.is(e)) {
4724
5087
  console.error("Message processing failed permanently:", e.message);
4725
5088
  return;
@@ -4731,7 +5094,8 @@ async function agentWorkflow({
4731
5094
  }
4732
5095
  async function onMessage({
4733
5096
  event,
4734
- input
5097
+ input,
5098
+ discoveredSkills
4735
5099
  }) {
4736
5100
  const writable = (0, import_workflow3.getWritable)({ namespace: event.assistantMessageId });
4737
5101
  let finishReason;
@@ -4745,11 +5109,13 @@ async function onMessage({
4745
5109
  input,
4746
5110
  event,
4747
5111
  lastPartIndex,
4748
- stepIndexOffset: usageSteps.length
5112
+ stepIndexOffset: usageSteps.length,
5113
+ discoveredSkills
4749
5114
  });
4750
5115
  finishReason = result.finishReason;
4751
5116
  lastPartIndex = result.lastPartIndex;
4752
5117
  usageSteps.push(...result.usageSteps);
5118
+ discoveredSkills = result.discoveredSkills;
4753
5119
  if (result.maxSteps != null && usageSteps.length >= result.maxSteps) {
4754
5120
  break;
4755
5121
  }
@@ -4773,6 +5139,7 @@ async function onMessage({
4773
5139
  writable,
4774
5140
  usageSteps
4775
5141
  });
5142
+ return { discoveredSkills };
4776
5143
  }
4777
5144
 
4778
5145
  // src/client.ts
@@ -5239,6 +5606,7 @@ function toMessageAndParts({
5239
5606
  startedAt: null,
5240
5607
  completedAt: null,
5241
5608
  interruptedAt: null,
5609
+ interruptedLastPart: null,
5242
5610
  usage: null
5243
5611
  },
5244
5612
  parts: [
@@ -5267,6 +5635,7 @@ function toMessageAndParts({
5267
5635
  startedAt: null,
5268
5636
  completedAt: null,
5269
5637
  interruptedAt: null,
5638
+ interruptedLastPart: null,
5270
5639
  usage: null,
5271
5640
  role: input.role ?? defaultRole
5272
5641
  },
@@ -5281,6 +5650,15 @@ function toMessageAndParts({
5281
5650
  }
5282
5651
 
5283
5652
  // src/client.ts
5653
+ var AgentStatus = z5.discriminatedUnion("type", [
5654
+ z5.object({ type: z5.literal("sandbox-setup") }),
5655
+ z5.object({ type: z5.literal("sandbox-setup-cold") }),
5656
+ z5.object({ type: z5.literal("loading-skills") }),
5657
+ z5.object({ type: z5.literal("processing-approvals") }),
5658
+ z5.object({ type: z5.literal("needs-approval") }),
5659
+ z5.object({ type: z5.literal("thinking") }),
5660
+ z5.object({ type: z5.literal("custom"), status: z5.string() })
5661
+ ]);
5284
5662
  var isVercel = () => {
5285
5663
  try {
5286
5664
  return Boolean((0, import_oidc.getVercelOidcTokenSync)());
@@ -5288,7 +5666,8 @@ var isVercel = () => {
5288
5666
  return false;
5289
5667
  }
5290
5668
  };
5291
- var agent = (options) => {
5669
+ var agent = (_options) => {
5670
+ const options = _options ?? {};
5292
5671
  const agentSecret = process.env.AGENT_SECRET;
5293
5672
  if (!agentSecret) {
5294
5673
  throw new Error(
@@ -5453,18 +5832,31 @@ var agent = (options) => {
5453
5832
  throw session;
5454
5833
  }
5455
5834
  }
5456
- const interruptCurrentMessage = async () => {
5835
+ const interruptCurrentMessage = async (lastPart) => {
5457
5836
  const messagesResult = await getStorageInstance().message.list(sessionId);
5458
5837
  if (messagesResult instanceof Error) {
5459
5838
  return messagesResult;
5460
5839
  }
5461
5840
  const now = Date.now();
5462
- const pendingAssistantMessages = messagesResult.items.filter(
5841
+ let pendingAssistantMessages = messagesResult.items.filter(
5463
5842
  (m) => m.role === "assistant" && m.completedAt === null && m.interruptedAt === null
5464
5843
  );
5844
+ if (pendingAssistantMessages.length === 0) {
5845
+ const MAX_RETROACTIVE_MS = 5e3;
5846
+ const latest = messagesResult.items.filter(
5847
+ (m) => m.role === "assistant" && m.interruptedAt === null && m.completedAt !== null && now - m.completedAt < MAX_RETROACTIVE_MS
5848
+ ).sort((a, b) => b.createdAt - a.createdAt).at(0);
5849
+ if (latest) {
5850
+ pendingAssistantMessages = [latest];
5851
+ }
5852
+ }
5465
5853
  const results = await Promise.all(
5466
5854
  pendingAssistantMessages.map(
5467
- (m) => getStorageInstance().message.set({ ...m, interruptedAt: now })
5855
+ (m) => getStorageInstance().message.set({
5856
+ ...m,
5857
+ interruptedAt: now,
5858
+ interruptedLastPart: lastPart ?? null
5859
+ })
5468
5860
  )
5469
5861
  );
5470
5862
  for (const result of results) {
@@ -5487,7 +5879,7 @@ var agent = (options) => {
5487
5879
  ...p,
5488
5880
  part: {
5489
5881
  ...p.part,
5490
- state: "approval-responded",
5882
+ state: "output-denied",
5491
5883
  approval: {
5492
5884
  ...approval,
5493
5885
  approved: false,
@@ -5495,10 +5887,13 @@ var agent = (options) => {
5495
5887
  }
5496
5888
  }
5497
5889
  });
5498
- await approvalHook.resume(approval.id, {
5499
- approved: false,
5500
- reason: "interrupted"
5501
- });
5890
+ try {
5891
+ await approvalHook.resume(approval.id, {
5892
+ approved: false,
5893
+ reason: "interrupted"
5894
+ });
5895
+ } catch {
5896
+ }
5502
5897
  }
5503
5898
  }
5504
5899
  }
@@ -5512,7 +5907,8 @@ var agent = (options) => {
5512
5907
  context
5513
5908
  }) => {
5514
5909
  if (interruptIfStreaming) {
5515
- const interruptResult = await interruptCurrentMessage();
5910
+ const lastPart = typeof interruptIfStreaming === "object" ? interruptIfStreaming.lastPart : void 0;
5911
+ const interruptResult = await interruptCurrentMessage(lastPart);
5516
5912
  if (interruptResult instanceof Error) {
5517
5913
  return interruptResult;
5518
5914
  }
@@ -5549,6 +5945,7 @@ var agent = (options) => {
5549
5945
  startedAt: null,
5550
5946
  completedAt: null,
5551
5947
  interruptedAt: null,
5948
+ interruptedLastPart: null,
5552
5949
  usage: null
5553
5950
  });
5554
5951
  const session2 = await getStorageInstance().session.get(sessionId);
@@ -5587,17 +5984,18 @@ var agent = (options) => {
5587
5984
  async resumeOrStartAgentWorkflow() {
5588
5985
  if (session2.runId) {
5589
5986
  await agentMessageHook.resume(sessionId, event);
5590
- } else {
5591
- const startResult = await (0, import_api2.start)(agentWorkflow, [
5592
- { input: agentInput, event }
5593
- ]);
5594
- session2.runId = startResult.runId;
5987
+ return session2.runId;
5595
5988
  }
5989
+ const startResult = await (0, import_api2.start)(agentWorkflow, [
5990
+ { input: agentInput, event }
5991
+ ]);
5992
+ return startResult.runId;
5596
5993
  },
5597
5994
  async updateSession() {
5598
- await this.$.resumeOrStartAgentWorkflow;
5599
- const result = await getStorageInstance().session.set({
5600
- ...session2,
5995
+ const runId = await this.$.resumeOrStartAgentWorkflow;
5996
+ const result = await getStorageInstance().session.update({
5997
+ id: session2.id,
5998
+ runId,
5601
5999
  updatedAt: Date.now(),
5602
6000
  lastMessageId: assistantMessageId,
5603
6001
  hookToken: event.hookToken
@@ -5748,7 +6146,7 @@ var agent = (options) => {
5748
6146
  ...targetPart,
5749
6147
  part: {
5750
6148
  ...targetPart.part,
5751
- state: "approval-responded",
6149
+ state: approved ? "approval-responded" : "output-denied",
5752
6150
  approval: { id: approvalId, approved, reason }
5753
6151
  }
5754
6152
  };
@@ -5772,20 +6170,23 @@ var agent = (options) => {
5772
6170
  return computeSessionUsage(messagesResult.items);
5773
6171
  },
5774
6172
  update: async (updateOptions) => {
5775
- const current = await getStorageInstance().session.get(sessionId);
5776
- if (current instanceof Error) {
5777
- return current;
5778
- }
5779
- const updated = {
5780
- ...current,
5781
- ...updateOptions,
5782
- updatedAt: Date.now(),
5783
- skillsDir: updateOptions.skillsDir ? normalizeSkillsDirs(updateOptions.skillsDir) : current.skillsDir
5784
- };
5785
- if ((0, import_fast_deep_equal2.default)(updated, current)) {
6173
+ const { skillsDir: skillsDir2, ...rawUpdates } = updateOptions;
6174
+ const normalizedUpdates = Object.fromEntries(
6175
+ Object.entries({
6176
+ ...rawUpdates,
6177
+ ...skillsDir2 !== void 0 ? {
6178
+ skillsDir: skillsDir2 ? normalizeSkillsDirs(skillsDir2) : null
6179
+ } : {}
6180
+ }).filter(([, value]) => value !== void 0)
6181
+ );
6182
+ if (Object.keys(normalizedUpdates).length === 0) {
5786
6183
  return void 0;
5787
6184
  }
5788
- const result = await getStorageInstance().session.set(updated);
6185
+ const result = await getStorageInstance().session.update({
6186
+ id: sessionId,
6187
+ updatedAt: Date.now(),
6188
+ ...normalizedUpdates
6189
+ });
5789
6190
  if (result instanceof Error) {
5790
6191
  return result;
5791
6192
  }
@@ -5875,13 +6276,15 @@ init_errors();
5875
6276
  init_storage();
5876
6277
  // Annotate the CommonJS export names for ESM import in node:
5877
6278
  0 && (module.exports = {
6279
+ AgentStatus,
5878
6280
  MessageNotFoundError,
5879
6281
  SandboxError,
5880
6282
  SandboxNotFoundError,
5881
6283
  SessionNotFoundError,
6284
+ StorageConflictError,
5882
6285
  StorageError,
5883
6286
  agent,
5884
6287
  builtinToolNames,
5885
6288
  handleStorageRpc
5886
6289
  });
5887
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9lcnJvcnMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvY2xpZW50LnRzIiwgIi4uL3NyYy91dGlscy9kZWJ1Zy50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwtc2RrLnRzIiwgIi4uL3NyYy9zdG9yYWdlL3JwYy50cyIsICIuLi9zcmMvc3RvcmFnZS9oYW5kbGVyLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2luZGV4LnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9saWZlY3ljbGUtd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2NsaWVudC50cyIsICIuLi9zcmMvc2FuZGJveC9pbmRleC50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy92ZXJjZWwudHMiLCAiLi4vc3JjL3V0aWxzL3BhZ2luYXRlLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2JpbmRpbmdzL2xvY2FsLWZzLWhhbmRsZXJzLnRzIiwgIi4uL3NyYy9pbmRleC50cyIsICIuLi9zcmMvY2xpZW50LnRzIiwgIi4uL3NyYy9hZ2VudC13b3JrZmxvdy50cyIsICIuLi9zcmMvYWdlbnQtd29ya2Zsb3ctc3RlcHMudHMiLCAiLi4vc3JjL3NraWxscy9wYXJzZXIudHMiLCAiLi4vc3JjL3NraWxscy9kaXNjb3Zlci50cyIsICIuLi9zcmMvdG9vbHMvaW5kZXgudHMiLCAiLi4vc3JjL3Rvb2xzL2phdmFzY3JpcHQudHMiLCAiLi4vc3JjL3V0aWxzL3Byb21wdC1jYWNoZS50cyIsICIuLi9zcmMvdXRpbHMvdWkudHMiLCAiLi4vc3JjL3V0aWxzL3VzYWdlLnRzIiwgIi4uL3NyYy9ycGMtZGlzcGF0Y2gudHMiLCAiLi4vc3JjL3V0aWxzL21lc3NhZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQmFzaFJlc3VsdCwgU2FuZGJveCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBSVRfVU5USUwgPSAyMDAwO1xuXG4vKipcbiAqIFNoZWxsIHNjcmlwdCB0aGF0IGhhbmRsZXMgYWxsIHByb2Nlc3MgZXhlY3V0aW9uIGxvZ2ljLlxuICogSW5zdGFsbGVkIHRvIH4vLmFnZW50L2Jpbi9ydW4uc2ggZHVyaW5nIGluaXQoKS5cbiAqL1xuY29uc3QgUlVOX1NDUklQVCA9IGAjIS9iaW4vc2hcbiMgUHJvY2VzcyBydW5uZXIgZm9yIEFnZW50IFNES1xuIyBBbGwgcGFyYW1ldGVycyBwYXNzZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhdm9pZCBlc2NhcGluZyBpc3N1ZXNcbiMgT3V0cHV0IGlzIGJhc2U2NCBlbmNvZGVkIHRvIGF2b2lkIEpTT04gZXNjYXBpbmcgaXNzdWVzXG5cbkFHRU5UX0RJUj1cIiRIT01FLy5hZ2VudFwiXG5DV0RfRklMRT1cIiRBR0VOVF9ESVIvY3dkLyRTRVNTSU9OX0lEXCJcblxuIyBHZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAocGVyLXNlc3Npb24pXG5pZiBbIC1mIFwiJENXRF9GSUxFXCIgXTsgdGhlblxuICBDV0Q9JChjYXQgXCIkQ1dEX0ZJTEVcIilcbmVsc2VcbiAgQ1dEPVwiJEhPTUVcIlxuZmlcblxuIyBEZWNvZGUgY29tbWFuZFxuQ01EPSQoZWNobyBcIiRDTURfQkFTRTY0XCIgfCBiYXNlNjQgLWQpXG5cbiMgQmFja2dyb3VuZCBtb2RlICh3YWl0VW50aWwgPSAwKVxuaWYgWyBcIiRXQUlUX1VOVElMXCIgPSBcIjBcIiBdOyB0aGVuXG4gIGNkIFwiJENXRFwiIHx8IGNkIFwiJEhPTUVcIlxuXG4gICMgR2VuZXJhdGUgYSBzaW1wbGUgbnVtZXJpYyBJRCBmb3Igb3V0cHV0IGZpbGVcbiAgT1VUUFVUX0lEPVwiJChkYXRlICslcykkJFwiXG4gIE9VVFBVVF9GSUxFPVwiJEFHRU5UX0RJUi9vdXRwdXRzLyRPVVRQVVRfSUQubG9nXCJcblxuICAjIERvdWJsZS1mb3JrIHRvIGZ1bGx5IGRldGFjaCB0aGUgcHJvY2Vzc1xuICAoXG4gICAgKFxuICAgICAgZXZhbCBcIiRDTURcIlxuICAgICAgcHdkID4gXCIkQ1dEX0ZJTEVcIiAyPi9kZXYvbnVsbFxuICAgICkgPiBcIiRPVVRQVVRfRklMRVwiIDI+JjEgPCAvZGV2L251bGwgJlxuICAgIGVjaG8gJCEgPiBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiXG4gIClcblxuICAjIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBQSUQgZmlsZSBpcyB3cml0dGVuXG4gIHNsZWVwIDAuMDVcblxuICAjIFJlYWQgUElEXG4gIGlmIFsgLWYgXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIiBdOyB0aGVuXG4gICAgUElEPSQoY2F0IFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCIpXG4gIGVsc2VcbiAgICBQSUQ9MFxuICBmaVxuXG4gICMgT3V0cHV0IEpTT04gcmVzdWx0IChubyBvdXRwdXQgZm9yIGJhY2tncm91bmQsIHNvIG5vIGVuY29kaW5nIG5lZWRlZClcbiAgcHJpbnRmICd7XCJwaWRcIjolZCxcIm91dHB1dEJhc2U2NFwiOlwiXCIsXCJleGl0Q29kZVwiOi0xLFwic3RhdHVzXCI6XCJydW5uaW5nXCIsXCJvdXRwdXRGaWxlXCI6XCIlc1wiLFwiY3dkXCI6XCIlc1wifVxcXFxuJyBcXFxcXG4gICAgXCIkUElEXCIgXCIkT1VUUFVUX0ZJTEVcIiBcIiRDV0RcIlxuICBleGl0IDBcbmZpXG5cbiMgRm9yZWdyb3VuZCBtb2RlICh3YWl0VW50aWwgPiAwKSAtIHJ1biBkaXJlY3RseSBhbmQgY2FwdHVyZSBvdXRwdXRcbmNkIFwiJENXRFwiIHx8IGNkIFwiJEhPTUVcIlxuXG4jIFJ1biBjb21tYW5kLCBjYXB0dXJlIG91dHB1dCBhbmQgZXhpdCBjb2RlXG5PVVRQVVQ9JChldmFsIFwiJENNRFwiIDI+JjEpXG5FWElUX0NPREU9JD9cblxuIyBVcGRhdGUgQ1dEIGFmdGVyIGNvbW1hbmRcbk5FV19DV0Q9JChwd2QpXG5lY2hvIFwiJE5FV19DV0RcIiA+IFwiJENXRF9GSUxFXCJcblxuIyBEZXRlcm1pbmUgc3RhdHVzXG5pZiBbICRFWElUX0NPREUgLWVxIDAgXTsgdGhlblxuICBTVEFUVVM9XCJjb21wbGV0ZWRcIlxuZWxzZVxuICBTVEFUVVM9XCJmYWlsZWRcIlxuZmlcblxuIyBCYXNlNjQgZW5jb2RlIG91dHB1dCB0byBhdm9pZCBBTEwgZXNjYXBpbmcgaXNzdWVzXG5PVVRQVVRfQkFTRTY0PSQocHJpbnRmICclcycgXCIkT1VUUFVUXCIgfCBiYXNlNjQgfCB0ciAtZCAnXFxcXG4nKVxuXG4jIE91dHB1dCBKU09OIHJlc3VsdCB3aXRoIGJhc2U2NC1lbmNvZGVkIG91dHB1dFxucHJpbnRmICd7XCJwaWRcIjowLFwib3V0cHV0QmFzZTY0XCI6XCIlc1wiLFwiZXhpdENvZGVcIjolZCxcInN0YXR1c1wiOlwiJXNcIixcIm91dHB1dEZpbGVcIjpcIlwiLFwiY3dkXCI6XCIlc1wifVxcXFxuJyBcXFxcXG4gIFwiJE9VVFBVVF9CQVNFNjRcIiBcIiRFWElUX0NPREVcIiBcIiRTVEFUVVNcIiBcIiRORVdfQ1dEXCJcbmA7XG5cbnR5cGUgUnVuT3B0aW9ucyA9IHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICAvKipcbiAgICogTWF4IG1zIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uXG4gICAqIC0gMDogQmFja2dyb3VuZCBtb2RlIC0gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggUElEXG4gICAqIC0gPjA6IEZvcmVncm91bmQgbW9kZSAtIHdhaXQgZm9yIGNvbXBsZXRpb24gKGRlZmF1bHQ6IDMwMDAwKVxuICAgKi9cbiAgd2FpdFVudGlsPzogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIG1hbmFnZXIgdGhhdCB1c2VzIGEgc2luZ2xlIHNoZWxsIHNjcmlwdCB0byBoYW5kbGUgYWxsIGV4ZWN1dGlvbiBsb2dpYy5cbiAqIFJlZHVjZXMgcm91bmQtdHJpcHMgdG8gdGhlIHNhbmRib3ggYnkgZG9pbmcgZXZlcnl0aGluZyBpbiBvbmUgZXhlYyBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvY2Vzc01hbmFnZXIgPSAob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBzZXNzaW9uSWQgfSA9IG9wdHM7XG4gIGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGluaXQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwic2hcIixcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgbWtkaXIgLXAgJEhPTUUvLmFnZW50L2JpbiAkSE9NRS8uYWdlbnQvcGlkcyAkSE9NRS8uYWdlbnQvb3V0cHV0cyAkSE9NRS8uYWdlbnQvY3dkXG5jYXQgPiAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaCA8PCAnU0NSSVBUX0VPRidcbiR7UlVOX1NDUklQVH1cblNDUklQVF9FT0ZcbmNobW9kICt4ICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoYCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3VsdDtcbiAgICB9XG4gICAgYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gIH07XG5cbiAgY29uc3QgcnVuID0gYXN5bmMgKG9wdHM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEJhc2hSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBpbml0KCk7XG5cbiAgICBjb25zdCB7IGNvbW1hbmQsIHdhaXRVbnRpbCA9IERFRkFVTFRfV0FJVF9VTlRJTCB9ID0gb3B0cztcbiAgICBjb25zdCBjbWRCYXNlNjQgPSBCdWZmZXIuZnJvbShjb21tYW5kLCBcInV0Zi04XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwic2hcIixcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgQ01EX0JBU0U2ND1cIiR7Y21kQmFzZTY0fVwiIFdBSVRfVU5USUw9XCIke3dhaXRVbnRpbH1cIiBTRVNTSU9OX0lEPVwiJHtzZXNzaW9uSWR9XCIgJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2hgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0LnRyaW0oKSkgYXMge1xuICAgICAgcGlkOiBudW1iZXI7XG4gICAgICBvdXRwdXRCYXNlNjQ6IHN0cmluZztcbiAgICAgIGV4aXRDb2RlOiBudW1iZXI7XG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gICAgICBvdXRwdXRGaWxlOiBzdHJpbmc7XG4gICAgICBjd2Q6IHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gRGVjb2RlIGJhc2U2NCBvdXRwdXRcbiAgICBjb25zdCBvdXRwdXQgPSBwYXJzZWQub3V0cHV0QmFzZTY0XG4gICAgICA/IEJ1ZmZlci5mcm9tKHBhcnNlZC5vdXRwdXRCYXNlNjQsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmLThcIilcbiAgICAgIDogXCJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBwaWQ6IHBhcnNlZC5waWQsXG4gICAgICBvdXRwdXQsXG4gICAgICBleGl0Q29kZTogcGFyc2VkLmV4aXRDb2RlLFxuICAgICAgc3RhdHVzOiBwYXJzZWQuc3RhdHVzLFxuICAgICAgY3dkOiBwYXJzZWQuY3dkLFxuICAgICAgb3V0cHV0RmlsZTogcGFyc2VkLm91dHB1dEZpbGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBnZXRDd2QgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBhd2FpdCBpbml0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBjYXQgJEhPTUUvLmFnZW50L2N3ZC8ke3Nlc3Npb25JZH0gMj4vZGV2L251bGwgfHwgZWNobyBcIiRIT01FXCJgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHByb2Nlc3MuY3dkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgcmV0dXJuIHN0ZG91dC50cmltKCkgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGluaXQsXG4gICAgcnVuLFxuICAgIGdldEN3ZCxcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb2Nlc3NNYW5hZ2VyID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUHJvY2Vzc01hbmFnZXI+O1xuIiwgImltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbk5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25FcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIGZhaWxlZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNhbmRib3ggJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2FuZGJveEVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJNZXNzYWdlTm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIk1lc3NhZ2UgJGlkIG5vdCBmb3VuZFwiLFxufSkge31cbiIsICJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBNZXNzYWdlTm90Rm91bmRFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxuICBTdG9yYWdlRXJyb3IsXG59IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWFuZCxcbiAgTGlzdFJlc3VsdCxcbiAgUGFydCxcbiAgU2V0dXBTbmFwc2hvdCxcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxudHlwZSBScGNSZXNwb25zZTxUPiA9XG4gIHwgeyByZXN1bHQ6IFQgfVxuICB8IHsgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB9O1xuXG5leHBvcnQgdHlwZSBScGNGbiA9IChwYXJhbXM6IHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn0pID0+IFByb21pc2U8UnBjUmVzcG9uc2U8dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZUNsaWVudChycGNGbjogUnBjRm4sIG5hbWU/OiBzdHJpbmcpOiBTdG9yYWdlIHtcbiAgYXN5bmMgZnVuY3Rpb24gcnBjPE0gZXh0ZW5kcyBrZXlvZiBTdG9yYWdlTWV0aG9kcz4oXG4gICAgbWV0aG9kOiBNLFxuICAgIHBhcmFtczogei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInBhcmFtc1wiXT5cbiAgKTogUHJvbWlzZTx6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicmVzdWx0XCJdPj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwY0ZuKHsgbmFtZSwgbWV0aG9kLCBwYXJhbXMgfSk7XG5cbiAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogcmVzdWx0LmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2Vzc2lvbi5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnNldFwiLCBzZXNzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNlc3Npb24uZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi50YWcuc2V0XCIsIHsgc2Vzc2lvbklkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwibWVzc2FnZS5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VOb3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLnNldFwiLCBtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlNZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJwYXJ0LnNldFwiLCBwYXJ0KSkgYXMgUGFydDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInBhcnQuZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FuZGJveDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRcIiwgeyBrZXkgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBrZXkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRCeVNlc3Npb25cIiwgeyBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2FuZGJveC5zZXRcIiwgcmVjb3JkKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gubGlzdFwiLCB7XG4gICAgICAgICAgICB0YWdzOiBvcHRzPy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHM/Lm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2FuZGJveElkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gudGFnLnNldFwiLCB7IHNhbmRib3hJZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY3F1aXJlTG9jazogYXN5bmMgKHJlY29yZCwgbG9ja1RpbWVvdXRNcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwic2FuZGJveC5hY3F1aXJlTG9ja1wiLCB7XG4gICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICBsb2NrVGltZW91dE1zLFxuICAgICAgICAgIH0pKSBhcyBpbXBvcnQoXCIuL3R5cGVzXCIpLlNhbmRib3hSZWNvcmQgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHNldHVwOiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNldHVwLmdldFwiLCB7IGtleSB9KSkgYXMgU2V0dXBTbmFwc2hvdCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc25hcHNob3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzZXR1cC5zZXRcIiwgc25hcHNob3QpO1xuICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhY3F1aXJlTG9jazogYXN5bmMgKGtleSwgbG9ja0lkLCBsb2NrVGltZW91dE1zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzZXR1cC5hY3F1aXJlTG9ja1wiLCB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICBsb2NrVGltZW91dE1zLFxuICAgICAgICAgIH0pKSBhcyBTZXR1cFNuYXBzaG90IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5nZXRcIiwgeyBpZCB9KSkgYXMgQ29tbWFuZCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5zZXRcIiwgY29tbWFuZCkpIGFzIENvbW1hbmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcImNvbW1hbmQubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBpbmNsdWRlRmluaXNoZWQ6IG9wdHM/LmluY2x1ZGVGaW5pc2hlZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxDb21tYW5kPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gXCJkZWZhdWx0XCI7XG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRV9WRVJTSU9OID0gXCJ2MVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZShvcHRzOiB7XG4gIGNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiBScGNGbjtcbn0pOiBTdG9yYWdlIHtcbiAgY29uc3QgbmFtZSA9IG9wdHMuY29uZmlnLm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gIHJldHVybiBnZXRTdG9yYWdlQ2xpZW50KG9wdHMucnBjLCBuYW1lKTtcbn1cbiIsICJjb25zdCBlbmFibGVkID1cbiAgcHJvY2Vzcy5lbnYuQUdFTlRfREVCVUcgPT09IFwiMVwiIHx8IHByb2Nlc3MuZW52LkFHRU5UX0RFQlVHID09PSBcInRydWVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICBpZiAoZW5hYmxlZCkge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFVwbG9hZGFibGVGaWxlIH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgTUFYX1JFVFJJRVMgPSAyO1xuY29uc3QgUkVUUllfQkFTRV9NUyA9IDUwMDtcblxuLyoqXG4gKiBFeGVjIGEgY29tbWFuZCBhbmQgYXNzZXJ0IGV4aXQgY29kZSAwLiBSZXRyaWVzIG9uIHRyYW5zaWVudCBmYWlsdXJlc1xuICogKGV4aXQgY29kZSAyNTUgd2l0aCBlbXB0eSBzdGRlcnIgXHUyMDE0IHR5cGljYWxseSBhIHNhbmRib3ggcHJvY2VzcyBraWxsZWRcbiAqIGJlZm9yZSBpdCBjb3VsZCBwcm9kdWNlIG91dHB1dCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNDaGVja2VkKFxuICBzYW5kYm94OiBQaWNrPFNhbmRib3gsIFwiZXhlY1wiPixcbiAgb3B0czogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXSB9LFxuICBlcnJvckxhYmVsOiBzdHJpbmdcbik6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXIgfT4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKG9wdHMpO1xuICAgIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGV4ZWNSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSByZXN1bHQuZXhpdENvZGUgPT09IDI1NSAmJiAhcmVzdWx0LnN0ZGVyci50cmltKCk7XG4gICAgaWYgKGlzVHJhbnNpZW50ICYmIGF0dGVtcHQgPCBNQVhfUkVUUklFUykge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgUkVUUllfQkFTRV9NUyAqIChhdHRlbXB0ICsgMSkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2Vycm9yTGFiZWx9IHdpdGggZXhpdCBjb2RlICR7cmVzdWx0LmV4aXRDb2RlfTogJHtyZXN1bHQuc3RkZXJyfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGZpbGVzIHRvIGEgc2FuZGJveCBhdCB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIHBhdGguXG4gKiBTaGVsbCBzY3JpcHRzICguc2ggZmlsZXMpIGFyZSBhdXRvbWF0aWNhbGx5IG1hZGUgZXhlY3V0YWJsZS5cbiAqXG4gKiBGb3Igc21hbGwgZmlsZXMgKDwxMDBLQiB0b3RhbCksIHVzZXMgc2luZ2xlIGV4ZWMgd2l0aCBoZXJlZG9jLlxuICogRm9yIGxhcmdlIGZpbGVzLCB3cml0ZXMgYmFzZTY0IGNodW5rcyB0aGVuIGRlY29kZXMgdG8gYXZvaWQgQVJHX01BWCBsaW1pdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVzKG9wdHM6IHtcbiAgc2FuZGJveDogUGljazxTYW5kYm94LCBcImV4ZWNcIj47XG4gIGZpbGVzOiBVcGxvYWRhYmxlRmlsZVtdO1xuICBkZXN0UGF0aDogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNhbmRib3gsIGZpbGVzLCBkZXN0UGF0aCB9ID0gb3B0cztcblxuICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhdGhzID0gZmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnBvc2l4LmpvaW4oZGVzdFBhdGgsIGZpbGUucGF0aCkpO1xuICBjb25zdCBwYXJlbnREaXJzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KGZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucG9zaXguZGlybmFtZShwKSkpXG4gICk7XG4gIGNvbnN0IHNoZWxsU2NyaXB0cyA9IGZpbGVQYXRocy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoXCIuc2hcIikpO1xuXG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgLi4ucGFyZW50RGlyc10sXG4gIH0pO1xuICBpZiAobWtkaXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1rZGlyUmVzdWx0O1xuICB9XG4gIGF3YWl0IG1rZGlyUmVzdWx0LnJlc3VsdDtcblxuICBjb25zdCBDSFVOS19TSVpFID0gNTBfMDAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG4gICAgY29uc3QgZnVsbFBhdGggPSBmaWxlUGF0aHNbaV07XG4gICAgY29uc3QgYmFzZTY0Q29udGVudCA9IHRvQmFzZTY0KGZpbGUuY29udGVudCk7XG5cbiAgICBpZiAoYmFzZTY0Q29udGVudC5sZW5ndGggPCBDSFVOS19TSVpFKSB7XG4gICAgICBjb25zdCBtYXJrZXIgPSBgRU9GXyR7aX1gO1xuICAgICAgYXdhaXQgZXhlY0NoZWNrZWQoXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBgYmFzZTY0IC1kID4gJHtxdW90ZShmdWxsUGF0aCl9IDw8ICcke21hcmtlcn0nXG4ke2Jhc2U2NENvbnRlbnR9XG4ke21hcmtlcn1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFwid3JpdGVGaWxlcyBmYWlsZWRcIlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcEI2NCA9IGAvdG1wL2NodW5rLSR7RGF0ZS5ub3coKX0tJHtpfS5iNjRgO1xuXG4gICAgICBjb25zdCBjbGVhclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICBhcmdzOiBbXCItY1wiLCBgPiAke3F1b3RlKHRlbXBCNjQpfWBdLFxuICAgICAgfSk7XG4gICAgICBpZiAoY2xlYXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBjbGVhclJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNsZWFyUmVzdWx0LnJlc3VsdDtcblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIG9mZnNldCA8IGJhc2U2NENvbnRlbnQubGVuZ3RoO1xuICAgICAgICBvZmZzZXQgKz0gQ0hVTktfU0laRVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gYmFzZTY0Q29udGVudC5zbGljZShvZmZzZXQsIG9mZnNldCArIENIVU5LX1NJWkUpO1xuICAgICAgICBjb25zdCBtYXJrZXIgPSBgQ0hVTktfJHtvZmZzZXR9YDtcbiAgICAgICAgYXdhaXQgZXhlY0NoZWNrZWQoXG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgICBgY2F0ID4+ICR7cXVvdGUodGVtcEI2NCl9IDw8ICcke21hcmtlcn0nXG4ke2NodW5rfVxuJHttYXJrZXJ9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIndyaXRlRmlsZXMgY2h1bmsgZmFpbGVkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZXhlY0NoZWNrZWQoXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBgYmFzZTY0IC1kIDwgJHtxdW90ZSh0ZW1wQjY0KX0gPiAke3F1b3RlKGZ1bGxQYXRoKX0gJiYgcm0gLWYgJHtxdW90ZSh0ZW1wQjY0KX1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFwid3JpdGVGaWxlcyBkZWNvZGUgZmFpbGVkXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2htb2RSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJjaG1vZFwiLFxuICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzXSxcbiAgICB9KTtcbiAgICBpZiAoY2htb2RSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgY2htb2RSZXN1bHQ7XG4gICAgfVxuICAgIGF3YWl0IGNobW9kUmVzdWx0LnJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7cy5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGVidWdcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFNldHVwTWV0YSB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgTG9nRW50cnksIE9uUmVzdGFydCwgU2FuZGJveCwgU2FuZGJveFNldHVwIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cml0ZUZpbGVzIH0gZnJvbSBcIi4uL3dyaXRlLWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBsb2NhbFNhbmRib3ggPSA8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlLFxuICBzZXR1cCxcbiAgb25SZXN0YXJ0LFxufToge1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkICYgeyBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH0gfTtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94PFRUYWdzPiAmIHtcbiAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbn0gPT4ge1xuICBjb25zdCBjb25maWcgPSBzYW5kYm94UmVjb3JkLmNvbmZpZztcbiAgY29uc3QgYmFzZVBhdGggPSBjb25maWcucGF0aCA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBwcm9jZXNzZXMgPSBuZXcgTWFwPHN0cmluZywgQ2hpbGRQcm9jZXNzPigpO1xuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ID0ge1xuICAgIGlkOiBzYW5kYm94UmVjb3JkLmlkLFxuICAgIGNvbmZpZzogc2FuZGJveFJlY29yZC5jb25maWcsXG4gICAgZXhlYzogKHsgY29tbWFuZCwgYXJncywgc2lnbmFsIH0pID0+IHtcbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kSWQgPSBgY29tbWFuZF8ke3VsaWQoKX1gO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgICBjd2Q6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHJvY2Vzc2VzLnNldChjb21tYW5kSWQsIGNoaWxkKTtcblxuICAgICAgICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGxvZ1F1ZXVlOiBMb2dFbnRyeVtdID0gW107XG4gICAgICAgICAgbGV0IGxvZ1Jlc29sdmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgICAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgICAgICBzdGRlcnIgKz0gc3RyO1xuICAgICAgICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUHJvbWlzZTx7XG4gICAgICAgICAgICBzdGRvdXQ6IHN0cmluZztcbiAgICAgICAgICAgIHN0ZGVycjogc3RyaW5nO1xuICAgICAgICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgICAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICAgIHdoaWxlICghY2xvc2VkIHx8IGxvZ1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsb2dRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGNvbW1hbmRJZCwgbG9ncywgcmVzdWx0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGU6IHVua25vd24pID0+XG4gICAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gcHJvY2Vzc2VzLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgcmVhc29uOiBgQ29tbWFuZCAke2NvbW1hbmRJZH0gbm90IGZvdW5kIG9yIGFscmVhZHkgZmluaXNoZWRgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG5cbiAgICAgIGNvbnN0IGNtZCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmIChjbWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogY21kLm1lc3NhZ2UsIGNhdXNlOiBjbWQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY21kICYmIGNtZC5zdGF0dXMgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5zZXQoe1xuICAgICAgICAgIC4uLmNtZCxcbiAgICAgICAgICBzdGF0dXM6IFwia2lsbGVkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVzdWx0Lm1lc3NhZ2UsIGNhdXNlOiByZXN1bHQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVhZEZpbGU6IGFzeW5jICh7IHBhdGg6IGZpbGVQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlUGF0aCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgXCJjb2RlXCIgaW4gZSAmJlxuICAgICAgICAgIChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVGaWxlczogKG9wdHMpID0+IHdyaXRlRmlsZXMoeyBzYW5kYm94LCAuLi5vcHRzIH0pLFxuXG4gICAgdXBkYXRlTmV0d29ya1BvbGljeTogKCkgPT5cbiAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgcmVhc29uOiBcInVwZGF0ZU5ldHdvcmtQb2xpY3kgaXMgb25seSBhdmFpbGFibGUgZm9yIFZlcmNlbCBzYW5kYm94ZXNcIixcbiAgICAgICAgfSlcbiAgICAgICksXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2FuZGJveC5pZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHNhbmRib3hSZWNvcmQudGFncyA/PyB7fSkgYXMgVFRhZ3M7XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoc2FuZGJveC5pZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZC50YWdzPy5ba2V5IGFzIHN0cmluZ10gYXNcbiAgICAgICAgICB8IFRUYWdzW3R5cGVvZiBrZXldXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5pZCxcbiAgICAgICAgICB0YWdzOiB0YWdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHJlc3VsdDogU2FuZGJveDxUVGFncz4gJiB7XG4gICAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICAgIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xuICB9ID0gc2FuZGJveDtcblxuICBpZiAoc2V0dXAgfHwgb25SZXN0YXJ0KSB7XG4gICAgbGV0IHJlc29sdmVTZXR1cE1ldGEhOiAobWV0YTogU2FuZGJveFNldHVwTWV0YSkgPT4gdm9pZDtcbiAgICByZXN1bHQuX3NldHVwTWV0YSA9IG5ldyBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+KChyKSA9PiB7XG4gICAgICByZXNvbHZlU2V0dXBNZXRhID0gcjtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5fb25SZWFkeSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgbmVlZHNTZXR1cFJ1biA9ICEhc2V0dXA7XG4gICAgICBpZiAoc2V0dXApIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cC5rZXkpO1xuICAgICAgICBpZiAoIShleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yKSAmJiBleGlzdGluZykge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzZXR1cCBhbHJlYWR5IGNvbXBsZXRlIGZvciBrZXkgXCIke3NldHVwLmtleX1cIiwgc2tpcHBpbmdgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZWVkc1NldHVwUnVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSBzZXR1cCBtZXRhZGF0YSBiZWZvcmUgcnVubmluZyBzZXR1cCBzbyB0aGUgd29ya2Zsb3dcbiAgICAgIC8vIGNhbiBlbWl0IHRoZSBjb3JyZWN0IHN0YXR1cyBpbmRpY2F0b3Igd2hpbGUgc2V0dXAgcnVucy5cbiAgICAgIHJlc29sdmVTZXR1cE1ldGEoe1xuICAgICAgICBuZWVkc1NldHVwUnVuLFxuICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobmVlZHNTZXR1cFJ1biAmJiBzZXR1cCkge1xuICAgICAgICBkZWJ1ZyhgW3NhbmRib3g6c2V0dXBdIHJ1bm5pbmcgc2V0dXAucnVuIChsb2NhbCwga2V5PVwiJHtzZXR1cC5rZXl9XCIpYCk7XG4gICAgICAgIGF3YWl0IHNldHVwLnJ1bihzYW5kYm94KTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXR1cC5zZXQoe1xuICAgICAgICAgIGtleTogc2V0dXAua2V5LFxuICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgIGxhc3RVc2VkQXQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc2V0dXAgY29tcGxldGUsIHN0b3JlZCByZWNvcmQgKGtleT1cIiR7c2V0dXAua2V5fVwiKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChvblJlc3RhcnQpIHtcbiAgICAgICAgZGVidWcoXCJbc2FuZGJveDpzZXR1cF0gcnVubmluZyBvblJlc3RhcnQgKGxvY2FsKVwiKTtcbiAgICAgICAgYXdhaXQgb25SZXN0YXJ0KHNhbmRib3gpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICJleHBvcnQgeyBTYW5kYm94IH0gZnJvbSBcIkB2ZXJjZWwvc2FuZGJveFwiO1xuIiwgImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgcG9sbEludGVydmFsTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc3RvcEFmdGVySW5hY3RpdmVNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF1dG9TdGFydDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBOZXR3b3JrUG9saWN5U2NoZW1hID0gelxuICAudW5pb24oW1xuICAgIHoubGl0ZXJhbChcImFsbG93LWFsbFwiKSxcbiAgICB6LmxpdGVyYWwoXCJkZW55LWFsbFwiKSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICBhbGxvdzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgc3VibmV0czogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBhbGxvdzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGRlbnk6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgfSksXG4gIF0pXG4gIC5vcHRpb25hbCgpO1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrUG9saWN5ID0gei5pbmZlcjx0eXBlb2YgTmV0d29ya1BvbGljeVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94Q29uZmlnU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICByZXNvdXJjZXM6IHoub2JqZWN0KHsgdmNwdXM6IHoubnVtYmVyKCkgfSkub3B0aW9uYWwoKSxcbiAgICBwb3J0czogei5hcnJheSh6Lm51bWJlcigpKS5vcHRpb25hbCgpLFxuICAgIGxpZmVjeWNsZTogVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgbmV0d29ya1BvbGljeTogTmV0d29ya1BvbGljeVNjaGVtYSxcbiAgfSksXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJsb2NhbFwiKSxcbiAgICBwYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwiY3VzdG9tXCIpLFxuICAgIHVybDogei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTYW5kYm94Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgU2FuZGJveENvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IEdlbmVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1heFN0ZXBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRlbXBlcmF0dXJlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcEs6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9wUDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBmcmVxdWVuY3lQZW5hbHR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHByZXNlbmNlUGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBtYXhPdXRwdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2Vzc2lvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgdXBkYXRlZEF0OiB6Lm51bWJlcigpLFxuICBydW5JZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBsYXN0TWVzc2FnZUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBzeXN0ZW06IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNraWxsc0Rpcjogei5hcnJheSh6LnN0cmluZygpKS5udWxsYWJsZSgpLFxuICBob29rVG9rZW46IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWN0aXZlVG9vbHM6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFN0ZXBVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcEluZGV4OiB6Lm51bWJlcigpLFxuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1vZGVsOiB6LnN0cmluZygpLFxuICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICB0b3RhbFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVSZWFkVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVdyaXRlVG9rZW5zOiB6Lm51bWJlcigpLFxuICByZWFzb25pbmdUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN0ZXBDb3VudDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVVzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGVwczogei5hcnJheShTdGVwVXNhZ2VTY2hlbWEpLFxuICBzdW1tYXJ5OiBVc2FnZVN1bW1hcnlTY2hlbWEsXG59KTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVVzYWdlID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZVVzYWdlU2NoZW1hPjtcbmV4cG9ydCB0eXBlIFVzYWdlU3VtbWFyeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlU3VtbWFyeVNjaGVtYT47XG5leHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB6LmluZmVyPHR5cGVvZiBTdGVwVXNhZ2VTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgcm9sZTogei5lbnVtKFtcInVzZXJcIiwgXCJhc3Npc3RhbnRcIiwgXCJzeXN0ZW1cIl0pLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBpbnRlcnJ1cHRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIHVzYWdlOiBNZXNzYWdlVXNhZ2VTY2hlbWEubnVsbGFibGUoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBgcGFydGAgZmllbGQgY29ycmVzcG9uZHMgdG8gYFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl1gIGZyb20gdGhlIGBhaWAgcGFja2FnZS5cbiAqIFdlIHVzZSBgei51bmtub3duKClgIGJlY2F1c2UgdGhlIGV4YWN0IHNoYXBlIHZhcmllcyBieSBwYXJ0IHR5cGUgKHRleHQsIHRvb2wtY2FsbCxcbiAqIHRvb2wtcmVzdWx0LCBldGMuKSBhbmQgbWF5IGV2b2x2ZSB3aXRoIHRoZSBBSSBTREsuIFRoZSBSUEMgbGF5ZXIganVzdCBwYXNzZXMgaXQgdGhyb3VnaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kUmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGRvdXQ6IHouc3RyaW5nKCksXG4gIHN0ZGVycjogei5zdHJpbmcoKSxcbiAgZXhpdENvZGU6IHoubnVtYmVyKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94UmVjb3JkU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgY29uZmlnOiBTYW5kYm94Q29uZmlnU2NoZW1hLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGxhc3RBY3Rpdml0eUF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgcHJvdmlkZXJNZXRhZGF0YTogelxuICAgIC5kaXNjcmltaW5hdGVkVW5pb24oXCJwcm92aWRlclwiLCBbXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHByb3ZpZGVyOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICB9KSxcbiAgICBdKVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IENvbW1hbmRCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICBjb21tYW5kOiB6LnN0cmluZygpLFxuICBhcmdzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3RhdHVzXCIsIFtcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHsgc3RhdHVzOiB6LmxpdGVyYWwoXCJydW5uaW5nXCIpIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJraWxsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiZmFpbGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG5dKTtcblxuZnVuY3Rpb24gTGlzdFJlc3VsdFNjaGVtYTxUIGV4dGVuZHMgei5ab2RUeXBlQW55PihpdGVtU2NoZW1hOiBUKSB7XG4gIHJldHVybiB6Lm9iamVjdCh7XG4gICAgaXRlbXM6IHouYXJyYXkoaXRlbVNjaGVtYSksXG4gICAgbmV4dEN1cnNvcjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IFNldHVwU25hcHNob3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgc25hcHNob3RJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIGxhc3RVc2VkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0lkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxufSk7XG5cbmNvbnN0IG1ldGhvZHMgPSB7XG4gIFwic2Vzc2lvbi5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXNzaW9uLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXNzaW9uU2NoZW1hLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJzZXNzaW9uLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNlc3Npb25TY2hlbWEpLFxuICB9LFxuICBcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5kZWxldGVcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNlc3Npb24udGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcIm1lc3NhZ2UuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBNZXNzYWdlU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwibWVzc2FnZS5zZXRcIjoge1xuICAgIHBhcmFtczogTWVzc2FnZVNjaGVtYSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoTWVzc2FnZVNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5saXN0QnlNZXNzYWdlXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2VJZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoUGFydFNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoUGFydFNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5zZXRcIjoge1xuICAgIHBhcmFtczogUGFydFNjaGVtYSxcbiAgICByZXN1bHQ6IFBhcnRTY2hlbWEsXG4gIH0sXG4gIFwicGFydC5kZWxldGVcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgc2Vzc2lvbklkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgcmVzdWx0OiB6LnZvaWQoKSxcbiAgfSxcbiAgXCJzYW5kYm94Lmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwibGFzdEFjdGl2aXR5QXRfYXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTYW5kYm94UmVjb3JkU2NoZW1hKSxcbiAgfSxcbiAgXCJzYW5kYm94LnRhZy5zZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgfSxcbiAgXCJjb21tYW5kLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogQ29tbWFuZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcImNvbW1hbmQuc2V0XCI6IHtcbiAgICBwYXJhbXM6IENvbW1hbmRTY2hlbWEsXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBpbmNsdWRlRmluaXNoZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKENvbW1hbmRTY2hlbWEpLFxuICB9LFxuICBcInNldHVwLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGtleTogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXR1cC5zZXRcIjoge1xuICAgIHBhcmFtczogU2V0dXBTbmFwc2hvdFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNldHVwLmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIGtleTogei5zdHJpbmcoKSxcbiAgICAgIGxvY2tJZDogei5zdHJpbmcoKSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTZXR1cFNuYXBzaG90U2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5hY3F1aXJlTG9ja1wiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICByZWNvcmQ6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgICBsb2NrVGltZW91dE1zOiB6Lm51bWJlcigpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHsgbWV0aG9kcyB9O1xuZXhwb3J0IHR5cGUgU3RvcmFnZU1ldGhvZHMgPSB0eXBlb2YgbWV0aG9kcztcbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWUgPSBrZXlvZiBTdG9yYWdlTWV0aG9kcztcbmV4cG9ydCBjb25zdCBTVE9SQUdFX1JQQ19NRVRIT0RTID0gT2JqZWN0LmtleXMobWV0aG9kcykgYXMgTWV0aG9kTmFtZVtdO1xuIiwgImltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHR5cGUgTWV0aG9kTmFtZSwgbWV0aG9kcywgdHlwZSBTdG9yYWdlTWV0aG9kcyB9IGZyb20gXCIuL3JwY1wiO1xuXG5leHBvcnQgdHlwZSBIYW5kbGVycyA9IHtcbiAgW0sgaW4gTWV0aG9kTmFtZV06IChcbiAgICBwYXJhbXM6IHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbS11bXCJwYXJhbXNcIl0+XG4gICkgPT4gUHJvbWlzZTx6LmluZmVyPFN0b3JhZ2VNZXRob2RzW0tdW1wicmVzdWx0XCJdPj47XG59O1xuXG5leHBvcnQgdHlwZSBScGNSZXF1ZXN0ID0ge1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGFyYW1zOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiA9IHtcbiAgcmVzdWx0OiBUO1xufTtcblxuZXhwb3J0IHR5cGUgUnBjRXJyb3JSZXNwb25zZSA9IHtcbiAgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1Jlc3BvbnNlPFQgPSB1bmtub3duPiA9IFJwY1N1Y2Nlc3NSZXNwb25zZTxUPiB8IFJwY0Vycm9yUmVzcG9uc2U7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVTdG9yYWdlUnBjKFxuICBib2R5OiBScGNSZXF1ZXN0LFxuICBoYW5kbGVyczogSGFuZGxlcnNcbik6IFByb21pc2U8UnBjUmVzcG9uc2U+IHtcbiAgY29uc3QgeyBtZXRob2QsIHBhcmFtcyB9ID0gYm9keTtcblxuICBpZiAoIShtZXRob2QgaW4gbWV0aG9kcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHsgY29kZTogXCJNRVRIT0RfTk9UX0ZPVU5EXCIsIG1lc3NhZ2U6IGBVbmtub3duIG1ldGhvZDogJHttZXRob2R9YCB9LFxuICAgIH07XG4gIH1cblxuICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kIGFzIE1ldGhvZE5hbWU7XG4gIGNvbnN0IHNjaGVtYSA9IG1ldGhvZHNbbWV0aG9kTmFtZV0ucGFyYW1zO1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKHBhcmFtcyk7XG5cbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfUEFSQU1TXCIsXG4gICAgICAgIG1lc3NhZ2U6IHBhcnNlZC5lcnJvci5pc3N1ZXNcbiAgICAgICAgICAubWFwKChpKSA9PiBgJHtpLnBhdGguam9pbihcIi5cIil9OiAke2kubWVzc2FnZX1gKVxuICAgICAgICAgIC5qb2luKFwiLCBcIiksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1ttZXRob2ROYW1lXSBhcyAoXG4gICAgICBwYXJhbXM6IHVua25vd25cbiAgICApID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihwYXJzZWQuZGF0YSk7XG4gICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlRFUk5BTF9FUlJPUlwiLFxuICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsICJleHBvcnQge1xuICBERUZBVUxUX05BTUVTUEFDRSxcbiAgZ2V0U3RvcmFnZSxcbiAgTE9DQUxfU1RPUkFHRV9WRVJTSU9OLFxuICB0eXBlIFJwY0ZuLFxufSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB7XG4gIHR5cGUgSGFuZGxlcnMsXG4gIGhhbmRsZVN0b3JhZ2VScGMsXG4gIHR5cGUgUnBjRXJyb3JSZXNwb25zZSxcbiAgdHlwZSBScGNSZXF1ZXN0LFxuICB0eXBlIFJwY1Jlc3BvbnNlLFxuICB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZSxcbn0gZnJvbSBcIi4vaGFuZGxlclwiO1xuZXhwb3J0IHtcbiAgdHlwZSBNZXNzYWdlVXNhZ2UsXG4gIHR5cGUgTWV0aG9kTmFtZSxcbiAgdHlwZSBTYW5kYm94Q29uZmlnLFxuICBTVE9SQUdFX1JQQ19NRVRIT0RTLFxuICB0eXBlIFN0ZXBVc2FnZSxcbiAgdHlwZSBTdG9yYWdlTWV0aG9kcyxcbiAgdHlwZSBVc2FnZVN1bW1hcnksXG59IGZyb20gXCIuL3JwY1wiO1xuZXhwb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBNZXNzYWdlLFxuICBQYXJ0LFxuICBSZXNvbHZlZFN0b3JhZ2UsXG4gIFNhbmRib3hSZWNvcmQsXG4gIFNlc3Npb24sXG4gIFNldHVwU25hcHNob3QsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG4gIFR5cGVkU2Vzc2lvbixcbiAgVHlwZWRTdG9yYWdlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyA9IDIgKiA2MCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX0lETEVfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5jb25zdCBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUyA9IDEwICogNjAgKiAxMDAwO1xuXG5jb25zdCBnZXRUZXN0Q3JlZGVudGlhbHMgPSAoKSA9PlxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCJcbiAgICA/IHtcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RPS0VOLFxuICAgICAgICB0ZWFtSWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RFQU1fSUQsXG4gICAgICAgIHByb2plY3RJZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfUFJPSkVDVF9JRCxcbiAgICAgIH1cbiAgICA6IHt9O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVTdGVwUmVzdWx0ID1cbiAgfCB7IGFjdGlvbjogXCJjb250aW51ZVwiOyBuZXh0UG9sbE1zOiBudW1iZXIgfVxuICB8IHtcbiAgICAgIGFjdGlvbjogXCJleGl0XCI7XG4gICAgICByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB8IFwiaWRsZVwiIHwgXCJ0aW1lb3V0XCIgfCBcIm5vdF9mb3VuZFwiO1xuICAgIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFNuYXBzaG90U3RlcChcbiAgaW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dFxuKTogUHJvbWlzZTxFcnJvciB8IExpZmVjeWNsZVN0ZXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgU2FuZGJveDogVmVyY2VsU2FuZGJveFNESyB9ID0gYXdhaXQgaW1wb3J0KFwiLi92ZXJjZWwtc2RrXCIpO1xuICBjb25zdCB7IGdldFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL3N0b3JhZ2VcIik7XG4gIGlmICghaW5wdXQucnBjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUlBDIG5vdCBmb3VuZFwiKTtcbiAgfVxuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7XG4gICAgY29uZmlnOiBpbnB1dC5zdG9yYWdlQ29uZmlnLFxuICAgIHJwYzogaW5wdXQucnBjLFxuICB9KTtcbiAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpbnB1dC5pZCk7XG4gIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgY3VycmVudFNhbmRib3hJZCA9XG4gICAgcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgOiBudWxsO1xuXG4gIGlmIChjdXJyZW50U2FuZGJveElkICE9PSBpbnB1dC52ZXJjZWxTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB9O1xuICB9XG5cbiAgaWYgKCFjdXJyZW50U2FuZGJveElkKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjb25maWcgPSByZWNvcmQuY29uZmlnO1xuICBpZiAoY29uZmlnLnR5cGUgIT09IFwidmVyY2VsXCIpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnN0b3BBZnRlckluYWN0aXZlTXMgPz8gREVGQVVMVF9JRExFX1RJTUVPVVRfTVM7XG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlVGltZW91dE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdEJlZm9yZVRpbWVvdXRNcyA/PyBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUztcblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBsYXN0QWN0aXZpdHkgPSByZWNvcmQubGFzdEFjdGl2aXR5QXQgPz8gcmVjb3JkLmNyZWF0ZWRBdCA/PyBub3c7XG4gIGNvbnN0IGlkbGVEdXJhdGlvbiA9IG5vdyAtIGxhc3RBY3Rpdml0eTtcbiAgY29uc3Qgc2hvdWxkU25hcHNob3REdWVUb0lkbGUgPSBpZGxlRHVyYXRpb24gPiBpZGxlVGltZW91dE1zO1xuXG4gIGxldCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgICBpZiAoc2FuZGJveC50aW1lb3V0IDwgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMpIHtcbiAgICAgIHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgaWYgKHNob3VsZFNuYXBzaG90RHVlVG9JZGxlIHx8IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIC4uLnJlY29yZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKFN0cmluZyhlKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiLFxuICAgICAgcmVhc29uOiBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA/IFwiaWRsZVwiIDogXCJ0aW1lb3V0XCIsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIiwgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgY2hlY2tBbmRTbmFwc2hvdFN0ZXAgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0O1xufSkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuXG4gIGxldCBuZXh0UG9sbE1zID0gREVGQVVMVF9QT0xMX01TO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgfHwgcmVzdWx0LmFjdGlvbiA9PT0gXCJleGl0XCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgU2FuZGJveCBhcyBWZXJjZWxTYW5kYm94U0RLIH0gZnJvbSBcIkB2ZXJjZWwvc2FuZGJveFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0IHsgU2FuZGJveEVycm9yLCBTYW5kYm94Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBScGNGbiwgU2FuZGJveFJlY29yZCwgU3RvcmFnZSwgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuLi8uLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuLi8uLi91dGlscy9kZWJ1Z1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94U2V0dXBNZXRhIH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBMb2dFbnRyeSxcbiAgT25SZXN0YXJ0LFxuICBTYW5kYm94LFxuICBTYW5kYm94TGlmZWN5Y2xlLFxuICBTYW5kYm94TGlmZWN5Y2xlSW5wdXQsXG4gIFNhbmRib3hTZXR1cCxcbiAgU2FuZGJveFN0YXR1cyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3cgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3dcIjtcblxuZXhwb3J0IHR5cGUgVmVyY2VsU2FuZGJveENyZWF0ZU9wdGlvbnMgPSBFeHRyYWN0PFxuICBQYXJhbWV0ZXJzPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZT5bMF0sXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogLlxuICB7fVxuPjtcblxuZXhwb3J0IGNvbnN0IFZFUkNFTF9NQVhfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDYwICogMTAwMDsgLy8gNSBob3Vyc1xuY29uc3QgTE9DS19USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDsgLy8gNSBtaW51dGVzIC0gaWYgbG9jayBvbGRlciB0aGFuIHRoaXMsIGNvbnNpZGVyIGl0IHN0YWxlXG5jb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAyMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbi8qKlxuICogTW9kdWxlLWxldmVsIGNhY2hlIGZvciBpbi1mbGlnaHQgc2FuZGJveCBjcmVhdGlvbiBwcm9taXNlcy5cbiAqIFByZXZlbnRzIHBhcmFsbGVsIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzIGZyb20gY3JlYXRpbmcgZHVwbGljYXRlIHNhbmRib3hlcy5cbiAqL1xuY29uc3QgY3JlYXRlUHJvbWlzZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+PigpO1xuXG5jb25zdCBBQ1RJVklUWV9USFJPVFRMRV9NUyA9IDEwXzAwMDtcbmNvbnN0IGxhc3RBY3Rpdml0eVNlbnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG5jb25zdCBERUZBVUxUX1ZDUFVTID0gMjtcblxuZnVuY3Rpb24gaXNTYW5kYm94R29uZUVycm9yKGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCEoZSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVycm9yV2l0aFJlc3BvbnNlID0gZSBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9O1xuICBjb25zdCBlcnJvcldpdGhDYXVzZSA9IGUgYXMgeyBjYXVzZT86IHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0gfTtcblxuICBjb25zdCBzdGF0dXMgPVxuICAgIGVycm9yV2l0aFJlc3BvbnNlLnJlc3BvbnNlPy5zdGF0dXMgPz9cbiAgICBlcnJvcldpdGhDYXVzZS5jYXVzZT8ucmVzcG9uc2U/LnN0YXR1cztcblxuICBpZiAoc3RhdHVzID09PSA0MTAgfHwgc3RhdHVzID09PSA0MjIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpO1xuICBpZiAoXG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGNvbW1hbmQgZGF0YVwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJFeHBlY3RlZCBhIHN0cmVhbSBvZiBsb2dzXCIpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3QgdmVyY2VsU2FuZGJveCA9IDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2VDb25maWcsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93LFxuICBzdG9yYWdlLFxuICBycGMsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQgJiB7IGNvbmZpZzogeyB0eXBlOiBcInZlcmNlbFwiIH0gfTtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHJwYz86IFJwY0ZuO1xuICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xufSk6IFNhbmRib3g8VFRhZ3M+ICYge1xuICBfb25SZWFkeT86IFByb21pc2U8dm9pZD47XG4gIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xufSA9PiB7XG4gIGNvbnN0IHsgaWQsIGNvbmZpZyB9ID0gc2FuZGJveFJlY29yZDtcbiAgY29uc3QgdmNwdXMgPSBjb25maWcucmVzb3VyY2VzPy52Y3B1cyA/PyBERUZBVUxUX1ZDUFVTO1xuICBjb25zdCBwb3J0cyA9IGNvbmZpZy5wb3J0cztcbiAgY29uc3QgbmV0d29ya1BvbGljeSA9IGNvbmZpZy5uZXR3b3JrUG9saWN5O1xuICBjb25zdCBpbml0aWFsVmVyY2VsID1cbiAgICBzYW5kYm94UmVjb3JkLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICA/IHNhbmRib3hSZWNvcmQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgOiBudWxsO1xuXG4gIHR5cGUgU2FuZGJveEluc3RhbmNlID0gQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLLmdldD4+O1xuICBsZXQgc2FuZGJveFByb21pc2U6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB8IG51bGwgPSBudWxsO1xuICBsZXQgcmVjb3ZlcmVkRnJvbVN0YWxlID0gZmFsc2U7XG4gIGxldCBjcmVhdGVkRnJvbVNuYXBzaG90ID0gZmFsc2U7XG4gIGxldCBuZWVkc1NldHVwUnVuID0gZmFsc2U7XG4gIGNvbnN0IEhPTUVfRElSID0gXCIvaG9tZS92ZXJjZWwtc2FuZGJveFwiO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvbGxGb3JTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBMT0NLX1RJTUVPVVRfTVM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgTE9DS19QT0xMX0lOVEVSVkFMX01TKSk7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVjb3JkLm1lc3NhZ2UsIGNhdXNlOiByZWNvcmQgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB2ZXJjZWxTYW5kYm94SWQgPVxuICAgICAgICByZWNvcmQ/LnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgICAgPyByZWNvcmQucHJvdmlkZXJNZXRhZGF0YS5zYW5kYm94SWRcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpZiAodmVyY2VsU2FuZGJveElkKSB7XG4gICAgICAgIHJldHVybiB2ZXJjZWxTYW5kYm94SWQ7XG4gICAgICB9XG4gICAgICBpZiAoIXJlY29yZD8uYWNxdWlyaW5nTG9ja0F0KSB7XG4gICAgICAgIGNvbnN0IGZpbmFsQ2hlY2sgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKGZpbmFsQ2hlY2sgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgICAgICAgIHJlYXNvbjogZmluYWxDaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2U6IGZpbmFsQ2hlY2ssXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmluYWxWZXJjZWxTYW5kYm94SWQgPVxuICAgICAgICAgIGZpbmFsQ2hlY2s/LnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgICAgICA/IGZpbmFsQ2hlY2sucHJvdmlkZXJNZXRhZGF0YS5zYW5kYm94SWRcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKGZpbmFsVmVyY2VsU2FuZGJveElkKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbmFsVmVyY2VsU2FuZGJveElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgIHJlYXNvbjogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igc2FuZGJveCBjcmVhdGlvbiBieSBhbm90aGVyIHByb2Nlc3NcIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coXG4gICAgdmVyY2VsU2FuZGJveElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFlbmFibGVMaWZlY3ljbGVXb3JrZmxvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsaWZlY3ljbGVJbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0ID0ge1xuICAgICAgaWQsXG4gICAgICB2ZXJjZWxTYW5kYm94SWQsXG4gICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgcnBjLFxuICAgIH07XG4gICAgYXdhaXQgc3RhcnQoc2FuZGJveExpZmVjeWNsZVdvcmtmbG93LCBbeyBpbnB1dDogbGlmZWN5Y2xlSW5wdXQgfV0pLmNhdGNoKFxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5QmxvY2tTdGF0ZW1lbnRzOiBpbnRlbnRpb25hbGx5IGlnbm9yZWQgLSB3b3JrZmxvdyBzdGFydCBpcyBmaXJlLWFuZC1mb3JnZXRcbiAgICAgICgpID0+IHt9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3QoXG4gICAgc25hcHNob3RJZDogc3RyaW5nXG4gICk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgICBzb3VyY2U6IHsgdHlwZTogXCJzbmFwc2hvdFwiLCBzbmFwc2hvdElkIH0sXG4gICAgICAgICAgcmVzb3VyY2VzOiB7IHZjcHVzIH0sXG4gICAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICAgIHBvcnRzLFxuICAgICAgICAgIG5ldHdvcmtQb2xpY3ksXG4gICAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgdGFnczogc2FuZGJveFJlY29yZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5zYW5kYm94SWQsXG4gICAgICAgICAgICBzbmFwc2hvdElkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzdGFydExpZmVjeWNsZVdvcmtmbG93KHNhbmRib3guc2FuZGJveElkKTtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guc2FuZGJveElkO1xuICAgICAgfSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUZyZXNoU2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAgICAgcmVzb3VyY2VzOiB7IHZjcHVzIH0sXG4gICAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICAgIHBvcnRzLFxuICAgICAgICAgIG5ldHdvcmtQb2xpY3ksXG4gICAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgdGFnczogc2FuZGJveFJlY29yZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgIHNhbmRib3hJZDogc2FuZGJveC5zYW5kYm94SWQsXG4gICAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzdGFydExpZmVjeWNsZVdvcmtmbG93KHNhbmRib3guc2FuZGJveElkKTtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guc2FuZGJveElkO1xuICAgICAgfSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIGV4ZWMgbG9naWMgYWdhaW5zdCBhIHJhdyBWZXJjZWwgU0RLIGluc3RhbmNlLlxuICAgKiBTaGFyZWQgYmV0d2VlbiB0aGUgbWFpbiBzYW5kYm94IHdyYXBwZXIgYW5kIHRlbXBvcmFyeSBzZXR1cCBzYW5kYm94ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBleGVjT25JbnN0YW5jZShcbiAgICBpbnN0YW5jZTogU2FuZGJveEluc3RhbmNlLFxuICAgIHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBhcmdzLFxuICAgICAgc2lnbmFsLFxuICAgIH06IHsgY29tbWFuZDogc3RyaW5nOyBhcmdzPzogc3RyaW5nW107IHNpZ25hbD86IEFib3J0U2lnbmFsIH1cbiAgKTogUHJvbWlzZTxcbiAgICB8IFNhbmRib3hFcnJvclxuICAgIHwge1xuICAgICAgICBjb21tYW5kSWQ6IHN0cmluZztcbiAgICAgICAgbG9nczogKCkgPT4gQXN5bmNJdGVyYWJsZTxMb2dFbnRyeT47XG4gICAgICAgIHJlc3VsdDogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXhpdENvZGU6IG51bWJlciB9PjtcbiAgICAgIH1cbiAgPiB7XG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaW5zdGFuY2UucnVuQ29tbWFuZCh7XG4gICAgICAgICAgY3dkOiBIT01FX0RJUixcbiAgICAgICAgICBhcmdzLFxuICAgICAgICAgIGNtZDogY29tbWFuZCxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgICAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICAgICAgY29uc3QgbG9nQnVmZmVyOiBMb2dFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgIHJlc29sdmU6IG51bGwgYXMgKCgpID0+IHZvaWQpIHwgbnVsbCxcbiAgICAgICAgICBjb25zdW1lZDogZmFsc2UsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29uc3VtZUxvZ3MgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGxvZyBvZiBvdXRwdXQubG9ncygpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5OiBMb2dFbnRyeSA9XG4gICAgICAgICAgICAgICAgbG9nLnN0cmVhbSA9PT0gXCJzdGRvdXRcIlxuICAgICAgICAgICAgICAgICAgPyB7IHN0cmVhbTogXCJzdGRvdXRcIiwgZGF0YTogbG9nLmRhdGEgfVxuICAgICAgICAgICAgICAgICAgOiB7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogbG9nLmRhdGEgfTtcblxuICAgICAgICAgICAgICBpZiAobG9nLnN0cmVhbSA9PT0gXCJzdGRvdXRcIikge1xuICAgICAgICAgICAgICAgIHN0ZG91dCArPSBsb2cuZGF0YTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGRlcnIgKz0gbG9nLmRhdGE7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsb2dCdWZmZXIucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gU2FuZGJveCBtYXkgaGF2ZSBiZWVuIHN0b3BwZWQgLSBsb2dzIGVuZHBvaW50IHJldHVybnMgNDIyXG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiogbG9ncygpOiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PiB7XG4gICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICB3aGlsZSAoIXN0YXRlLmNvbnN1bWVkIHx8IGluZGV4IDwgbG9nQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgbG9nQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICB5aWVsZCBsb2dCdWZmZXJbaW5kZXgrK107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uc3VtZUxvZ3MudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaGVkID0gYXdhaXQgb3V0cHV0LndhaXQoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgICBleGl0Q29kZTogZmluaXNoZWQuZXhpdENvZGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChpc1NhbmRib3hHb25lRXJyb3IoZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiAxIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgY29tbWFuZElkOiBvdXRwdXQuY21kSWQsIGxvZ3MsIHJlc3VsdCB9O1xuICAgICAgfSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRGaWxlT25JbnN0YW5jZShcbiAgICBpbnN0YW5jZTogU2FuZGJveEluc3RhbmNlLFxuICAgIHsgcGF0aCB9OiB7IHBhdGg6IHN0cmluZyB9XG4gICk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgQnVmZmVyIHwgbnVsbD4ge1xuICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiAoKSA9PiBpbnN0YW5jZS5yZWFkRmlsZVRvQnVmZmVyKHsgcGF0aCwgY3dkOiBIT01FX0RJUiB9KSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZXNPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAgb3B0czoge1xuICAgICAgZmlsZXM6IHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIgfVtdO1xuICAgICAgZGVzdFBhdGg6IHN0cmluZztcbiAgICB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmlsZXMsIGRlc3RQYXRoIH0gPSBvcHRzO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuYXRpdmVGaWxlcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGVzdFBhdGgsIGZpbGUucGF0aCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnBvc2l4LmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICAgID8gZmlsZVBhdGhcbiAgICAgICAgOiBwYXRoLnBvc2l4LmpvaW4oSE9NRV9ESVIsIGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgICAgY29udGVudDpcbiAgICAgICAgICB0eXBlb2YgZmlsZS5jb250ZW50ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IEJ1ZmZlci5mcm9tKGZpbGUuY29udGVudClcbiAgICAgICAgICAgIDogZmlsZS5jb250ZW50LFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGF3YWl0IGluc3RhbmNlLndyaXRlRmlsZXMobmF0aXZlRmlsZXMpO1xuXG4gICAgY29uc3Qgc2hlbGxTY3JpcHRzID0gbmF0aXZlRmlsZXMuZmlsdGVyKChmKSA9PiBmLnBhdGguZW5kc1dpdGgoXCIuc2hcIikpO1xuICAgIGlmIChzaGVsbFNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2htb2RSZXN1bHQgPSBhd2FpdCBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwge1xuICAgICAgICBjb21tYW5kOiBcImNobW9kXCIsXG4gICAgICAgIGFyZ3M6IFtcIit4XCIsIC4uLnNoZWxsU2NyaXB0cy5tYXAoKGYpID0+IGYucGF0aCldLFxuICAgICAgfSk7XG4gICAgICBpZiAoY2htb2RSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBjaG1vZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNobW9kUmVzdWx0LnJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG1pbmltYWwgU2FuZGJveCB3cmFwcGVyIGFyb3VuZCBhIHJhdyBWZXJjZWwgU0RLIGluc3RhbmNlLlxuICAgKiBVc2VkIGZvciBydW5uaW5nIHNldHVwLnJ1bigpIG9uIGEgdGVtcG9yYXJ5IHNhbmRib3ggZm9yIHNuYXBzaG90IGNyZWF0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlVGVtcFNhbmRib3goaW5zdGFuY2U6IFNhbmRib3hJbnN0YW5jZSk6IFNhbmRib3gge1xuICAgIGNvbnN0IHRlbXBTYW5kYm94OiBTYW5kYm94ID0ge1xuICAgICAgaWQ6IGBfX3NldHVwX3RlbXBfJHtEYXRlLm5vdygpfWAsXG4gICAgICBjb25maWcsXG4gICAgICBleGVjOiAob3B0cykgPT4gZXhlY09uSW5zdGFuY2UoaW5zdGFuY2UsIG9wdHMpLFxuICAgICAgcmVhZEZpbGU6IChvcHRzKSA9PiByZWFkRmlsZU9uSW5zdGFuY2UoaW5zdGFuY2UsIG9wdHMpLFxuICAgICAgZ2V0RG9tYWluOiAoKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogXCJub3QgYXZhaWxhYmxlIGR1cmluZyBzZXR1cFwiIH0pXG4gICAgICAgICksXG4gICAgICBraWxsOiAoKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogXCJub3QgYXZhaWxhYmxlIGR1cmluZyBzZXR1cFwiIH0pXG4gICAgICAgICksXG4gICAgICB3cml0ZUZpbGVzOiAob3B0cykgPT4gd3JpdGVGaWxlc09uSW5zdGFuY2UoaW5zdGFuY2UsIG9wdHMpLFxuICAgICAgdXBkYXRlTmV0d29ya1BvbGljeTogKHBvbGljeSkgPT5cbiAgICAgICAgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgICB0cnk6ICgpID0+IGluc3RhbmNlLnVwZGF0ZU5ldHdvcmtQb2xpY3kocG9saWN5KSxcbiAgICAgICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICAgIH0pLFxuICAgICAgdGFnOiB7XG4gICAgICAgIGxpc3Q6IGFzeW5jICgpID0+ICh7fSkgYXMgVFRhZ3MsXG4gICAgICAgIGdldDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBzZXQ6IGFzeW5jICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgc2V0TWFueTogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiB0ZW1wU2FuZGJveDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyBmb3IgYSBzZXR1cCBzbmFwc2hvdCB0byBiZWNvbWUgYXZhaWxhYmxlLiBSZXR1cm5zIHRoZSBzbmFwc2hvdElkXG4gICAqIGlmIG9uZSBhcHBlYXJzIGJlZm9yZSB0aGUgbG9jayB0aW1lcyBvdXQsIG9yIG51bGwgaWYgaXQgZG9lc24ndC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHBvbGxGb3JTZXR1cFNuYXBzaG90KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTE9DS19USU1FT1VUX01TO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIExPQ0tfUE9MTF9JTlRFUlZBTF9NUykpO1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5nZXQoa2V5KTtcbiAgICAgIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChyZWNvcmQ/LnNuYXBzaG90SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5zbmFwc2hvdElkO1xuICAgICAgfVxuICAgICAgLy8gTG9jayByZWxlYXNlZCBidXQgbm8gc25hcHNob3QgXHUyMDE0IGNyZWF0aW9uIGZhaWxlZFxuICAgICAgaWYgKCFyZWNvcmQ/LmFjcXVpcmluZ0xvY2tJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJhY2tncm91bmQgc2FuZGJveCwgcnVucyBzZXR1cCwgc25hcHNob3RzIGl0LCBhbmQgc3RvcmVzIHRoZVxuICAgKiBzbmFwc2hvdCBJRC4gVXNlcyBhdG9taWMgbG9ja2luZyB0byBlbnN1cmUgb25seSBvbmUgcHJvY2VzcyBjcmVhdGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2UgLSBTa2lwIHRoZSBcInNuYXBzaG90IGFscmVhZHkgZXhpc3RzXCIgZWFybHkgZXhpdC4gVXNlZCB3aGVuXG4gICAqICAgdGhlIGNhbGxlciBrbm93cyB0aGUgZXhpc3Rpbmcgc25hcHNob3QgaXMgc3RhbGUvZXhwaXJlZC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNldHVwU25hcHNob3Qob3B0cz86IHtcbiAgICBmb3JjZT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXNldHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNldHVwS2V5ID0gc2V0dXAua2V5O1xuXG4gICAgLy8gQ2hlY2sgaWYgc25hcHNob3QgYWxyZWFkeSBleGlzdHMgKGZhc3QgcGF0aCBcdTIwMTQgYXZvaWRzIGxvY2sgYXR0ZW1wdClcbiAgICBpZiAoIW9wdHM/LmZvcmNlKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwS2V5KTtcbiAgICAgIGlmICghKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IpICYmIGV4aXN0aW5nPy5zbmFwc2hvdElkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdG9taWNhbGx5IGFjcXVpcmUgbG9jayAoaGFuZGxlcyBhY3RpdmUtbG9jayBkZXRlY3Rpb24gaW50ZXJuYWxseSlcbiAgICBkZWJ1ZyhgW3NhbmRib3g6c2V0dXBdIGFjcXVpcmluZyBsb2NrIGZvciBzZXR1cCBrZXkgXCIke3NldHVwS2V5fVwiYCk7XG4gICAgY29uc3QgbG9ja0lkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCBsb2NrZWQgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmFjcXVpcmVMb2NrKFxuICAgICAgc2V0dXBLZXksXG4gICAgICBsb2NrSWQsXG4gICAgICBMT0NLX1RJTUVPVVRfTVNcbiAgICApO1xuICAgIGlmIChsb2NrZWQgaW5zdGFuY2VvZiBFcnJvciB8fCAhbG9ja2VkKSB7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBsb2NrIG5vdCBhY3F1aXJlZCBmb3Iga2V5IFwiJHtzZXR1cEtleX1cIiAoYW5vdGhlciBwcm9jZXNzIGhvbGRzIGl0KWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmUtY2hlY2s6IGFub3RoZXIgd29ya2VyIG1heSBoYXZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90IGJldHdlZW4gb3VyXG4gICAgLy8gcHJlLWNoZWNrIGFuZCBsb2NrIGFjcXVpc2l0aW9uLiBJZiBzbywgc2tpcCB1bmxlc3MgZm9yY2UgKHN0YWxlIHNuYXBzaG90KS5cbiAgICBpZiAoIW9wdHM/LmZvcmNlICYmIGxvY2tlZC5zbmFwc2hvdElkKSB7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCBhbHJlYWR5IGV4aXN0cyBhZnRlciBsb2NrIGZvciBrZXkgXCIke3NldHVwS2V5fVwiLCBza2lwcGluZ2BcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRlbXBJbnN0YW5jZTogQXdhaXRlZDxcbiAgICAgIFJldHVyblR5cGU8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuY3JlYXRlPlxuICAgID4gfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHNhbmRib3ggZm9yIHNuYXBzaG90dGluZy5cbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIGNyZWF0aW5nIHRlbXAgc2FuZGJveCBmb3Igc25hcHNob3QgKGtleT1cIiR7c2V0dXBLZXl9XCIpYFxuICAgICAgKTtcbiAgICAgIHRlbXBJbnN0YW5jZSA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgcmVzb3VyY2VzOiB7IHZjcHVzIH0sXG4gICAgICAgIHRpbWVvdXQ6IFZFUkNFTF9NQVhfVElNRU9VVF9NUyxcbiAgICAgICAgcG9ydHMsXG4gICAgICAgIG5ldHdvcmtQb2xpY3ksXG4gICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBTYW5kYm94ID0gY3JlYXRlVGVtcFNhbmRib3goXG4gICAgICAgIHRlbXBJbnN0YW5jZSBhcyB1bmtub3duIGFzIFNhbmRib3hJbnN0YW5jZVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNldHVwLnJ1bih0ZW1wU2FuZGJveCk7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzZXR1cC5ydW4gY29tcGxldGUsIHNuYXBzaG90dGluZyAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0ZW1wSW5zdGFuY2Uuc25hcHNob3QoKTtcblxuICAgICAgYXdhaXQgc3RvcmFnZS5zZXR1cC5zZXQoe1xuICAgICAgICBrZXk6IHNldHVwS2V5LFxuICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICBjcmVhdGVkQXQ6IGxvY2tlZC5jcmVhdGVkQXQsXG4gICAgICAgIGxhc3RVc2VkQXQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgfSk7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCBzdG9yZWQ6ICR7c25hcHNob3Quc25hcHNob3RJZH0gKGtleT1cIiR7c2V0dXBLZXl9XCIpYFxuICAgICAgKTtcblxuICAgICAgLy8gU3RvcCB0aGUgdGVtcCBzYW5kYm94IFx1MjAxNCBubyBsb25nZXIgbmVlZGVkIGFmdGVyIHNuYXBzaG90dGluZ1xuICAgICAgYXdhaXQgdGVtcEluc3RhbmNlLnN0b3AoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gZmFpbGVkIHRvIGNyZWF0ZSBzZXR1cCBzbmFwc2hvdCAoa2V5PVwiJHtzZXR1cEtleX1cIik6YCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICAgIC8vIFN0b3AgdGhlIHRlbXAgc2FuZGJveCBvbiBmYWlsdXJlXG4gICAgICBpZiAodGVtcEluc3RhbmNlKSB7XG4gICAgICAgIGF3YWl0IHRlbXBJbnN0YW5jZS5zdG9wKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFuIHVwIGxvY2sgb24gZmFpbHVyZVxuICAgICAgYXdhaXQgc3RvcmFnZS5zZXR1cFxuICAgICAgICAuc2V0KHtcbiAgICAgICAgICBrZXk6IHNldHVwS2V5LFxuICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgY3JlYXRlZEF0OiBsb2NrZWQuY3JlYXRlZEF0LFxuICAgICAgICAgIGxhc3RVc2VkQXQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGlmIChpbml0aWFsVmVyY2VsPy5zYW5kYm94SWQgJiYgIXJlY292ZXJlZEZyb21TdGFsZSkge1xuICAgICAgcmV0dXJuIGluaXRpYWxWZXJjZWwuc2FuZGJveElkO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIC8vIFNhbmRib3ggZG9lc24ndCBleGlzdCB5ZXQsIGNvbnRpbnVlIHdpdGggY3JlYXRpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBleGlzdGluZy5tZXNzYWdlLCBjYXVzZTogZXhpc3RpbmcgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPVxuICAgICAgZXhpc3RpbmcgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvciA/IG51bGwgOiBleGlzdGluZztcbiAgICBjb25zdCBleGlzdGluZ1ZlcmNlbCA9XG4gICAgICBleGlzdGluZ1JlY29yZD8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgPyBleGlzdGluZ1JlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChleGlzdGluZ1ZlcmNlbD8uc2FuZGJveElkKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdWZXJjZWwuc2FuZGJveElkO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0FjdGl2ZUxvY2sgPVxuICAgICAgZXhpc3RpbmdSZWNvcmQ/LmFjcXVpcmluZ0xvY2tJZCAmJlxuICAgICAgZXhpc3RpbmdSZWNvcmQuYWNxdWlyaW5nTG9ja0F0ICYmXG4gICAgICBEYXRlLm5vdygpIC0gZXhpc3RpbmdSZWNvcmQuYWNxdWlyaW5nTG9ja0F0IDwgTE9DS19USU1FT1VUX01TO1xuXG4gICAgaWYgKGhhc0FjdGl2ZUxvY2spIHtcbiAgICAgIHJldHVybiBwb2xsRm9yU2FuZGJveElkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9ja0lkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGxvY2tlZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5hY3F1aXJlTG9jayhcbiAgICAgIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdGFnczogZXhpc3RpbmdSZWNvcmQ/LnRhZ3MgPz8gc2FuZGJveFJlY29yZC50YWdzLFxuICAgICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nUmVjb3JkPy5jcmVhdGVkQXQgPz8gc2FuZGJveFJlY29yZC5jcmVhdGVkQXQsXG4gICAgICAgIGxhc3RBY3Rpdml0eUF0OlxuICAgICAgICAgIGV4aXN0aW5nUmVjb3JkPy5sYXN0QWN0aXZpdHlBdCA/PyBzYW5kYm94UmVjb3JkLmxhc3RBY3Rpdml0eUF0LFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IGxvY2tJZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBub3csXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDpcbiAgICAgICAgICAgIGV4aXN0aW5nVmVyY2VsPy5zbmFwc2hvdElkID8/IGluaXRpYWxWZXJjZWw/LnNuYXBzaG90SWQgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBMT0NLX1RJTUVPVVRfTVNcbiAgICApO1xuXG4gICAgaWYgKGxvY2tlZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogbG9ja2VkLm1lc3NhZ2UsIGNhdXNlOiBsb2NrZWQgfSk7XG4gICAgfVxuICAgIGlmICghbG9ja2VkKSB7XG4gICAgICByZXR1cm4gcG9sbEZvclNhbmRib3hJZCgpO1xuICAgIH1cblxuICAgIC8vIENhcHR1cmUgdGhlIGxvY2tlZCByZWNvcmQgZm9yIHVzZSBpbiB0aGUgcmVsZWFzZSBoZWxwZXIuXG4gICAgLy8gVFMgY2FuJ3QgbmFycm93IGBsb2NrZWRgIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb25zLCBzbyB3ZSBiaW5kIGl0IGhlcmUuXG4gICAgY29uc3QgbG9ja2VkUmVjb3JkID0gbG9ja2VkO1xuXG4gICAgLy8gUmVsZWFzZSB0aGUgc2FuZGJveCBsb2NrIHNvIG90aGVyIHdvcmtlcnMgY2FuIHJldHJ5IHF1aWNrbHlcbiAgICAvLyBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGxvY2sgdGltZW91dC5cbiAgICBhc3luYyBmdW5jdGlvbiByZWxlYXNlU2FuZGJveExvY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3hcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgLi4ubG9ja2VkUmVjb3JkLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIFJlLWNoZWNrIGFmdGVyIGxvY2s6IGFub3RoZXIgd29ya2VyIG1heSBoYXZlIGNyZWF0ZWQgdGhlIHNhbmRib3hcbiAgICAvLyBiZXR3ZWVuIG91ciBpbml0aWFsIGNoZWNrIGFuZCBsb2NrIGFjcXVpc2l0aW9uLlxuICAgIGNvbnN0IGxvY2tlZFZlcmNlbCA9XG4gICAgICBsb2NrZWRSZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgPyBsb2NrZWRSZWNvcmQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKGxvY2tlZFZlcmNlbD8uc2FuZGJveElkKSB7XG4gICAgICBhd2FpdCByZWxlYXNlU2FuZGJveExvY2soKTtcbiAgICAgIHJldHVybiBsb2NrZWRWZXJjZWwuc2FuZGJveElkO1xuICAgIH1cblxuICAgIGNvbnN0IHNuYXBzaG90SWQgPVxuICAgICAgbG9ja2VkVmVyY2VsPy5zbmFwc2hvdElkID8/XG4gICAgICBpbml0aWFsVmVyY2VsPy5zbmFwc2hvdElkID8/XG4gICAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdElkO1xuICAgIGlmIChzbmFwc2hvdElkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KHNuYXBzaG90SWQpO1xuICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBzZXR1cCBzbmFwc2hvdFxuICAgIGlmIChzZXR1cCkge1xuICAgICAgbGV0IGZvcmNlUmVjcmVhdGVTbmFwc2hvdCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dXBSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cC5rZXkpO1xuICAgICAgaWYgKCEoc2V0dXBSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikgJiYgc2V0dXBSZWNvcmQpIHtcbiAgICAgICAgaWYgKHNldHVwUmVjb3JkLnNuYXBzaG90SWQpIHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gZm91bmQgc2V0dXAgc25hcHNob3QgJHtzZXR1cFJlY29yZC5zbmFwc2hvdElkfSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KFxuICAgICAgICAgICAgc2V0dXBSZWNvcmQuc25hcHNob3RJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXN0VXNlZEF0IChmaXJlLWFuZC1mb3JnZXQpXG4gICAgICAgICAgICBzdG9yYWdlLnNldHVwXG4gICAgICAgICAgICAgIC5zZXQoe1xuICAgICAgICAgICAgICAgIC4uLnNldHVwUmVjb3JkLFxuICAgICAgICAgICAgICAgIGxhc3RVc2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU25hcHNob3QgaXMgc3RhbGUvZXhwaXJlZCBcdTIwMTQgZm9yY2UgYmFja2dyb3VuZCB0byBvdmVyd3JpdGUgaXRcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc25hcHNob3QgJHtzZXR1cFJlY29yZC5zbmFwc2hvdElkfSBmYWlsZWQgKGV4cGlyZWQ/KSwgd2lsbCByZWNyZWF0ZWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcmNlUmVjcmVhdGVTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICAgICAgc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0F0ICYmXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIHNldHVwUmVjb3JkLmFjcXVpcmluZ0xvY2tBdCA8IExPQ0tfVElNRU9VVF9NU1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBBbm90aGVyIHByb2Nlc3MgaXMgY3JlYXRpbmcgdGhlIHNldHVwIHNuYXBzaG90IFx1MjAxNCB3YWl0IGZvciBpdFxuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCBpbiBwcm9ncmVzcyBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHdhaXRpbmcuLi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzbmFwc2hvdElkID0gYXdhaXQgcG9sbEZvclNldHVwU25hcHNob3Qoc2V0dXAua2V5KTtcbiAgICAgICAgICBpZiAoc25hcHNob3RJZCkge1xuICAgICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc25hcHNob3QgcmVhZHk6ICR7c25hcHNob3RJZH0gZm9yIGtleSBcIiR7c2V0dXAua2V5fVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3Qoc25hcHNob3RJZCk7XG4gICAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdCA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFBvbGwgZmFpbGVkIG9yIHNuYXBzaG90IGNyZWF0aW9uIGZhaWxlZCBcdTIwMTQgZmFsbCB0aHJvdWdoIHRvIGNvbGQgcGF0aFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBObyBzZXR1cCBzbmFwc2hvdCBhdmFpbGFibGUgXHUyMDE0IGNyZWF0ZSBmcmVzaCBhbmQgcnVuIHNldHVwIGxhdGVyLlxuICAgICAgLy8gS2ljayBvZmYgYmFja2dyb3VuZCBzbmFwc2hvdCBpbW1lZGlhdGVseSBzbyBpdCBydW5zIGluIHBhcmFsbGVsXG4gICAgICAvLyB3aXRoIHNldHVwLnJ1biBvbiB0aGUgc2Vzc2lvbiBzYW5kYm94LlxuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gbm8gc25hcHNob3QgZm9yIGtleSBcIiR7c2V0dXAua2V5fVwiLCB3aWxsIHJ1biBzZXR1cCBvbiB0aGlzIHNhbmRib3hgXG4gICAgICApO1xuICAgICAgbmVlZHNTZXR1cFJ1biA9IHRydWU7XG4gICAgICBjcmVhdGVTZXR1cFNuYXBzaG90KHsgZm9yY2U6IGZvcmNlUmVjcmVhdGVTbmFwc2hvdCB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiW3NhbmRib3g6c2V0dXBdIGZhaWxlZCB0byBjcmVhdGUgYmFja2dyb3VuZCBzbmFwc2hvdDpcIixcbiAgICAgICAgICBlXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmcmVzaFJlc3VsdCA9IGF3YWl0IGNyZWF0ZUZyZXNoU2FuZGJveCgpO1xuICAgIGlmIChmcmVzaFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhd2FpdCByZWxlYXNlU2FuZGJveExvY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyZXNoUmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjcmVhdGVQcm9taXNlcy5nZXQoaWQpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGNyZWF0ZVByb21pc2VzLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gICAgY3JlYXRlUHJvbWlzZXMuc2V0KGlkLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvR2V0U2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4ge1xuICAgIGNvbnN0IHZlcmNlbFNhbmRib3hJZCA9IGF3YWl0IGdldE9yQ3JlYXRlU2FuZGJveElkKCk7XG4gICAgaWYgKHZlcmNlbFNhbmRib3hJZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gdmVyY2VsU2FuZGJveElkO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiAoKSA9PlxuICAgICAgICBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgICAgc2FuZGJveElkOiB2ZXJjZWxTYW5kYm94SWQsXG4gICAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICAgIH0pLFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4ge1xuICAgIGlmICghc2FuZGJveFByb21pc2UpIHtcbiAgICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG4gICAgfVxuICAgIHJldHVybiBzYW5kYm94UHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJGcm9tU3RhbGVTYW5kYm94KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHNhbmRib3hQcm9taXNlID0gbnVsbDtcbiAgICByZWNvdmVyZWRGcm9tU3RhbGUgPSB0cnVlO1xuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1ZlcmNlbCA9XG4gICAgICBleGlzdGluZy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGV4aXN0aW5nVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICAgIGNvbmZpZzogZXhpc3RpbmcuY29uZmlnLFxuICAgICAgICB0YWdzOiBleGlzdGluZy50YWdzLFxuICAgICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IGV4aXN0aW5nLmxhc3RBY3Rpdml0eUF0LFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOiBleGlzdGluZ1ZlcmNlbC5zbmFwc2hvdElkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGFzdEFjdGl2aXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbGFzdFNlbnQgPSBsYXN0QWN0aXZpdHlTZW50LmdldChpZCk7XG4gICAgaWYgKGxhc3RTZW50ICYmIG5vdyAtIGxhc3RTZW50IDwgQUNUSVZJVFlfVEhST1RUTEVfTVMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFjdGl2aXR5U2VudC5zZXQoaWQsIG5vdyk7XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yIHx8ICFleGlzdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ1ZlcmNlbCA9XG4gICAgICBleGlzdGluZy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgaWQ6IGV4aXN0aW5nLmlkLFxuICAgICAgY29uZmlnOiBleGlzdGluZy5jb25maWcsXG4gICAgICB0YWdzOiBleGlzdGluZy50YWdzLFxuICAgICAgY3JlYXRlZEF0OiBleGlzdGluZy5jcmVhdGVkQXQsXG4gICAgICBsYXN0QWN0aXZpdHlBdDogbm93LFxuICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YTogZXhpc3RpbmdWZXJjZWwgPz8ge1xuICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGxpZmVjeWNsZTogU2FuZGJveExpZmVjeWNsZSA9IHtcbiAgICBzdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICBhd2FpdCB1cGRhdGVMYXN0QWN0aXZpdHkoKTtcbiAgICAgIHJldHVybiBzYW5kYm94LnN0YXR1cyBhcyBTYW5kYm94U3RhdHVzO1xuICAgIH0sXG5cbiAgICBzbmFwc2hvdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB0YWdzOiBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yID8gbnVsbCA6IChleGlzdGluZz8udGFncyA/PyBudWxsKSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDpcbiAgICAgICAgICAgICAgZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciA/IG51bGwgOiAoZXhpc3Rpbmc/LmNyZWF0ZWRBdCA/PyBudWxsKSxcbiAgICAgICAgICAgIGxhc3RBY3Rpdml0eUF0OlxuICAgICAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiAoZXhpc3Rpbmc/Lmxhc3RBY3Rpdml0eUF0ID8/IG51bGwpLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkIH07XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBzdG9wOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3guc3RvcCgpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgICAgIGlkOiBleGlzdGluZy5pZCxcbiAgICAgICAgICAgIGNvbmZpZzogZXhpc3RpbmcuY29uZmlnLFxuICAgICAgICAgICAgdGFnczogZXhpc3RpbmcudGFncyxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0LFxuICAgICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IGV4aXN0aW5nLmxhc3RBY3Rpdml0eUF0LFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0U3RhdHVzOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzYW5kYm94LnN0YXR1cyBhcyBTYW5kYm94U3RhdHVzO1xuICAgIH0sXG5cbiAgICBnZXRDcmVhdGVkQXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3guY3JlYXRlZEF0O1xuICAgIH0sXG5cbiAgICBnZXRSZW1haW5pbmdUaW1lb3V0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzYW5kYm94LnRpbWVvdXQ7XG4gICAgfSxcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBkb0V4ZWMob3B0czoge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBhcmdzPzogc3RyaW5nW107XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZVByb21pc2UgPSB1cGRhdGVMYXN0QWN0aXZpdHkoKTtcbiAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgZXhlY09uSW5zdGFuY2UoaW5zdGFuY2UsIG9wdHMpO1xuICAgIGF3YWl0IHVwZGF0ZVByb21pc2U7XG4gICAgcmV0dXJuIGV4ZWNSZXN1bHQ7XG4gIH1cblxuICBjb25zdCBzYW5kYm94OiBTYW5kYm94PFRUYWdzPiAmIHtcbiAgICBfb25SZWFkeT86IFByb21pc2U8dm9pZD47XG4gICAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG4gIH0gPSB7XG4gICAgaWQsXG4gICAgY29uZmlnLFxuICAgIGV4ZWM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkb0V4ZWMob3B0cyk7XG5cbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBTYW5kYm94RXJyb3IgJiYgaXNTYW5kYm94R29uZUVycm9yKHJlc3VsdC5jYXVzZSkpIHtcbiAgICAgICAgYXdhaXQgcmVjb3ZlckZyb21TdGFsZVNhbmRib3goKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRvRXhlYyhvcHRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgZ2V0RG9tYWluOiBhc3luYyAocG9ydCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94LmRvbWFpbihwb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGtpbGw6IGFzeW5jICh7IGNvbW1hbmRJZCwgc3RvcmFnZTogY21kU3RvcmFnZSB9KSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY21kID0gYXdhaXQgY21kU3RvcmFnZS5jb21tYW5kLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKGNtZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBjbWQubWVzc2FnZSwgY2F1c2U6IGNtZCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbWQgJiYgY21kLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY21kU3RvcmFnZS5jb21tYW5kLnNldCh7XG4gICAgICAgICAgLi4uY21kLFxuICAgICAgICAgIHN0YXR1czogXCJraWxsZWRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZXN1bHQubWVzc2FnZSwgY2F1c2U6IHJlc3VsdCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgcmVhZEZpbGU6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWFkRmlsZU9uSW5zdGFuY2UoaW5zdGFuY2UsIG9wdHMpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpbGVzOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBpbnN0YW5jZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cml0ZUZpbGVzT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgfSxcblxuICAgIGxpZmVjeWNsZSxcblxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6IGFzeW5jIChwb2xpY3kpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogKCkgPT4gaW5zdGFuY2UudXBkYXRlTmV0d29ya1BvbGljeShwb2xpY3kpLFxuICAgICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgdGFnOiB7XG4gICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoc2FuZGJveFJlY29yZC50YWdzID8/IHt9KSBhcyBUVGFncztcbiAgICAgIH0sXG4gICAgICBnZXQ6IGFzeW5jIChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuZGJveFJlY29yZC50YWdzPy5ba2V5IGFzIHN0cmluZ10gYXNcbiAgICAgICAgICB8IFRUYWdzW3R5cGVvZiBrZXldXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IGlkLFxuICAgICAgICAgIHRhZ3M6IHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IGlkLFxuICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgbGV0IG9uUmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIGxldCBzZXR1cE1ldGFQcm9taXNlOiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+ID0gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICBuZWVkc1NldHVwUnVuOiBmYWxzZSxcbiAgICBjcmVhdGVkRnJvbVNuYXBzaG90OiBmYWxzZSxcbiAgfSk7XG5cbiAgaWYgKGNvbmZpZy5saWZlY3ljbGU/LmF1dG9TdGFydCAhPT0gZmFsc2UpIHtcbiAgICBzYW5kYm94UHJvbWlzZSA9IGRvR2V0U2FuZGJveCgpO1xuXG4gICAgLy8gUmVzb2x2ZSBzZXR1cCBtZXRhZGF0YSBhcyBzb29uIGFzIHRoZSBzYW5kYm94IGluc3RhbmNlIGlzIHJlYWR5XG4gICAgLy8gKGJlZm9yZSBfb25SZWFkeSBydW5zIHNldHVwKS4gVGhlIHdvcmtmbG93IHJlYWRzIHRoaXMgdG8gY2hvb3NlIHRoZSBzdGF0dXMgaW5kaWNhdG9yLlxuICAgIHNldHVwTWV0YVByb21pc2UgPSBzYW5kYm94UHJvbWlzZS50aGVuKCgpID0+ICh7XG4gICAgICBuZWVkc1NldHVwUnVuLFxuICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdCxcbiAgICB9KSk7XG5cbiAgICAvLyBBZnRlciBzYW5kYm94IGluc3RhbmNlIGlzIHJlYWR5LCBydW4gc2V0dXAgYW5kL29yIG9uUmVzdGFydC5cbiAgICAvLyBzYW5kYm94UHJvbWlzZSBpcyBhbHJlYWR5IHJlc29sdmVkIGJ5IHRoZSB0aW1lIC50aGVuKCkgcnVucyxcbiAgICAvLyBzbyBzZXR1cC5ydW4gLyBvblJlc3RhcnQgY2FsbGluZyBzYW5kYm94LmV4ZWMoKSB3b24ndCBkZWFkbG9jay5cbiAgICBvblJlYWR5UHJvbWlzZSA9IHNhbmRib3hQcm9taXNlLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChuZWVkc1NldHVwUnVuICYmIHNldHVwKSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gcnVubmluZyBzZXR1cC5ydW4gb24gc2Vzc2lvbiBzYW5kYm94IChrZXk9XCIke3NldHVwLmtleX1cIilgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHNldHVwLnJ1bihzYW5kYm94KTtcbiAgICAgICAgZGVidWcoXCJbc2FuZGJveDpzZXR1cF0gc2V0dXAucnVuIGNvbXBsZXRlIG9uIHNlc3Npb24gc2FuZGJveFwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNyZWF0ZWRGcm9tU25hcHNob3QgJiYgb25SZXN0YXJ0KSB7XG4gICAgICAgIGRlYnVnKFwiW3NhbmRib3g6c2V0dXBdIHJ1bm5pbmcgb25SZXN0YXJ0IChjcmVhdGVkIGZyb20gc25hcHNob3QpXCIpO1xuICAgICAgICBhd2FpdCBvblJlc3RhcnQoc2FuZGJveCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzYW5kYm94Ll9vblJlYWR5ID0gb25SZWFkeVByb21pc2U7XG4gIHNhbmRib3guX3NldHVwTWV0YSA9IHNldHVwTWV0YVByb21pc2U7XG4gIHJldHVybiBzYW5kYm94O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IFRhZ3NTY2hlbWEgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB0eXBlIHsgUnBjRm4sIFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UsIFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tIFwiLi4vdXRpbHMvZGVidWdcIjtcbmltcG9ydCB7IGxvY2FsU2FuZGJveCB9IGZyb20gXCIuL2JpbmRpbmdzL2xvY2FsXCI7XG5pbXBvcnQgeyB2ZXJjZWxTYW5kYm94IH0gZnJvbSBcIi4vYmluZGluZ3MvdmVyY2VsXCI7XG5pbXBvcnQgdHlwZSB7IE9uUmVzdGFydCwgU2FuZGJveCwgU2FuZGJveFNldHVwIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCBob3cgdGhlIHNhbmRib3ggd2FzIHNldCB1cC5cbiAqIFVzZWQgYnkgdGhlIHdvcmtmbG93IHRvIGVtaXQgdGhlIGNvcnJlY3Qgc3RhdHVzIGluZGljYXRvci5cbiAqIFJldHVybmVkIGFzIGEgcHJvbWlzZSBiZWNhdXNlIHRoZSBtZXRhZGF0YSBpcyBkZXRlcm1pbmVkIGFzeW5jaHJvbm91c2x5XG4gKiBkdXJpbmcgc2FuZGJveCBjcmVhdGlvbiwgYmVmb3JlIF9vblJlYWR5IHJ1bnMgc2V0dXAuXG4gKi9cbmV4cG9ydCB0eXBlIFNhbmRib3hTZXR1cE1ldGEgPSB7XG4gIC8qKiBXaGV0aGVyIHNldHVwLnJ1bigpIG5lZWRzIHRvIGV4ZWN1dGUgKGNvbGQgc3RhcnQsIG5vIHNuYXBzaG90KS4gKi9cbiAgbmVlZHNTZXR1cFJ1bjogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHNhbmRib3ggd2FzIGNyZWF0ZWQgZnJvbSBhIHNuYXBzaG90LiAqL1xuICBjcmVhdGVkRnJvbVNuYXBzaG90OiBib29sZWFuO1xufTtcblxudHlwZSBTYW5kYm94V2l0aE1ldGE8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4gPSBTYW5kYm94PFRUYWdzPiAmIHtcbiAgX29uUmVhZHk/OiBQcm9taXNlPHZvaWQ+O1xuICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbn07XG5cbi8qKlxuICogTW9kdWxlLWxldmVsIGNhY2hlIGZvciBzYW5kYm94IGluc3RhbmNlcyBrZXllZCBieSBzYW5kYm94IHJlY29yZCBJRC5cbiAqXG4gKiBDYWNoZXMgYWxsIHNhbmRib3ggaW5zdGFuY2VzIHNvIHRoYXQgdGhlIHdvcmtmbG93ICh3aGljaCBjYWxscyBnZXRTYW5kYm94XG4gKiB3aXRob3V0IHNldHVwL29uUmVzdGFydCkgcmV1c2VzIHRoZSBzYW1lIGluc3RhbmNlIGNyZWF0ZWQgZHVyaW5nIHNlc3Npb24oKSxcbiAqIGluY2x1ZGluZyBpdHMgX29uUmVhZHkgcHJvbWlzZSBhbmQgc2V0dXAgbWV0YWRhdGEuXG4gKi9cbmNvbnN0IHNhbmRib3hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBTYW5kYm94V2l0aE1ldGE+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW5kYm94PFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgc3RvcmFnZSxcbiAgcnBjLFxuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyA9IHRydWUsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHJwYz86IFJwY0ZuO1xuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdz86IGJvb2xlYW47XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveFdpdGhNZXRhPFRUYWdzPiB7XG4gIGNvbnN0IGNhY2hlZCA9IHNhbmRib3hDYWNoZS5nZXQoc2FuZGJveFJlY29yZC5pZCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBkZWJ1ZyhcIltnZXRTYW5kYm94XSBjYWNoZSBoaXQgZm9yXCIsIHNhbmRib3hSZWNvcmQuaWQpO1xuICAgIHJldHVybiBjYWNoZWQgYXMgU2FuZGJveFdpdGhNZXRhPFRUYWdzPjtcbiAgfVxuXG4gIGNvbnN0IHNieCA9IGNyZWF0ZVNhbmRib3g8VFRhZ3M+KHtcbiAgICBzYW5kYm94UmVjb3JkLFxuICAgIHN0b3JhZ2VDb25maWcsXG4gICAgc3RvcmFnZSxcbiAgICBycGMsXG4gICAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3csXG4gICAgc2V0dXAsXG4gICAgb25SZXN0YXJ0LFxuICB9KTtcblxuICBzYW5kYm94Q2FjaGUuc2V0KHNhbmRib3hSZWNvcmQuaWQsIHNieCBhcyBTYW5kYm94V2l0aE1ldGEpO1xuXG4gIHJldHVybiBzYng7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBzdG9yYWdlLFxuICBycGMsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93ID0gdHJ1ZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjPzogUnBjRm47XG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93PzogYm9vbGVhbjtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+IHtcbiAgbGV0IHNieDogU2FuZGJveFdpdGhNZXRhPFRUYWdzPjtcblxuICBzd2l0Y2ggKHNhbmRib3hSZWNvcmQuY29uZmlnLnR5cGUpIHtcbiAgICBjYXNlIFwibG9jYWxcIjpcbiAgICAgIHNieCA9IGxvY2FsU2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQgJiB7XG4gICAgICAgICAgY29uZmlnOiB7IHR5cGU6IFwibG9jYWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBzZXR1cCxcbiAgICAgICAgb25SZXN0YXJ0LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidmVyY2VsXCI6XG4gICAgICBzYnggPSB2ZXJjZWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJ2ZXJjZWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBycGM6IHJwYyEsXG4gICAgICAgIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93LFxuICAgICAgICBzZXR1cCxcbiAgICAgICAgb25SZXN0YXJ0LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY3VzdG9tXCI6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDdXN0b20gc2FuZGJveGVzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzYW5kYm94UmVjb3JkLmNvbmZpZyBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHNhbmRib3ggdHlwZTogJHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IC5cbiAgICAgICAgICAoc2FuZGJveFJlY29yZC5jb25maWcgYXMgYW55KS50eXBlXG4gICAgICAgIH1gXG4gICAgICApO1xuICB9XG5cbiAgLy8gRG9uJ3QgYXdhaXQgX29uUmVhZHkgaGVyZSBcdTIwMTQgbGV0IHRoZSB3b3JrZmxvdyBhd2FpdCBpdCBzbyBpdCBjYW4gZW1pdFxuICAvLyBzdGF0dXMgaW5kaWNhdG9ycyBvdmVyIHRoZSBzdHJlYW0gd2hpbGUgc2V0dXAgcnVucy5cbiAgLy8gSW5zdGVhZCwgd3JhcCBzYW5kYm94IG1ldGhvZHMgc28gYW55IG9wZXJhdGlvbiBvbiB0aGUgc2FuZGJveCBpbXBsaWNpdGx5XG4gIC8vIHdhaXRzIGZvciBzZXR1cCB0byBjb21wbGV0ZS4gV2UgcmV0dXJuIGEgTkVXIG9iamVjdCBzbyB0aGF0IHNldHVwLnJ1bigpLFxuICAvLyB3aGljaCBob2xkcyB0aGUgb3JpZ2luYWwgYHNieGAgdmlhIGNsb3N1cmUsIGNhbGxzIHVud3JhcHBlZCBtZXRob2RzIGFuZFxuICAvLyBhdm9pZHMgYSBkZWFkbG9jay5cbiAgaWYgKCFzYnguX29uUmVhZHkpIHtcbiAgICByZXR1cm4gc2J4O1xuICB9XG5cbiAgY29uc3Qgb25SZWFkeSA9IHNieC5fb25SZWFkeTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zYngsXG4gICAgZXhlYzogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LmV4ZWMob3B0cyk7XG4gICAgfSxcbiAgICBnZXREb21haW46IGFzeW5jIChwb3J0KSA9PiB7XG4gICAgICBhd2FpdCBvblJlYWR5O1xuICAgICAgcmV0dXJuIHNieC5nZXREb21haW4ocG9ydCk7XG4gICAgfSxcbiAgICByZWFkRmlsZTogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LnJlYWRGaWxlKG9wdHMpO1xuICAgIH0sXG4gICAgd3JpdGVGaWxlczogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LndyaXRlRmlsZXMob3B0cyk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB0eXBlIHtcbiAgRXhlY1Jlc3VsdCxcbiAgTG9nRW50cnksXG4gIE9uUmVzdGFydCxcbiAgU2FuZGJveCxcbiAgU2FuZGJveExpZmVjeWNsZSxcbiAgU2FuZGJveExpZmVjeWNsZUlucHV0LFxuICBTYW5kYm94U2V0dXAsXG4gIFNhbmRib3hTdGF0dXMsXG4gIFRlcm1pbmFsLFxuICBUZXJtaW5hbE1ldGFkYXRhLFxuICBWZXJjZWxTYW5kYm94TGlmZWN5Y2xlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImNvbnN0IFZFUkNFTF9TVE9SQUdFX1VSTCA9XG4gIHByb2Nlc3MuZW52LkFHRU5UX1ZFUkNFTF9TVE9SQUdFX1VSTCA/P1xuICBcImh0dHBzOi8vYWdlbnQtc2RrLXN0b3JhZ2UtbmluZS5sYWJzLnZlcmNlbC5kZXYvYXBpL3N0b3JhZ2VcIjtcblxuZXhwb3J0IHR5cGUgVmVyY2VsU3RvcmFnZUNvbmZpZyA9IHtcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VmVyY2VsU3RvcmFnZUNvbmZpZygpOiBQcm9taXNlPFZlcmNlbFN0b3JhZ2VDb25maWc+IHtcbiAgbGV0IHRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IHsgZ2V0VmVyY2VsT2lkY1Rva2VuIH0gPSBhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL29pZGNcIik7XG4gICAgdG9rZW4gPSBhd2FpdCBnZXRWZXJjZWxPaWRjVG9rZW4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gT0lEQyBub3QgYXZhaWxhYmxlIChsb2NhbCBkZXYsIG5vbi1WZXJjZWwgZW52aXJvbm1lbnQpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVybDogVkVSQ0VMX1NUT1JBR0VfVVJMLFxuICAgIGhlYWRlcnM6IHRva2VuID8geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9IDoge30sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXN0UmVzdWx0IH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfT4ob3B0czoge1xuICBpdGVtczogVFtdO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGxpbWl0PzogbnVtYmVyO1xufSk6IExpc3RSZXN1bHQ8VD4ge1xuICBjb25zdCB7IGl0ZW1zLCBjdXJzb3IsIGxpbWl0IH0gPSBvcHRzO1xuICBjb25zdCBzdGFydEluZGV4ID0gY3Vyc29yID8gaXRlbXMuZmluZEluZGV4KChtKSA9PiBtLmlkID09PSBjdXJzb3IpICsgMSA6IDA7XG4gIGNvbnN0IHNsaWNlZCA9XG4gICAgbGltaXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBpdGVtcy5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgbGltaXQpXG4gICAgICA6IGl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgpO1xuICBjb25zdCBuZXh0Q3Vyc29yID1cbiAgICBsaW1pdCAhPT0gdW5kZWZpbmVkICYmIHN0YXJ0SW5kZXggKyBsaW1pdCA8IGl0ZW1zLmxlbmd0aFxuICAgICAgPyAoc2xpY2VkLmF0KC0xKT8uaWQgPz8gbnVsbClcbiAgICAgIDogbnVsbDtcbiAgcmV0dXJuIHsgaXRlbXM6IHNsaWNlZCwgbmV4dEN1cnNvciB9O1xufVxuIiwgImltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCByZWFkRmlsZSwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBwYWdpbmF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wYWdpbmF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBIYW5kbGVycyxcbiAgTWVzc2FnZSxcbiAgUGFydCxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU2V0dXBTbmFwc2hvdCxcbn0gZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoYmFzZVBhdGg6IHN0cmluZyk6IEhhbmRsZXJzIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShiYXNlUGF0aCk7XG4gIGNvbnN0IHNlc3Npb25EaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzZXNzaW9uXCIpO1xuICBjb25zdCBtZXNzYWdlRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwibWVzc2FnZVwiKTtcbiAgY29uc3QgcGFydERpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcInBhcnRcIik7XG4gIGNvbnN0IHNhbmRib3hEaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzYW5kYm94XCIpO1xuICBjb25zdCBjb21tYW5kRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwiY29tbWFuZFwiKTtcbiAgY29uc3Qgc2V0dXBEaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzZXR1cFwiKTtcblxuICBhc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZEpzb248VD4oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdyaXRlSnNvbkZpbGUoZmlsZVBhdGg6IHN0cmluZywgZGF0YTogdW5rbm93bikge1xuICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKGZpbGVQYXRoKSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWFkQWxsRnJvbURpcjxUPihkaXI6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihkaXIpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlc1xuICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIuanNvblwiKSlcbiAgICAgICAgICAubWFwKChmKSA9PiByZWFkSnNvbjxUPihqb2luKGRpciwgZikpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigocik6IHIgaXMgTm9uTnVsbGFibGU8dHlwZW9mIHI+ID0+IHIgIT09IG51bGwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7aWR9Lmpzb25gKTtcbiAgICAgIHJldHVybiAoYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uc2V0XCI6IGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc2Vzc2lvblBhdGggPSBqb2luKHNlc3Npb25EaXIsIGAke3Nlc3Npb24uaWR9Lmpzb25gKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpO1xuICAgICAgY29uc3QgbmV3U2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgdGFnczogc2Vzc2lvbi50YWdzID8/IGV4aXN0aW5nPy50YWdzID8/IHt9LFxuICAgICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nPy5jcmVhdGVkQXQgPz8gc2Vzc2lvbi5jcmVhdGVkQXQgPz8gbm93LFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgIH07XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNlc3Npb25QYXRoLCBuZXdTZXNzaW9uKTtcbiAgICAgIHJldHVybiBuZXdTZXNzaW9uO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uZGVsZXRlXCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHVubGluayhqb2luKHNlc3Npb25EaXIsIGAke2lkfS5qc29uYCkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZSBpZiBmaWxlIGRvZXNuJ3QgZXhpc3RcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbE1lc3NhZ2VzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICBjb25zdCBzZXNzaW9uTWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0uc2Vzc2lvbklkID09PSBpZCk7XG4gICAgICBjb25zdCBhbGxQYXJ0cyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFBhcnQ+KHBhcnREaXIpO1xuICAgICAgY29uc3Qgc2Vzc2lvblBhcnRzID0gYWxsUGFydHMuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gaWQpO1xuICAgICAgY29uc3QgYWxsQ29tbWFuZHMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxDb21tYW5kPihjb21tYW5kRGlyKTtcbiAgICAgIGNvbnN0IHNlc3Npb25Db21tYW5kcyA9IGFsbENvbW1hbmRzLmZpbHRlcigoYykgPT4gYy5zZXNzaW9uSWQgPT09IGlkKTtcbiAgICAgIGNvbnN0IG5vb3AgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIC4uLnNlc3Npb25NZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgdW5saW5rKGpvaW4obWVzc2FnZURpciwgYCR7bS5pZH0uanNvbmApKS5jYXRjaChub29wKVxuICAgICAgICApLFxuICAgICAgICAuLi5zZXNzaW9uUGFydHMubWFwKChwKSA9PlxuICAgICAgICAgIHVubGluayhqb2luKHBhcnREaXIsIGAke3AuaWR9Lmpzb25gKSkuY2F0Y2gobm9vcClcbiAgICAgICAgKSxcbiAgICAgICAgLi4uc2Vzc2lvbkNvbW1hbmRzLm1hcCgoYykgPT5cbiAgICAgICAgICB1bmxpbmsoam9pbihjb21tYW5kRGlyLCBgJHtjLmlkfS5qc29uYCkpLmNhdGNoKG5vb3ApXG4gICAgICAgICksXG4gICAgICBdKTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLmxpc3RcIjogYXN5bmMgKHsgdGFncywgb3JkZXIsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2Vzc2lvbnMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTZXNzaW9uPihzZXNzaW9uRGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNlc3Npb25zO1xuICAgICAgaWYgKHRhZ3MgJiYgT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb25UYWdzID0gcy50YWdzID8/IHt9O1xuICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgZXF1YWwoc2Vzc2lvblRhZ3Nba2V5XSwgdmFsdWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlZE9yZGVyID0gb3JkZXIgPz8gXCJ1cGRhdGVkQXRfZGVzY1wiO1xuICAgICAgY29uc3Qgc29ydEZpZWxkID0gcmVzb2x2ZWRPcmRlci5zdGFydHNXaXRoKFwidXBkYXRlZEF0XCIpXG4gICAgICAgID8gXCJ1cGRhdGVkQXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gcmVzb2x2ZWRPcmRlci5lbmRzV2l0aChcIl9kZXNjXCIpID8gLTEgOiAxO1xuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gc29ydERpciAqIChhW3NvcnRGaWVsZF0gLSBiW3NvcnRGaWVsZF0pKTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLmxpc3RCeVNhbmRib3hcIjogYXN5bmMgKHtcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIHRhZ3MsXG4gICAgICBvcmRlcixcbiAgICAgIGN1cnNvcixcbiAgICAgIGxpbWl0LFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFNlc3Npb25zID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8U2Vzc2lvbj4oc2Vzc2lvbkRpcik7XG4gICAgICBsZXQgZmlsdGVyZWQgPSBhbGxTZXNzaW9ucy5maWx0ZXIoKHMpID0+IHMuc2FuZGJveElkID09PSBzYW5kYm94SWQpO1xuICAgICAgaWYgKHRhZ3MgJiYgT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb25UYWdzID0gcy50YWdzID8/IHt9O1xuICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgZXF1YWwoc2Vzc2lvblRhZ3Nba2V5XSwgdmFsdWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlZE9yZGVyID0gb3JkZXIgPz8gXCJ1cGRhdGVkQXRfZGVzY1wiO1xuICAgICAgY29uc3Qgc29ydEZpZWxkID0gcmVzb2x2ZWRPcmRlci5zdGFydHNXaXRoKFwidXBkYXRlZEF0XCIpXG4gICAgICAgID8gXCJ1cGRhdGVkQXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gcmVzb2x2ZWRPcmRlci5lbmRzV2l0aChcIl9kZXNjXCIpID8gLTEgOiAxO1xuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gc29ydERpciAqIChhW3NvcnRGaWVsZF0gLSBiW3NvcnRGaWVsZF0pKTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLnRhZy5zZXRcIjogYXN5bmMgKHsgc2Vzc2lvbklkLCB0YWdzIH0pID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25QYXRoID0gam9pbihzZXNzaW9uRGlyLCBgJHtzZXNzaW9uSWR9Lmpzb25gKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpO1xuICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gJHtzZXNzaW9uSWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZXhpc3RpbmcudGFncywgLi4udGFncyB9O1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRTZXNzaW9uOiBTZXNzaW9uID0ge1xuICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgdGFnczogbWVyZ2VkVGFncyxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICB9O1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzZXNzaW9uUGF0aCwgdXBkYXRlZFNlc3Npb24pO1xuICAgICAgcmV0dXJuIHVwZGF0ZWRTZXNzaW9uO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UuZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZWFkSnNvbjxNZXNzYWdlPihqb2luKG1lc3NhZ2VEaXIsIGAke2lkfS5qc29uYCkpO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2Uuc2V0XCI6IGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4obWVzc2FnZURpciwgYCR7bWVzc2FnZS5pZH0uanNvbmApLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UubGlzdFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsTWVzc2FnZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxNZXNzYWdlPihtZXNzYWdlRGlyKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gYWxsTWVzc2FnZXNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gbS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuY3JlYXRlZEF0IC0gYi5jcmVhdGVkQXQpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInBhcnQubGlzdEJ5TWVzc2FnZVwiOiBhc3luYyAoeyBtZXNzYWdlSWQsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsUGFydHMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxQYXJ0PihwYXJ0RGlyKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gYWxsUGFydHNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5tZXNzYWdlSWQgPT09IG1lc3NhZ2VJZClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjogYXN5bmMgKHsgc2Vzc2lvbklkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8UGFydD4ocGFydERpcik7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbFBhcnRzXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgaWYgKGEubWVzc2FnZUlkICE9PSBiLm1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGEubWVzc2FnZUlkLmxvY2FsZUNvbXBhcmUoYi5tZXNzYWdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInBhcnQuc2V0XCI6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4ocGFydERpciwgYCR7cGFydC5pZH0uanNvbmApLCBwYXJ0KTtcbiAgICAgIHJldHVybiBwYXJ0O1xuICAgIH0sXG5cbiAgICBcInBhcnQuZGVsZXRlXCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHVubGluayhqb2luKHBhcnREaXIsIGAke2lkfS5qc29uYCkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBpZiBmaWxlIGRvZXNuJ3QgZXhpc3RcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldFwiOiBhc3luYyAoeyBrZXkgfSkgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgY29uc3Qgc2FuZGJveFBhdGggPSBqb2luKHNhbmRib3hEaXIsIGAke3NhZmVOYW1lfS5qc29uYCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oc2FuZGJveFBhdGgpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5zZXRcIjogYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShyZWNvcmQuaWQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgY29uc3Qgc2FuZGJveFBhdGggPSBqb2luKHNhbmRib3hEaXIsIGAke3NhZmVOYW1lfS5qc29uYCk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hQYXRoKTtcbiAgICAgIGNvbnN0IG5ld1JlY29yZDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICB0YWdzOiByZWNvcmQudGFncyA/PyBleGlzdGluZz8udGFncyA/PyBudWxsLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoc2FuZGJveFBhdGgsIG5ld1JlY29yZCk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5saXN0XCI6IGFzeW5jICh7IHRhZ3MsIG9yZGVyLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFNhbmRib3hlcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hEaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsU2FuZGJveGVzO1xuICAgICAgaWYgKHRhZ3MgJiYgT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNhbmRib3hUYWdzID0gcy50YWdzID8/IHt9O1xuICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgZXF1YWwoc2FuZGJveFRhZ3Nba2V5XSwgdmFsdWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzb3J0RmllbGQgPSBvcmRlcj8uc3RhcnRzV2l0aChcImxhc3RBY3Rpdml0eUF0XCIpXG4gICAgICAgID8gXCJsYXN0QWN0aXZpdHlBdFwiXG4gICAgICAgIDogXCJjcmVhdGVkQXRcIjtcbiAgICAgIGNvbnN0IHNvcnREaXIgPSBvcmRlcj8uZW5kc1dpdGgoXCJfZGVzY1wiKSA/IC0xIDogMTtcbiAgICAgIGZpbHRlcmVkLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBzb3J0RGlyICogKChhW3NvcnRGaWVsZF0gPz8gMCkgLSAoYltzb3J0RmllbGRdID8/IDApKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LnRhZy5zZXRcIjogYXN5bmMgKHsgc2FuZGJveElkLCB0YWdzIH0pID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20oc2FuZGJveElkKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihzYW5kYm94UGF0aCk7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2FuZGJveCAke3NhbmRib3hJZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXJnZWRUYWdzID0geyAuLi5leGlzdGluZy50YWdzLCAuLi50YWdzIH07XG4gICAgICBjb25zdCB1cGRhdGVkU2FuZGJveDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgIHRhZ3M6IG1lcmdlZFRhZ3MsXG4gICAgICB9O1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzYW5kYm94UGF0aCwgdXBkYXRlZFNhbmRib3gpO1xuICAgICAgcmV0dXJuIHVwZGF0ZWRTYW5kYm94O1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guZ2V0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTYW5kYm94ZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTYW5kYm94UmVjb3JkPihzYW5kYm94RGlyKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nID0gYWxsU2FuZGJveGVzLmZpbHRlcigocykgPT5cbiAgICAgICAgcy5pZC5zdGFydHNXaXRoKGAke3Nlc3Npb25JZH0tYClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbWF0Y2hpbmcuc29ydChcbiAgICAgICAgKGEsIGIpID0+IChiLmxhc3RBY3Rpdml0eUF0ID8/IDApIC0gKGEubGFzdEFjdGl2aXR5QXQgPz8gMClcbiAgICAgICk7XG4gICAgICByZXR1cm4gbWF0Y2hpbmdbMF07XG4gICAgfSxcblxuICAgIFwiY29tbWFuZC5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlYWRKc29uPENvbW1hbmQ+KGpvaW4oY29tbWFuZERpciwgYCR7aWR9Lmpzb25gKSk7XG4gICAgfSxcblxuICAgIFwiY29tbWFuZC5zZXRcIjogYXN5bmMgKGNvbW1hbmQpID0+IHtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoam9pbihjb21tYW5kRGlyLCBgJHtjb21tYW5kLmlkfS5qc29uYCksIGNvbW1hbmQpO1xuICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgfSxcblxuICAgIFwic2V0dXAuZ2V0XCI6IGFzeW5jICh7IGtleSB9KSA9PiB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICByZXR1cm4gYXdhaXQgcmVhZEpzb248U2V0dXBTbmFwc2hvdD4oam9pbihzZXR1cERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKSk7XG4gICAgfSxcblxuICAgIFwic2V0dXAuc2V0XCI6IGFzeW5jIChzbmFwc2hvdCkgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShzbmFwc2hvdC5rZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShqb2luKHNldHVwRGlyLCBgJHtzYWZlTmFtZX0uanNvbmApLCBzbmFwc2hvdCk7XG4gICAgfSxcblxuICAgIFwic2V0dXAuYWNxdWlyZUxvY2tcIjogYXN5bmMgKHsga2V5LCBsb2NrSWQsIGxvY2tUaW1lb3V0TXMgfSkgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHNldHVwRGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTZXR1cFNuYXBzaG90PihmaWxlUGF0aCk7XG4gICAgICBpZiAoXG4gICAgICAgIGV4aXN0aW5nPy5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgICAgZXhpc3RpbmcuYWNxdWlyaW5nTG9ja0F0ICYmXG4gICAgICAgIERhdGUubm93KCkgLSBleGlzdGluZy5hY3F1aXJpbmdMb2NrQXQgPCBsb2NrVGltZW91dE1zXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIGFjdGl2ZSBsb2NrIGhlbGQgYnkgc29tZW9uZSBlbHNlXG4gICAgICB9XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc25hcHNob3Q6IFNldHVwU25hcHNob3QgPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgc25hcHNob3RJZDogZXhpc3Rpbmc/LnNuYXBzaG90SWQgPz8gbnVsbCxcbiAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZz8uY3JlYXRlZEF0ID8/IG5vdyxcbiAgICAgICAgbGFzdFVzZWRBdDogZXhpc3Rpbmc/Lmxhc3RVc2VkQXQgPz8gbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBsb2NrSWQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbm93LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoZmlsZVBhdGgsIHNuYXBzaG90KTtcbiAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmFjcXVpcmVMb2NrXCI6IGFzeW5jICh7IHJlY29yZCwgbG9ja1RpbWVvdXRNcyB9KSA9PiB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHJlY29yZC5pZCkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oc2FuZGJveERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oZmlsZVBhdGgpO1xuICAgICAgaWYgKFxuICAgICAgICBleGlzdGluZz8uYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICAgIGV4aXN0aW5nLmFjcXVpcmluZ0xvY2tBdCAmJlxuICAgICAgICBEYXRlLm5vdygpIC0gZXhpc3RpbmcuYWNxdWlyaW5nTG9ja0F0IDwgbG9ja1RpbWVvdXRNc1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBhY3RpdmUgbG9jayBoZWxkIGJ5IHNvbWVvbmUgZWxzZVxuICAgICAgfVxuICAgICAgY29uc3QgbmV3UmVjb3JkOiBTYW5kYm94UmVjb3JkID0ge1xuICAgICAgICAuLi5yZWNvcmQsXG4gICAgICAgIHRhZ3M6IHJlY29yZC50YWdzID8/IGV4aXN0aW5nPy50YWdzID8/IG51bGwsXG4gICAgICB9O1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShmaWxlUGF0aCwgbmV3UmVjb3JkKTtcbiAgICAgIHJldHVybiBuZXdSZWNvcmQ7XG4gICAgfSxcblxuICAgIFwiY29tbWFuZC5saXN0XCI6IGFzeW5jICh7IHNlc3Npb25JZCwgaW5jbHVkZUZpbmlzaGVkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbENvbW1hbmRzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8Q29tbWFuZD4oY29tbWFuZERpcik7XG4gICAgICBsZXQgZmlsdGVyZWQgPSBhbGxDb21tYW5kcy5maWx0ZXIoKGMpID0+IGMuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgICAgaWYgKCFpbmNsdWRlRmluaXNoZWQpIHtcbiAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKGMpID0+IGMuc3RhdHVzID09PSBcInJ1bm5pbmdcIik7XG4gICAgICB9XG4gICAgICBmaWx0ZXJlZC5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0ZWRBdCAtIGIuc3RhcnRlZEF0KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuICB9O1xufVxuIiwgImV4cG9ydCB7XG4gIHR5cGUgQWdlbnREYXRhVHlwZXMsXG4gIHR5cGUgQWdlbnRPcHRpb25zLFxuICB0eXBlIEFnZW50U3RhdHVzLFxuICB0eXBlIEFnZW50U3RyZWFtLFxuICBhZ2VudCxcbiAgdHlwZSBJbmZlclVJTWVzc2FnZSxcbiAgdHlwZSBScGNQYXlsb2FkLFxuICB0eXBlIFJwY1Jlc3VsdCxcbiAgdHlwZSBTZW5kSW5wdXQsXG4gIHR5cGUgU2Vzc2lvbk9wdGlvbnMsXG4gIHR5cGUgVGFnc1NjaGVtYSxcbn0gZnJvbSBcIi4vY2xpZW50XCI7XG5leHBvcnQge1xuICBNZXNzYWdlTm90Rm91bmRFcnJvcixcbiAgU2FuZGJveEVycm9yLFxuICBTYW5kYm94Tm90Rm91bmRFcnJvcixcbiAgU2Vzc2lvbk5vdEZvdW5kRXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmVyYXRpb25PcHRpb25zIH0gZnJvbSBcIi4vZ2VuZXJhdGlvblwiO1xuZXhwb3J0IHR5cGUgeyBFeGVjUmVzdWx0LCBPblJlc3RhcnQsIFNhbmRib3gsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuL3NhbmRib3hcIjtcbmV4cG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5LCBVcGxvYWRhYmxlRmlsZSB9IGZyb20gXCIuL3NraWxscy90eXBlc1wiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICB0eXBlIE1lc3NhZ2UsXG4gIHR5cGUgTWVzc2FnZVVzYWdlLFxuICB0eXBlIFBhcnQsXG4gIHR5cGUgUmVzb2x2ZWRTdG9yYWdlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgU2FuZGJveENvbmZpZyxcbiAgdHlwZSBTYW5kYm94UmVjb3JkLFxuICB0eXBlIFNlc3Npb24sXG4gIHR5cGUgU3RlcFVzYWdlLFxuICB0eXBlIFN0b3JhZ2VDb25maWcsXG4gIHR5cGUgVXNhZ2VTdW1tYXJ5LFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQge1xuICB0eXBlIEJ1aWx0SW5Ub29sTmFtZSxcbiAgYnVpbHRpblRvb2xOYW1lcyxcbiAgdHlwZSBUb29sQ29udGV4dCxcbn0gZnJvbSBcIi4vdG9vbHNcIjtcbiIsICJpbXBvcnQgeyBnZXRWZXJjZWxPaWRjVG9rZW5TeW5jIH0gZnJvbSBcIkB2ZXJjZWwvb2lkY1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlVUlNZXNzYWdlU3RyZWFtLFxuICB0eXBlIEdhdGV3YXlNb2RlbElkLFxuICB0eXBlIEluZmVyVG9vbElucHV0LFxuICB0eXBlIEluZmVyVUlUb29scyxcbiAgdHlwZSBNb2RlbE1lc3NhZ2UsXG4gIHR5cGUgVG9vbFNldCxcbiAgdHlwZSBVSU1lc3NhZ2UsXG4gIHR5cGUgVUlNZXNzYWdlQ2h1bmssXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgYWxsIH0gZnJvbSBcImJldHRlci1hbGxcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyBnZXRSdW4sIHN0YXJ0IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBZ2VudElucHV0LFxuICB0eXBlIEFnZW50TWVzc2FnZUlucHV0LFxuICBhZ2VudE1lc3NhZ2VIb29rLFxuICBhZ2VudFdvcmtmbG93LFxuICBhcHByb3ZhbEhvb2ssXG59IGZyb20gXCIuL2FnZW50LXdvcmtmbG93XCI7XG5pbXBvcnQge1xuICBTYW5kYm94Tm90Rm91bmRFcnJvcixcbiAgU2Vzc2lvbkVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRpb25PcHRpb25zIH0gZnJvbSBcIi4vZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaXNwYXRjaENvbnRleHQsXG4gIGRpc3BhdGNoLFxuICB0eXBlIEhvb2tTdGF0dXNQYXJhbXMsXG4gIHR5cGUgSG9va1N0YXR1c1Jlc3VsdCxcbiAgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zLFxuICB0eXBlIEhvb2tUb29sQWZ0ZXJSZXN1bHQsXG4gIHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMsXG4gIHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQsXG4gIHR5cGUgVG9vbE1ldGFkYXRhLFxuICB0eXBlIFRvb2xzRXhlY3V0ZVBhcmFtcyxcbiAgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMsXG4gIHR5cGUgVG9vbHNOZWVkc0FwcHJvdmFsUmVzdWx0LFxufSBmcm9tIFwiLi9ycGMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9zYW5kYm94XCI7XG5pbXBvcnQgdHlwZSB7IE9uUmVzdGFydCwgU2FuZGJveFNldHVwIH0gZnJvbSBcIi4vc2FuZGJveC90eXBlc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplU2tpbGxzRGlycyB9IGZyb20gXCIuL3NraWxscy9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxzRGlyIH0gZnJvbSBcIi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIFN0b3JhZ2UgYXMgQWdlbnRTdG9yYWdlLFxuICBERUZBVUxUX05BTUVTUEFDRSxcbiAgZ2V0U3RvcmFnZSxcbiAgTE9DQUxfU1RPUkFHRV9WRVJTSU9OLFxuICB0eXBlIE1lc3NhZ2UsXG4gIHR5cGUgUGFydCxcbiAgdHlwZSBTYW5kYm94Q29uZmlnLFxuICB0eXBlIFNlc3Npb24sXG4gIHR5cGUgU3RvcmFnZUNvbmZpZyxcbiAgdHlwZSBIYW5kbGVycyBhcyBTdG9yYWdlSGFuZGxlcnMsXG4gIHR5cGUgU3RvcmFnZU1ldGhvZHMsXG4gIHR5cGUgVHlwZWRTdG9yYWdlLFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgYnVpbHRJblRvb2xzLCB0eXBlIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7IHRvTWVzc2FnZUFuZFBhcnRzIH0gZnJvbSBcIi4vdXRpbHMvbWVzc2FnZVwiO1xuaW1wb3J0IHsgYXNzZW1ibGVVSU1lc3NhZ2VzIH0gZnJvbSBcIi4vdXRpbHMvdWlcIjtcbmltcG9ydCB7IGNvbXB1dGVTZXNzaW9uVXNhZ2UsIHR5cGUgU2Vzc2lvblVzYWdlIH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcblxuZXhwb3J0IHR5cGUgU2VuZElucHV0ID1cbiAgfCBzdHJpbmdcbiAgfCB7IHJvbGU/OiBVSU1lc3NhZ2VbXCJyb2xlXCJdOyBwYXJ0czogVUlNZXNzYWdlW1wicGFydHNcIl07IGlkPzogc3RyaW5nIH07XG5cbi8qKlxuICogVHJhbnNpZW50IHN0YXR1cyBpbmRpY2F0b3JzIGVtaXR0ZWQgb3ZlciB0aGUgc3RyZWFtIGR1cmluZyBsb25nLXJ1bm5pbmcgcGhhc2VzLlxuICogRGVsaXZlcmVkIHRvIHRoZSBjbGllbnQgYXMgYGRhdGEtc3RhdHVzYCBjaHVua3Mgd2l0aCBgdHJhbnNpZW50OiB0cnVlYCBcdTIwMTQgbm90IHBlcnNpc3RlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRTdGF0dXMgPVxuICB8IHsgdHlwZTogXCJzYW5kYm94LXNldHVwXCIgfVxuICB8IHsgdHlwZTogXCJzYW5kYm94LXNldHVwLWNvbGRcIiB9XG4gIHwgeyB0eXBlOiBcImxvYWRpbmctc2tpbGxzXCIgfVxuICB8IHsgdHlwZTogXCJwcm9jZXNzaW5nLWFwcHJvdmFsc1wiIH1cbiAgfCB7IHR5cGU6IFwibmVlZHMtYXBwcm92YWxcIiB9XG4gIHwgeyB0eXBlOiBcInRoaW5raW5nXCIgfVxuICB8IHsgdHlwZTogXCJjdXN0b21cIjsgc3RhdHVzOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBBdWdtZW50ZWQgYFJlYWRhYmxlU3RyZWFtYCByZXR1cm5lZCBieSBgc2Vzc2lvbi5zdHJlYW0oKWAuXG4gKiBQYXNzZXMgYGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1gIGFuZCB3b3JrcyB3aXRoIGBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7IHN0cmVhbSB9KWAuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50U3RyZWFtID0gUmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+ICYge1xuICAvKiogV3JpdGUgYSB0eXBlZCBzdGF0dXMgdXBkYXRlIHRvIHRoZSBzdHJlYW0gKHRyYW5zaWVudCwgbm90IHBlcnNpc3RlZCkuICovXG4gIHdyaXRlU3RhdHVzOiAoc3RhdHVzOiBBZ2VudFN0YXR1cykgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogRGF0YSBwYXJ0IHR5cGVzIGVtaXR0ZWQgYnkgZXZlcnkgYWdlbnQgb3ZlciB0aGUgc3RyZWFtLlxuICogVXNlZCBhcyB0aGUgYERBVEFfUEFSVFNgIGdlbmVyaWMgZm9yIGBVSU1lc3NhZ2VgLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudERhdGFUeXBlcyA9IHsgc3RhdHVzOiBBZ2VudFN0YXR1cyB9O1xuXG4vKipcbiAqIEluZmVyIGEgdHlwZWQgVUlNZXNzYWdlIGZyb20gYW4gYWdlbnQgaW5zdGFuY2UuXG4gKiBUb29sIHBhcnRzIGFyZSBkaXNjcmltaW5hdGVkIGJ5IGB0eXBlOiBcInRvb2wtJHtuYW1lfVwiYCB3aXRoIHR5cGVkIGlucHV0L291dHB1dC5cbiAqIERhdGEgcGFydHMgaW5jbHVkZSBgZGF0YS1zdGF0dXNgIHdpdGggdHlwZWQgYEFnZW50U3RhdHVzYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG15QWdlbnQgPSBhZ2VudCh7IHRvb2xzOiB7IG15VG9vbDogdG9vbCh7Li4ufSkgfSB9KTtcbiAqIHR5cGUgTXlNZXNzYWdlID0gdHlwZW9mIG15QWdlbnQuJFVJTWVzc2FnZTtcbiAqIC8vIE15TWVzc2FnZS5wYXJ0cyBpbmNsdWRlcyB7IHR5cGU6IFwidG9vbC1teVRvb2xcIjsgaW5wdXQ6IE15SW5wdXQ7IG91dHB1dDogTXlPdXRwdXQ7IC4uLiB9XG4gKiAvLyBvbkRhdGEgY2FsbGJhY2sgcmVjZWl2ZXMgeyB0eXBlOiBcImRhdGEtc3RhdHVzXCI7IGRhdGE6IEFnZW50U3RhdHVzIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBJbmZlclVJTWVzc2FnZTxBPiA9IEEgZXh0ZW5kcyB7IHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldCB9XG4gID8gVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gIDogVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzPjtcblxudHlwZSBUb29sTmFtZTxUb29scz4gPSBFeHRyYWN0PGtleW9mIFRvb2xzLCBzdHJpbmc+IHwgQnVpbHRJblRvb2xOYW1lO1xuXG50eXBlIFRvb2xJbnB1dDxUb29scywgSz4gPSBLIGV4dGVuZHMgQnVpbHRJblRvb2xOYW1lXG4gID8gSW5mZXJUb29sSW5wdXQ8KHR5cGVvZiBidWlsdEluVG9vbHMpW0tdPlxuICA6IEsgZXh0ZW5kcyBrZXlvZiBUb29sc1xuICAgID8gVG9vbHNbS10gZXh0ZW5kcyBpbXBvcnQoXCJhaVwiKS5Ub29sXG4gICAgICA/IEluZmVyVG9vbElucHV0PFRvb2xzW0tdPlxuICAgICAgOiB1bmtub3duXG4gICAgOiB1bmtub3duO1xuXG5leHBvcnQgdHlwZSBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPiA9IHtcbiAgW0sgaW4gVG9vbE5hbWU8VG9vbHM+XT86XG4gICAgfCBib29sZWFuXG4gICAgfCAoKFxuICAgICAgICBpbnB1dDogVG9vbElucHV0PFRvb2xzLCBLPixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICAgICAgICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVua25vd247XG4gICAgICAgIH1cbiAgICAgICkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pO1xufTtcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2FuIGJlIHNldCBwZXItc2Vzc2lvbiwgb3ZlcnJpZGluZyBhZ2VudC1sZXZlbCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IHR5cGUgU2Vzc2lvbk9wdGlvbnM8XG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4gPSB7XG4gIC8qKiBUaGUgQUkgbW9kZWwgdG8gdXNlLiAqL1xuICBtb2RlbD86IEdhdGV3YXlNb2RlbElkO1xuICAvKiogU3lzdGVtIHByb21wdCBmb3IgdGhlIEFJIG1vZGVsLiAqL1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIC8qKiBTYW5kYm94IGNvbmZpZ3VyYXRpb24gb3IgSUQuIElmIHN0cmluZywgdXNlcyBhcyBzYW5kYm94IElEIHdpdGggaXRzIGNvbmZpZy4gKi9cbiAgc2FuZGJveD86XG4gICAgfCAoU2FuZGJveENvbmZpZyAmIHsgc2V0dXA/OiBTYW5kYm94U2V0dXA7IG9uUmVzdGFydD86IE9uUmVzdGFydCB9KVxuICAgIHwgc3RyaW5nO1xuICAvKiogS2V5LXZhbHVlIG1ldGFkYXRhIHRhZ3MgZm9yIHRoZSBzZXNzaW9uLiAqL1xuICB0YWdzPzogVFRhZ3M7XG4gIC8qKiBEaXJlY3RvcnkgY29udGFpbmluZyBza2lsbCBkZWZpbml0aW9ucyBmb3IgdGhlIGFnZW50LiAqL1xuICBza2lsbHNEaXI/OiBTa2lsbHNEaXI7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiB0b29scyB0byBhY3RpdmF0ZSBmb3IgdGhpcyBzZXNzaW9uLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWdlbnQtbGV2ZWwgdG9vbHMgYXJlIGFjdGl2ZS5cbiAgICogVXNlIHRoaXMgdG8gcmVzdHJpY3Qgd2hpY2ggdG9vbHMgYXJlIGF2YWlsYWJsZSBwZXItc2Vzc2lvbi5cbiAgICovXG4gIGFjdGl2ZVRvb2xzPzogKEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWUpW107XG4gIC8qKiBHZW5lcmF0aW9uIG9wdGlvbnMgKHRlbXBlcmF0dXJlLCBtYXhTdGVwcywgZXRjLikuIE92ZXJyaWRlcyBhZ2VudC1sZXZlbCBkZWZhdWx0cy4gKi9cbiAgZ2VuZXJhdGlvbj86IEdlbmVyYXRpb25PcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgU2Vzc2lvblVwZGF0ZU9wdGlvbnM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9IFBpY2s8XG4gIFNlc3Npb25PcHRpb25zPFRvb2xzPixcbiAgXCJtb2RlbFwiIHwgXCJzeXN0ZW1cIiB8IFwic2tpbGxzRGlyXCIgfCBcImFjdGl2ZVRvb2xzXCIgfCBcImdlbmVyYXRpb25cIlxuPjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGFnZW50IGluc3RhbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgbXlBZ2VudCA9IGFnZW50KHtcbiAqICAgbW9kZWw6IFwiYW50aHJvcGljL2NsYXVkZS1vcHVzLTQuNVwiLFxuICogICBzeXN0ZW06IFwiWW91IGFyZSBhIGhlbHBmdWwgYXNzaXN0YW50Li4uXCIsXG4gKiAgIHRhZ3NTY2hlbWE6IHoub2JqZWN0KHsgdXNlcklkOiB6LnN0cmluZygpIH0pLFxuICogICBjb250ZXh0U2NoZW1hOiB6Lm9iamVjdCh7IGF1dGhUb2tlbjogei5zdHJpbmcoKSB9KSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50T3B0aW9uczxcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0LFxuICBUVGFncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuICBUQ29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPiA9IHtcbiAgLyoqXG4gICAqIEFnZW50IG5hbWUuIFVzZWQgdG8gaXNvbGF0ZSBzdG9yYWdlIGRhdGEgLSBkaWZmZXJlbnQgbmFtZXMgaGF2ZSBzZXBhcmF0ZSBkYXRhLlxuICAgKiBAZGVmYXVsdCBcImRlZmF1bHRcIlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JhZ2UgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiAtIGB7IHR5cGU6IFwibG9jYWxcIiB9YCAtIGZpbGVzeXN0ZW0gc3RvcmFnZSAoZGV2KVxuICAgKiAtIGB7IHR5cGU6IFwidmVyY2VsXCIgfWAgLSBWZXJjZWwgbWFuYWdlZCBzdG9yYWdlIChwcm9kKVxuICAgKiAtIGB7IHR5cGU6IFwiY3VzdG9tXCIsIHVybDogXCIuLi5cIiB9YCAtIGN1c3RvbSBIVFRQIGJhY2tlbmRcbiAgICogQGRlZmF1bHQgSW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudDogYHsgdHlwZTogXCJ2ZXJjZWxcIiB9YCB3aGVuIGBWRVJDRUxfT0lEQ19UT0tFTmAgaXMgc2V0LCBgeyB0eXBlOiBcImxvY2FsXCIgfWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RvcmFnZT86IFN0b3JhZ2VDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gdG9vbHMgYXZhaWxhYmxlIHRvIHRoZSBhZ2VudC5cbiAgICogVGhlc2UgYXJlIGV4cG9zZWQgdmlhIHRoZSBSUEMgaGFuZGxlciBhbmQgY2FsbGVkIG92ZXIgSFRUUC5cbiAgICovXG4gIHRvb2xzPzogVG9vbHM7XG4gIC8qKlxuICAgKiBIb29rcyBmb3IgaW50ZXJjZXB0aW5nIGFnZW50IG9wZXJhdGlvbnMuXG4gICAqL1xuICBob29rcz86IEFnZW50SG9va3M7XG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHNlc3Npb24gdGFncy4gQWxsIHNlc3Npb25zIHNoYXJlIHRoaXMgc2NoZW1hLlxuICAgKiBUYWdzIGFyZSBwZXJzaXN0ZWQgaW4gc3RvcmFnZSBhbmQgc3Vydml2ZSBhY3Jvc3MgcmVxdWVzdHMuXG4gICAqL1xuICB0YWdzU2NoZW1hPzogei5ab2RUeXBlPFRUYWdzPjtcbiAgLyoqXG4gICAqIFNjaGVtYSBmb3IgdHJhbnNpZW50IHRvb2wgY29udGV4dC4gUGFzc2VkIHBlci1yZXF1ZXN0IHZpYSBzZW5kKCkuXG4gICAqIE5PVCBwZXJzaXN0ZWQgLSB1c2UgZm9yIHNlY3JldHMgbGlrZSBhdXRoIHRva2Vucy5cbiAgICovXG4gIGNvbnRleHRTY2hlbWE/OiB6LlpvZFR5cGU8VENvbnRleHQ+O1xuICAvKipcbiAgICogQXBwcm92YWwgcnVsZXMgZm9yIHRvb2xzIHlvdSBkb24ndCBvd24gKGJ1aWx0LWluIG9yIHRoaXJkLXBhcnR5KS5cbiAgICogTWFwcyB0b29sIG5hbWVzIHRvIGEgYm9vbGVhbiBvciBhIGZ1bmN0aW9uIHRoYXQgZGVjaWRlcyB3aGV0aGVyIHRvIGFzay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbmVlZHNBcHByb3ZhbDoge1xuICAgKiAgIEJhc2g6IChpbnB1dCkgPT4gaW5wdXQuY29tbWFuZC5zdGFydHNXaXRoKFwicm1cIiksXG4gICAqICAgV3JpdGU6IHRydWUsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBuZWVkc0FwcHJvdmFsPzogTmVlZHNBcHByb3ZhbE1hcDxUb29scz47XG4gIC8qKlxuICAgKiBTYW5kYm94IGNvbmZpZ3VyYXRpb24gd2l0aCBvcHRpb25hbCBzZXR1cCBhbmQgcmVzdGFydCBob29rcy5cbiAgICpcbiAgICogLSBgc2V0dXAua2V5YDogZXhwbGljaXQgc3RyaW5nIHRvIGNvbnRyb2wgc25hcHNob3QgaW52YWxpZGF0aW9uIChidW1wIHRvIHJlLXJ1bilcbiAgICogLSBgc2V0dXAucnVuYDogYXN5bmMgZnVuY3Rpb24gdGhhdCBydW5zIG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgc2FuZGJveCwgdGhlbiBnZXRzIHNuYXBzaG90dGVkXG4gICAqIC0gYG9uUmVzdGFydGA6IGFzeW5jIGZ1bmN0aW9uIHRoYXQgcnVucyBldmVyeSB0aW1lIGEgc2FuZGJveCByZXN1bWVzIGZyb20gYSBzbmFwc2hvdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBzYW5kYm94OiB7XG4gICAqICAgdHlwZTogXCJ2ZXJjZWxcIixcbiAgICogICBzZXR1cDoge1xuICAgKiAgICAga2V5OiBcImRldi1lbnYtdjNcIixcbiAgICogICAgIHJ1bjogYXN5bmMgKHNhbmRib3gpID0+IHtcbiAgICogICAgICAgYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJucG1cIiwgYXJnczogW1wiaVwiLCBcIi1nXCIsIFwidmVyY2VsXCJdIH0pXG4gICAqICAgICB9LFxuICAgKiAgIH0sXG4gICAqICAgb25SZXN0YXJ0OiBhc3luYyAoc2FuZGJveCkgPT4ge1xuICAgKiAgICAgYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJiYXNoXCIsIGFyZ3M6IFtcIi1jXCIsIFwibnBtIHJ1biBkZXYgJlwiXSB9KVxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzYW5kYm94PzpcbiAgICB8IChTYW5kYm94Q29uZmlnICYgeyBzZXR1cD86IFNhbmRib3hTZXR1cDsgb25SZXN0YXJ0PzogT25SZXN0YXJ0IH0pXG4gICAgfCBzdHJpbmc7XG59ICYgT21pdDxTZXNzaW9uT3B0aW9uczxUb29scywgVFRhZ3M+LCBcInRhZ3NcIiB8IFwic2FuZGJveFwiPjtcblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIHNlc3Npb24vc2FuZGJveCB0YWdzLiBVc2VkIGZvciBnZW5lcmljIGNvbnN0cmFpbnRzLlxuICogRm9yIGFnZW50LWxldmVsIHRhZyB2YWxpZGF0aW9uLCB1c2UgYHRhZ3NTY2hlbWFgIG9wdGlvbiB3aXRoIGEgem9kIHNjaGVtYS5cbiAqL1xuZXhwb3J0IHR5cGUgVGFnc1NjaGVtYSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRIb29rcyA9IHtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSB0b29sIGlzIGV4ZWN1dGVkLiBDYW4gbW9kaWZ5IGlucHV0IG9yIHRocm93IHRvIGJsb2NrLiAqL1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIGFmdGVyIGEgdG9vbCBpcyBleGVjdXRlZC4gQ2FuIG1vZGlmeSByZXN1bHQuICovXG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFnZW50IGVtaXRzIGEgdHJhbnNpZW50IHN0YXR1cyBpbmRpY2F0b3IuICovXG4gIHN0YXR1cz86IChzdGF0dXM6IEFnZW50U3RhdHVzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8qKlxuICogUlBDIHJlcXVlc3QgYm9keSBmb3IgYWdlbnQgaGFuZGxlci5cbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gb24gYG1ldGhvZGAgZm9yIHR5cGUtc2FmZSBwYXJhbXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjUmVxdWVzdCA9IHtcbiAgW0sgaW4ga2V5b2YgQWdlbnRScGNNZXRob2RzXToge1xuICAgIG1ldGhvZDogSztcbiAgICBwYXJhbXM6IEFnZW50UnBjTWV0aG9kc1tLXVtcInBhcmFtc1wiXTtcbiAgfTtcbn1ba2V5b2YgQWdlbnRScGNNZXRob2RzXTtcblxuLyoqXG4gKiBSUEMgcmVzcG9uc2UgdHlwZSBmb3IgZGlzcGF0Y2guXG4gKi9cbmV4cG9ydCB0eXBlIFJwY1Jlc3VsdDxUID0gdW5rbm93bj4gPVxuICB8IHsgcmVzdWx0OiBUIH1cbiAgfCB7IGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07IHN0YXR1cz86IG51bWJlciB9O1xuXG4vKipcbiAqIERpcmVjdCBSUEMgcGF5bG9hZCBmb3Igc3RlcCBmdW5jdGlvbiBjYWxscyAobm8gSFRUUCkuXG4gKi9cbmV4cG9ydCB0eXBlIFJwY1BheWxvYWQgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59O1xuXG4vKipcbiAqIEFsbCBSUEMgbWV0aG9kcyBhdmFpbGFibGUgb24gdGhlIGFnZW50IGhhbmRsZXIuXG4gKiBDb21iaW5lcyB0b29scyBtZXRob2RzLCBob29rcywgYW5kIHN0b3JhZ2UgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRScGNNZXRob2RzID0ge1xuICBcInRvb2xzLmxpc3RcIjogeyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPjsgcmVzdWx0OiBUb29sTWV0YWRhdGFbXSB9O1xuICBcInRvb2xzLmV4ZWN1dGVcIjogeyBwYXJhbXM6IFRvb2xzRXhlY3V0ZVBhcmFtczsgcmVzdWx0OiB1bmtub3duIH07XG4gIFwidG9vbHMubmVlZHNBcHByb3ZhbFwiOiB7XG4gICAgcGFyYW1zOiBUb29sc05lZWRzQXBwcm92YWxQYXJhbXM7XG4gICAgcmVzdWx0OiBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQ7XG4gIH07XG4gIFwiaG9vay50b29sLmJlZm9yZVwiOiB7XG4gICAgcGFyYW1zOiBIb29rVG9vbEJlZm9yZVBhcmFtcztcbiAgICByZXN1bHQ6IEhvb2tUb29sQmVmb3JlUmVzdWx0O1xuICB9O1xuICBcImhvb2sudG9vbC5hZnRlclwiOiB7XG4gICAgcGFyYW1zOiBIb29rVG9vbEFmdGVyUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1Rvb2xBZnRlclJlc3VsdDtcbiAgfTtcbiAgXCJob29rLnN0YXR1c1wiOiB7XG4gICAgcGFyYW1zOiBIb29rU3RhdHVzUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1N0YXR1c1Jlc3VsdDtcbiAgfTtcbn0gJiBTdG9yYWdlTWV0aG9kcztcblxuZXhwb3J0IHR5cGUgQWdlbnRScGNNZXRob2ROYW1lID0ga2V5b2YgQWdlbnRScGNNZXRob2RzO1xuXG4vKipcbiAqIFJlc3VsdCB0eXBlIGZvciBSUEMgb3ZlcnJpZGUgaGFuZGxlcnMuXG4gKiAtIGB7IG9rOiB0cnVlOyByZXN1bHQ6IFQgfWAgLSByZXR1cm4gdGhpcyByZXN1bHRcbiAqIC0gYHsgb2s6IGZhbHNlOyBlcnJvcjogc3RyaW5nIH1gIC0gcmV0dXJuIHRoaXMgZXJyb3JcbiAqIC0gYG51bGxgIC0gdXNlIGRlZmF1bHQgaGFuZGxlclxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY1Jlc3VsdDxUPiA9XG4gIHwgeyBvazogdHJ1ZTsgcmVzdWx0OiBUIH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHN0cmluZyB9XG4gIHwgbnVsbDtcblxuLyoqXG4gKiBPdmVycmlkZSBoYW5kbGVycyBmb3IgYWdlbnQgUlBDIG1ldGhvZHMuXG4gKiBFYWNoIG1ldGhvZCBjYW4gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4uXG4gKiBSZXR1cm4gYG51bGxgIHRvIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY092ZXJyaWRlcyA9IHtcbiAgW0sgaW4gQWdlbnRScGNNZXRob2ROYW1lXT86IChcbiAgICBwYXJhbXM6IEFnZW50UnBjTWV0aG9kc1tLXVtcInBhcmFtc1wiXVxuICApID0+IFByb21pc2U8QWdlbnRScGNSZXN1bHQ8QWdlbnRScGNNZXRob2RzW0tdW1wicmVzdWx0XCJdPj47XG59O1xuXG5jb25zdCBpc1ZlcmNlbCA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gQm9vbGVhbihnZXRWZXJjZWxPaWRjVG9rZW5TeW5jKCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZ2VudCA9IDxcbiAgVG9vbHMgZXh0ZW5kcyB7fSxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4oXG4gIG9wdGlvbnM6IEFnZW50T3B0aW9uczxUb29scywgVFRhZ3MsIFRDb250ZXh0PlxuKSA9PiB7XG4gIGNvbnN0IGFnZW50U2VjcmV0ID0gcHJvY2Vzcy5lbnYuQUdFTlRfU0VDUkVUO1xuICBpZiAoIWFnZW50U2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBR0VOVF9TRUNSRVQgZW52IHZhciBpcyByZXF1aXJlZC4gVXNlIHdpdGhBZ2VudCgpIG9yIHNldCBpdCBtYW51YWxseS5cIlxuICAgICk7XG4gIH1cblxuICBjb25zdCBiYXNlU3RvcmFnZUNvbmZpZyA9XG4gICAgb3B0aW9ucy5zdG9yYWdlID8/XG4gICAgKChpc1ZlcmNlbCgpXG4gICAgICA/IHsgdHlwZTogXCJ2ZXJjZWxcIiB9XG4gICAgICA6IHsgdHlwZTogXCJsb2NhbFwiIH0pIHNhdGlzZmllcyBTdG9yYWdlQ29uZmlnKTtcbiAgY29uc3Qgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZyA9IHtcbiAgICAuLi5iYXNlU3RvcmFnZUNvbmZpZyxcbiAgICBuYW1lOiBvcHRpb25zLm5hbWUgPz8gYmFzZVN0b3JhZ2VDb25maWcubmFtZSxcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmFnZSBpcyBpbml0aWFsaXplZCBsYXppbHkuXG4gICAqIFVzZXMgYWdlbnRPYmoucnBjIHdoaWNoIGlzIHdpcmVkIHVwIGJ5IHRoZSBsb2FkZXIgY2FsbGluZyBfX2luaXRBZ2VudC5cbiAgICovXG4gIGxldCBfc3RvcmFnZTogQWdlbnRTdG9yYWdlIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGdldFN0b3JhZ2VJbnN0YW5jZSA9ICgpOiBBZ2VudFN0b3JhZ2UgPT4ge1xuICAgIGlmICghX3N0b3JhZ2UpIHtcbiAgICAgIF9zdG9yYWdlID0gZ2V0U3RvcmFnZSh7XG4gICAgICAgIGNvbmZpZzogc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9zdG9yYWdlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXp5LWluaXRpYWxpemVkIHN0b3JhZ2UgaGFuZGxlcnMgZm9yIGxvY2FsIHN0b3JhZ2UuXG4gICAqIENyZWF0ZWQgb24gZmlyc3Qgc3RvcmFnZSBSUEMgcmVxdWVzdC5cbiAgICovXG4gIGxldCBzdG9yYWdlSGFuZGxlcnNQcm9taXNlOiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz4gfCBudWxsID0gbnVsbDtcbiAgY29uc3QgZ2V0U3RvcmFnZUhhbmRsZXJzID0gKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZUhhbmRsZXJzPiA9PiB7XG4gICAgaWYgKHN0b3JhZ2VDb25maWcudHlwZSAhPT0gXCJsb2NhbFwiKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFuZGxlcnMgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHN0b3JhZ2VcIilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghc3RvcmFnZUhhbmRsZXJzUHJvbWlzZSkge1xuICAgICAgc3RvcmFnZUhhbmRsZXJzUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICAgICAgICBjb25zdCB7IGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi9zdG9yYWdlL2JpbmRpbmdzL2xvY2FsLWZzLWhhbmRsZXJzXCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBzdG9yYWdlQ29uZmlnLnBhdGggPz8gXCIuYWdlbnQtc3RvcmFnZVwiO1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oYmFzZVBhdGgsIG5hbWUsIExPQ0FMX1NUT1JBR0VfVkVSU0lPTik7XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoZnVsbFBhdGgpO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2VIYW5kbGVyc1Byb21pc2U7XG4gIH07XG5cbiAgLy8gRXh0cmFjdCBzZXR1cCBhbmQgb25SZXN0YXJ0IGZyb20gYWdlbnQtbGV2ZWwgc2FuZGJveCBvcHRpb25zIChub3Qgc2VyaWFsaXphYmxlKVxuICBjb25zdCBhZ2VudFNhbmRib3hPcHRpb24gPSBvcHRpb25zLnNhbmRib3g7XG4gIGNvbnN0IHNhbmRib3hTZXR1cCA9XG4gICAgYWdlbnRTYW5kYm94T3B0aW9uICYmIHR5cGVvZiBhZ2VudFNhbmRib3hPcHRpb24gIT09IFwic3RyaW5nXCJcbiAgICAgID8gYWdlbnRTYW5kYm94T3B0aW9uLnNldHVwXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2FuZGJveE9uUmVzdGFydCA9XG4gICAgYWdlbnRTYW5kYm94T3B0aW9uICYmIHR5cGVvZiBhZ2VudFNhbmRib3hPcHRpb24gIT09IFwic3RyaW5nXCJcbiAgICAgID8gYWdlbnRTYW5kYm94T3B0aW9uLm9uUmVzdGFydFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc2FuZGJveCA9IGFzeW5jIChcbiAgICBzYW5kYm94SWQ6IHN0cmluZyxcbiAgICBvcHRzPzoge1xuICAgICAgY29uZmlnPzogU2FuZGJveENvbmZpZztcbiAgICAgIHRhZ3M/OiBUVGFncztcbiAgICAgIHNldHVwPzogU2FuZGJveFNldHVwO1xuICAgICAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xuICAgIH1cbiAgKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zYW5kYm94LmdldChzYW5kYm94SWQpO1xuXG4gICAgLy8gQ29tcG9zZSBhZ2VudC1sZXZlbCBhbmQgc2Vzc2lvbi1sZXZlbCBzZXR1cC9vblJlc3RhcnQuXG4gICAgLy8gU2Vzc2lvbiBzZXR1cCBydW5zIG9uIHRvcCBvZiBhZ2VudCBzZXR1cCAoZS5nLiBhZ2VudCBpbnN0YWxscyBzaGFyZWQgZGVwcyxcbiAgICAvLyBzZXNzaW9uIGRvZXMgZ2l0IGNsb25lICsgbnBtIGluc3RhbGwpLiBUaGUgY29tcG9zZWQga2V5IGluY29ycG9yYXRlcyBib3RoXG4gICAgLy8gc28gc25hcHNob3QgaW52YWxpZGF0aW9uIHdvcmtzIGNvcnJlY3RseS5cbiAgICBjb25zdCByZXNvbHZlZFNldHVwOiBTYW5kYm94U2V0dXAgfCB1bmRlZmluZWQgPVxuICAgICAgb3B0cz8uc2V0dXAgJiYgc2FuZGJveFNldHVwXG4gICAgICAgID8ge1xuICAgICAgICAgICAga2V5OiBgJHtzYW5kYm94U2V0dXAua2V5fToke29wdHMuc2V0dXAua2V5fWAsXG4gICAgICAgICAgICBydW46IGFzeW5jIChzYngpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgc2FuZGJveFNldHVwLnJ1bihzYngpO1xuICAgICAgICAgICAgICBhd2FpdCBvcHRzLnNldHVwPy5ydW4oc2J4KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IChvcHRzPy5zZXR1cCA/PyBzYW5kYm94U2V0dXApO1xuICAgIGNvbnN0IHJlc29sdmVkT25SZXN0YXJ0OiBPblJlc3RhcnQgfCB1bmRlZmluZWQgPVxuICAgICAgb3B0cz8ub25SZXN0YXJ0ICYmIHNhbmRib3hPblJlc3RhcnRcbiAgICAgICAgPyBhc3luYyAoc2J4KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzYW5kYm94T25SZXN0YXJ0KHNieCk7XG4gICAgICAgICAgICBhd2FpdCBvcHRzLm9uUmVzdGFydD8uKHNieCk7XG4gICAgICAgICAgfVxuICAgICAgICA6IChvcHRzPy5vblJlc3RhcnQgPz8gc2FuZGJveE9uUmVzdGFydCk7XG5cbiAgICAvLyBTdHJpcCBzZXR1cC9vblJlc3RhcnQgZnJvbSBjb25maWcgYmVmb3JlIHN0b3JpbmcgKGZ1bmN0aW9ucyBhcmVuJ3Qgc2VyaWFsaXphYmxlKVxuICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSAoKTogU2FuZGJveENvbmZpZyA9PiB7XG4gICAgICBpZiAob3B0cz8uY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBvcHRzLmNvbmZpZztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zYW5kYm94ID09PSBcInN0cmluZ1wiIHx8ICFvcHRpb25zLnNhbmRib3gpIHtcbiAgICAgICAgcmV0dXJuIGlzVmVyY2VsKCkgPyB7IHR5cGU6IFwidmVyY2VsXCIgfSA6IHsgdHlwZTogXCJsb2NhbFwiIH07XG4gICAgICB9XG4gICAgICBjb25zdCB7IHNldHVwOiBfcywgb25SZXN0YXJ0OiBfciwgLi4ucmVzdCB9ID0gb3B0aW9ucy5zYW5kYm94O1xuICAgICAgcmV0dXJuIHJlc3Q7XG4gICAgfTtcblxuICAgIGlmIChleGlzdGluZ1JlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoIShleGlzdGluZ1JlY29yZCBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yKSkge1xuICAgICAgICB0aHJvdyBleGlzdGluZ1JlY29yZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zYW5kYm94LnNldCh7XG4gICAgICAgIGlkOiBzYW5kYm94SWQsXG4gICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MgPz8gbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IERhdGUubm93KCksXG4gICAgICAgIGNvbmZpZzogcmVzb2x2ZUNvbmZpZygpLFxuICAgICAgfSk7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0U2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICAgIHNldHVwOiByZXNvbHZlZFNldHVwLFxuICAgICAgICBvblJlc3RhcnQ6IHJlc29sdmVkT25SZXN0YXJ0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29uZmlnID0gb3B0cz8uY29uZmlnID8/IGV4aXN0aW5nUmVjb3JkLmNvbmZpZztcbiAgICBpZiAoIWVxdWFsKGV4aXN0aW5nUmVjb3JkLmNvbmZpZywgbmV3Q29uZmlnKSkge1xuICAgICAgLy8gdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAvLyAgIHJlYXNvbjogXCJzYW5kYm94IGNvbmZpZyBjaGFuZ2VzIGFyZSBub3Qgc3VwcG9ydGVkXCIsXG4gICAgICAvLyB9KTtcbiAgICAgIGNvbnNvbGUud2FybihcInNhbmRib3ggY29uZmlnIGNoYW5nZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFNhbmRib3g8VFRhZ3M+KHtcbiAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICBzYW5kYm94UmVjb3JkOiBleGlzdGluZ1JlY29yZCxcbiAgICAgIHN0b3JhZ2U6IGdldFN0b3JhZ2VJbnN0YW5jZSgpLFxuICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICBzZXR1cDogcmVzb2x2ZWRTZXR1cCxcbiAgICAgIG9uUmVzdGFydDogcmVzb2x2ZWRPblJlc3RhcnQsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgYWdlbnRPYmogPSB7XG4gICAgc2Vzc2lvbjogYXN5bmMgKFxuICAgICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgICBzZXNzaW9uT3B0aW9ucz86IFNlc3Npb25PcHRpb25zPFRvb2xzLCBUVGFncz5cbiAgICApID0+IHtcbiAgICAgIGxldCBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBub3JtYWxpemUgc2FuZGJveCBpbnB1dCB0byBhIHNhbmRib3ggSUQgYW5kIGNvbmZpZ1xuICAgICAgICovXG4gICAgICBjb25zdCBzYW5kYm94SW5wdXQgPSBzZXNzaW9uT3B0aW9ucz8uc2FuZGJveCA/PyBvcHRpb25zLnNhbmRib3g7XG4gICAgICBjb25zdCBzYW5kYm94SWQgPVxuICAgICAgICB0eXBlb2Ygc2FuZGJveElucHV0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBzYW5kYm94SW5wdXRcbiAgICAgICAgICA6IC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTmVzdGVkVGVybmFyeTogb2tcbiAgICAgICAgICAgIHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyBgc2FuZGJveF8ke3VsaWQoKX1gXG4gICAgICAgICAgICA6IChzZXNzaW9uLnNhbmRib3hJZCA/PyBgc2FuZGJveF8ke3VsaWQoKX1gKTtcbiAgICAgIC8vIFN0cmlwIG5vbi1zZXJpYWxpemFibGUgZmllbGRzIChzZXR1cC9vblJlc3RhcnQpIGJlZm9yZSBwYXNzaW5nIGFzIGNvbmZpZy5cbiAgICAgIC8vIE9ubHkgdHJlYXQgc2V0dXAvb25SZXN0YXJ0IGFzIHNlc3Npb24tbGV2ZWwgb3ZlcnJpZGVzIHdoZW4gdGhlIHNlc3Npb25cbiAgICAgIC8vIGFjdHVhbGx5IHByb3ZpZGVkIGl0cyBvd24gc2FuZGJveCBjb25maWcgKG5vdCB3aGVuIGZhbGxpbmcgYmFjayB0byBhZ2VudCBjb25maWcpLlxuICAgICAgY29uc3QgaGFzU2Vzc2lvblNhbmRib3ggPSBzZXNzaW9uT3B0aW9ucz8uc2FuZGJveCAhPSBudWxsO1xuICAgICAgbGV0IHNlc3Npb25TZXR1cDogU2FuZGJveFNldHVwIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHNlc3Npb25PblJlc3RhcnQ6IE9uUmVzdGFydCB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNhbmRib3hDb25maWc6IFNhbmRib3hDb25maWcgfCB1bmRlZmluZWQgPVxuICAgICAgICB0eXBlb2Ygc2FuZGJveElucHV0ID09PSBcInN0cmluZ1wiIHx8ICFzYW5kYm94SW5wdXRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHNldHVwOiBfcyxcbiAgICAgICAgICAgICAgICBvblJlc3RhcnQ6IF9yLFxuICAgICAgICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgICAgICAgfSA9IHNhbmRib3hJbnB1dCBhcyBTYW5kYm94Q29uZmlnICYge1xuICAgICAgICAgICAgICAgIHNldHVwPzogU2FuZGJveFNldHVwO1xuICAgICAgICAgICAgICAgIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgaWYgKGhhc1Nlc3Npb25TYW5kYm94KSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvblNldHVwID0gX3M7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbk9uUmVzdGFydCA9IF9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN0O1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQcm9taXNlID0gc2FuZGJveChcbiAgICAgICAgc2FuZGJveElkLFxuICAgICAgICBzYW5kYm94Q29uZmlnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmZpZzogc2FuZGJveENvbmZpZyxcbiAgICAgICAgICAgICAgc2V0dXA6IHNlc3Npb25TZXR1cCxcbiAgICAgICAgICAgICAgb25SZXN0YXJ0OiBzZXNzaW9uT25SZXN0YXJ0LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICApO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1Nlc3Npb24gPSBzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IgPyBudWxsIDogc2Vzc2lvbjtcbiAgICAgIGNvbnN0IHNraWxsc0RpciA9XG4gICAgICAgIHNlc3Npb25PcHRpb25zPy5za2lsbHNEaXIgPz9cbiAgICAgICAgZXhpc3RpbmdTZXNzaW9uPy5za2lsbHNEaXIgPz9cbiAgICAgICAgb3B0aW9ucy5za2lsbHNEaXIgPz9cbiAgICAgICAgbnVsbDtcblxuICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIFNlc3Npb25Ob3RGb3VuZEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBzZXNzaW9uT3B0aW9ucz8ubW9kZWwgPz8gb3B0aW9ucy5tb2RlbCA/PyBudWxsO1xuICAgICAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTW9kZWwgaXMgbm90IHNldFwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlc3Npb24gPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLnNldCh7XG4gICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbGFzdE1lc3NhZ2VJZDogbnVsbCxcbiAgICAgICAgICAgIHJ1bklkOiBudWxsLFxuICAgICAgICAgICAgdGFnczogc2Vzc2lvbk9wdGlvbnM/LnRhZ3MgPz8gbnVsbCxcbiAgICAgICAgICAgIHN5c3RlbTogc2Vzc2lvbk9wdGlvbnM/LnN5c3RlbSA/PyBvcHRpb25zLnN5c3RlbSA/PyBudWxsLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBzYW5kYm94SWQsXG4gICAgICAgICAgICBza2lsbHNEaXI6IHNraWxsc0RpciA/IG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyKSA6IG51bGwsXG4gICAgICAgICAgICBob29rVG9rZW46IG51bGwsXG4gICAgICAgICAgICBhY3RpdmVUb29sczpcbiAgICAgICAgICAgICAgc2Vzc2lvbk9wdGlvbnM/LmFjdGl2ZVRvb2xzID8/IG9wdGlvbnMuYWN0aXZlVG9vbHMgPz8gbnVsbCxcbiAgICAgICAgICAgIGdlbmVyYXRpb246XG4gICAgICAgICAgICAgIG9wdGlvbnMuZ2VuZXJhdGlvbiB8fCBzZXNzaW9uT3B0aW9ucz8uZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgID8geyAuLi5vcHRpb25zLmdlbmVyYXRpb24sIC4uLnNlc3Npb25PcHRpb25zPy5nZW5lcmF0aW9uIH1cbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgc2Vzc2lvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEludGVycnVwdHMgYWxsIHBlbmRpbmcgYXNzaXN0YW50IG1lc3NhZ2VzIChib3RoIHN0cmVhbWluZyBhbmQgcXVldWVkKS5cbiAgICAgICAqIEEgbWVzc2FnZSBpcyBjb25zaWRlcmVkIHBlbmRpbmcgaWYgY29tcGxldGVkQXQgPT09IG51bGwgJiYgaW50ZXJydXB0ZWRBdCA9PT0gbnVsbC5cbiAgICAgICAqL1xuICAgICAgY29uc3QgaW50ZXJydXB0Q3VycmVudE1lc3NhZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzUmVzdWx0ID1cbiAgICAgICAgICBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5tZXNzYWdlLmxpc3Qoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKG1lc3NhZ2VzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMgPSBtZXNzYWdlc1Jlc3VsdC5pdGVtcy5maWx0ZXIoXG4gICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICBtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgICAgICAgIG0uY29tcGxldGVkQXQgPT09IG51bGwgJiZcbiAgICAgICAgICAgIG0uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMubWFwKChtKSA9PlxuICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkubWVzc2FnZS5zZXQoeyAuLi5tLCBpbnRlcnJ1cHRlZEF0OiBub3cgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdXRvLXJlamVjdCBhbnkgcGVuZGluZyBhcHByb3ZhbCBob29rcyBzbyB0aGUgd29ya2Zsb3cgdW5ibG9ja3NcbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzUmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlNZXNzYWdlKFxuICAgICAgICAgICAgbS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcGFydHNSZXN1bHQuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcC5wYXJ0ICYmXG4gICAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFwcHJvdmFsID0gKHAucGFydCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfSlcbiAgICAgICAgICAgICAgICAuYXBwcm92YWw7XG4gICAgICAgICAgICAgIGlmIChhcHByb3ZhbD8uaWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5wLFxuICAgICAgICAgICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5wLnBhcnQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlc3BvbmRlZFwiLFxuICAgICAgICAgICAgICAgICAgICBhcHByb3ZhbDoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLmFwcHJvdmFsLFxuICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFwiaW50ZXJydXB0ZWRcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSBhcyBQYXJ0KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcHByb3ZhbEhvb2sucmVzdW1lKGFwcHJvdmFsLmlkLCB7XG4gICAgICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICByZWFzb246IFwiaW50ZXJydXB0ZWRcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBhc3luYyAoe1xuICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIGludGVycnVwdElmU3RyZWFtaW5nLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICBpbnB1dDogU2VuZElucHV0IHwgU2VuZElucHV0W107XG4gICAgICAgICAgaW50ZXJydXB0SWZTdHJlYW1pbmc/OiBib29sZWFuO1xuICAgICAgICAgIGNvbnRleHQ/OiBUQ29udGV4dDtcbiAgICAgICAgfSkgPT4ge1xuICAgICAgICAgIGlmIChpbnRlcnJ1cHRJZlN0cmVhbWluZykge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJydXB0UmVzdWx0ID0gYXdhaXQgaW50ZXJydXB0Q3VycmVudE1lc3NhZ2UoKTtcbiAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gaW50ZXJydXB0UmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gICAgICAgICAgY29uc3QgbmV3UGFydHM6IFBhcnRbXSA9IFtdO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGlucHV0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGksXG4gICAgICAgICAgICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBwYXJ0cyB9ID0gdG9NZXNzYWdlQW5kUGFydHMoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBkZWZhdWx0Um9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ld01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogd2UgYWxzbyBwcmUtY3JlYXRlIHRoZSBhc3Npc3RhbnQgbWVzc2FnZVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VJZCA9IGBtZXNzYWdlXyR7dWxpZCgpfWA7XG4gICAgICAgICAgY29uc3QgYmFzZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQgPSBiYXNlVGltZSArIG5ld01lc3NhZ2VzLmxlbmd0aDtcbiAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgICAgICAgdXNhZ2U6IG51bGwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBzZXNzaW9uMiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHNlc3Npb24yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHNlc3Npb24yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFnZW50SW5wdXQ6IEFnZW50SW5wdXQgPSB7XG4gICAgICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQgPSB7XG4gICAgICAgICAgICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICBob29rVG9rZW46IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQsXG4gICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0ID8/IHt9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBhbGwoe1xuICAgICAgICAgICAgICAgIGFzeW5jIHNhdmVNZXNzYWdlcygpIHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlcy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkubWVzc2FnZS5zZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogYmFzZVRpbWUgKyBpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyBzYXZlUGFydHMoKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgbmV3UGFydHMubWFwKGdldFN0b3JhZ2VJbnN0YW5jZSgpLnBhcnQuc2V0KVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIHJlc3VtZU9yU3RhcnRBZ2VudFdvcmtmbG93KCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24yLnJ1bklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFnZW50TWVzc2FnZUhvb2sucmVzdW1lKHNlc3Npb25JZCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCBzdGFydChhZ2VudFdvcmtmbG93LCBbXG4gICAgICAgICAgICAgICAgICAgICAgeyBpbnB1dDogYWdlbnRJbnB1dCwgZXZlbnQgfSxcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb24yLnJ1bklkID0gc3RhcnRSZXN1bHQucnVuSWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyB1cGRhdGVTZXNzaW9uKCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4kLnJlc3VtZU9yU3RhcnRBZ2VudFdvcmtmbG93O1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5zZXQoe1xuICAgICAgICAgICAgICAgICAgICAuLi5zZXNzaW9uMixcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICBsYXN0TWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIGhvb2tUb2tlbjogZXZlbnQuaG9va1Rva2VuLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYXRjaDogKGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBgZmFpbGVkIHRvIHNlbmQ6ICR7U3RyaW5nKGUpfWAsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBzdHJlYW06IGFzeW5jIChvcHRzPzoge1xuICAgICAgICAgIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgICAgICAgfSk6IFByb21pc2U8QWdlbnRTdHJlYW0gfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBvcHRzPy5tZXNzYWdlSWQgPz8gc2Vzc2lvbi5sYXN0TWVzc2FnZUlkO1xuICAgICAgICAgIGlmICghbWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJObyBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZXNzaW9uLnJ1bklkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJObyBydW4gYXNzb2NpYXRlZCB3aXRoIHNlc3Npb25cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBydW4gPSBnZXRSdW4oc2Vzc2lvbi5ydW5JZCk7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dSZWFkYWJsZSA9IHJ1bi5nZXRSZWFkYWJsZTxVSU1lc3NhZ2VDaHVuaz4oe1xuICAgICAgICAgICAgbmFtZXNwYWNlOiBtZXNzYWdlSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgZGF0YVdyaXRlcjoge1xuICAgICAgICAgICAgd3JpdGU6IChjaHVuazogVUlNZXNzYWdlQ2h1bmspID0+IHZvaWQ7XG4gICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFN0cmVhbSA9IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICBleGVjdXRlOiAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICAgICAgICBkYXRhV3JpdGVyID0gd3JpdGVyO1xuICAgICAgICAgICAgICB3cml0ZXIubWVyZ2Uod29ya2Zsb3dSZWFkYWJsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obWVyZ2VkU3RyZWFtLCB7XG4gICAgICAgICAgICB3cml0ZVN0YXR1czogKHN0YXR1czogQWdlbnRTdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFkYXRhV3JpdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIHdyaXRlciBub3QgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRhdGFXcml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0YS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICBkYXRhOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhbnNpZW50OiB0cnVlLFxuICAgICAgICAgICAgICB9IGFzIFVJTWVzc2FnZUNodW5rKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkgYXMgQWdlbnRTdHJlYW07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBbbWVzc2FnZXNSZXN1bHQsIHBhcnRzUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpLFxuICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFydHNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRzUmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICAgIHBhcnRzOiBwYXJ0c1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkQXNzaXN0YW50ID0gbWVzc2FnZXNSZXN1bHQuaXRlbXNcbiAgICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgICAgICAgICAgbGFzdFN0YXJ0ZWRBc3Npc3RhbnQgJiZcbiAgICAgICAgICAgIGxhc3RTdGFydGVkQXNzaXN0YW50LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBsYXN0U3RhcnRlZEFzc2lzdGFudC5pbnRlcnJ1cHRlZEF0ID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nXG4gICAgICAgICAgICA/IGxhc3RTdGFydGVkQXNzaXN0YW50LmlkXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXNSZXN1bHQuaXRlbXMpO1xuXG4gICAgICAgICAgdHlwZSBUeXBlZE1lc3NhZ2UgPSBVSU1lc3NhZ2U8XG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgQWdlbnREYXRhVHlwZXMsXG4gICAgICAgICAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICAgICAgICAgID47XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyBhcyB1bmtub3duIGFzIFR5cGVkTWVzc2FnZVtdLFxuICAgICAgICAgICAgc3RyZWFtaW5nTWVzc2FnZUlkLFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFnOiB7XG4gICAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0OiBhc3luYyA8SyBleHRlbmRzIGtleW9mIFRUYWdzICYgc3RyaW5nPihcbiAgICAgICAgICAgIGtleTogS1xuICAgICAgICAgICk6IFByb21pc2U8VFRhZ3NbS10gfCB1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24udGFncz8uW2tleV0gYXMgVFRhZ3NbS10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgVFRhZ3MgJiBzdHJpbmc+KFxuICAgICAgICAgICAga2V5OiBLLFxuICAgICAgICAgICAgdmFsdWU6IFRUYWdzW0tdXG4gICAgICAgICAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi50YWcuc2V0KHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUGFydGlhbDxUVGFncz4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLnRhZy5zZXQoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYW5kYm94OiBhd2FpdCBzYW5kYm94UHJvbWlzZSxcblxuICAgICAgICBpbnRlcnJ1cHQ6IGludGVycnVwdEN1cnJlbnRNZXNzYWdlLFxuXG4gICAgICAgIHJlc29sdmVBcHByb3ZhbDogYXN5bmMgKHtcbiAgICAgICAgICBhcHByb3ZhbElkLFxuICAgICAgICAgIGFwcHJvdmVkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfToge1xuICAgICAgICAgIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICAgICAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICAgICAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIH0pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHNSZXN1bHQgPVxuICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1Jlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQYXJ0ID0gcGFydHNSZXN1bHQuaXRlbXMuZmluZChcbiAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgICAgICAocC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWQgPT09XG4gICAgICAgICAgICAgICAgYXBwcm92YWxJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0YXJnZXRQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogYEFwcHJvdmFsICR7YXBwcm92YWxJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRQYXJ0ID0ge1xuICAgICAgICAgICAgLi4udGFyZ2V0UGFydCxcbiAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgLi4udGFyZ2V0UGFydC5wYXJ0LFxuICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQsIGFwcHJvdmVkLCByZWFzb24gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzZXRSZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldChcbiAgICAgICAgICAgIHVwZGF0ZWRQYXJ0IGFzIFBhcnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzZXRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXJlIHRoZSBhcHByb3ZhbCBob29rIHRvIHJlc3VtZSB0aGUgc3VzcGVuZGVkIHdvcmtmbG93LlxuICAgICAgICAgIC8vIEZvciBzdWItdG9vbCBhcHByb3ZhbHMgKGZyb20gdGhlIEphdmFTY3JpcHQgdG9vbCksIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAvLyBzdXNwZW5kZWQgaG9vayBcdTIwMTQgcG9sbGluZyBoYW5kbGVzIGl0LiBTd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbElkLCB7IGFwcHJvdmVkLCByZWFzb24gfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBObyBob29rIHJlZ2lzdGVyZWQgZm9yIHRoaXMgYXBwcm92YWxJZCAoZS5nLiBKUyBzdWItdG9vbCBhcHByb3ZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVzYWdlOiBhc3luYyAoKTogUHJvbWlzZTxTZXNzaW9uVXNhZ2UgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzUmVzdWx0ID1cbiAgICAgICAgICAgIGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21wdXRlU2Vzc2lvblVzYWdlKG1lc3NhZ2VzUmVzdWx0Lml0ZW1zKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IGFzeW5jIChcbiAgICAgICAgICB1cGRhdGVPcHRpb25zOiBTZXNzaW9uVXBkYXRlT3B0aW9uczxUb29scz4gJiB7IHRhZ3M/OiBUVGFncyB9XG4gICAgICAgICk6IFByb21pc2U8dW5kZWZpbmVkIHwgRXJyb3I+ID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdXBkYXRlZDogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAuLi51cGRhdGVPcHRpb25zLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgc2tpbGxzRGlyOiB1cGRhdGVPcHRpb25zLnNraWxsc0RpclxuICAgICAgICAgICAgICA/IG5vcm1hbGl6ZVNraWxsc0RpcnModXBkYXRlT3B0aW9ucy5za2lsbHNEaXIpXG4gICAgICAgICAgICAgIDogY3VycmVudC5za2lsbHNEaXIsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZXF1YWwodXBkYXRlZCwgY3VycmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHVwZGF0ZWQpO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBzYW5kYm94LFxuICAgIGdldCBzdG9yYWdlKCk6IFR5cGVkU3RvcmFnZTxUVGFncz4ge1xuICAgICAgcmV0dXJuIGdldFN0b3JhZ2VJbnN0YW5jZSgpIGFzIFR5cGVkU3RvcmFnZTxUVGFncz47XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJQQyBoYW5kbGVyIGZvciBhZ2VudCBvcGVyYXRpb25zLlxuICAgICAqIEhhbmRsZXMgdG9vbHMubGlzdCwgdG9vbHMuZXhlY3V0ZSwgc3RvcmFnZSBSUEMsIGFuZCBob29rcy5cbiAgICAgKlxuICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBgcnBjYCBzdGVwIGZ1bmN0aW9uIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAgICogQ2FuIGFsc28gYmUgZXhwb3NlZCB2aWEgSFRUUCBmb3IgZXh0ZXJuYWwgYWNjZXNzIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVyOiBhc3luYyAoXG4gICAgICBpbnB1dDogUmVxdWVzdCB8IFJwY1BheWxvYWQsXG4gICAgICBvdmVycmlkZXM/OiBBZ2VudFJwY092ZXJyaWRlc1xuICAgICk6IFByb21pc2U8UmVzcG9uc2UgfCBScGNSZXN1bHQ+ID0+IHtcbiAgICAgIGNvbnN0IGlzUmVxdWVzdCA9IGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdDtcblxuICAgICAgbGV0IG1ldGhvZDogc3RyaW5nO1xuICAgICAgbGV0IHBhcmFtczogdW5rbm93bjtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmc7XG5cbiAgICAgIGlmIChpc1JlcXVlc3QpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0ID0gaW5wdXQuaGVhZGVycy5nZXQoXCJ4LWFnZW50LXNlY3JldFwiKTtcbiAgICAgICAgaWYgKHNlY3JldCAhPT0gYWdlbnRTZWNyZXQpIHtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgICAgIHsgZXJyb3I6IHsgY29kZTogXCJVTkFVVEhPUklaRURcIiwgbWVzc2FnZTogXCJJbnZhbGlkIHNlY3JldFwiIH0gfSxcbiAgICAgICAgICAgIHsgc3RhdHVzOiA0MDEgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYm9keTogQWdlbnRScGNSZXF1ZXN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBhd2FpdCBpbnB1dC5qc29uKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcjogeyBjb2RlOiBcIklOVkFMSURfUkVRVUVTVFwiLCBtZXNzYWdlOiBcIkludmFsaWQgSlNPTiBib2R5XCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDAwIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWV0aG9kID0gYm9keS5tZXRob2Q7XG4gICAgICAgIHBhcmFtcyA9IGJvZHkucGFyYW1zO1xuICAgICAgICBuYW1lID0gaW5wdXQuaGVhZGVycy5nZXQoXCJ4LWFnZW50LW5hbWVcIikgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgIHBhcmFtcyA9IGlucHV0LnBhcmFtcztcbiAgICAgICAgbmFtZSA9IGlucHV0Lm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoQ29udGV4dDogRGlzcGF0Y2hDb250ZXh0ID0ge1xuICAgICAgICB0b29sczogb3B0aW9ucy50b29scyBhcyBUb29sU2V0IHwgdW5kZWZpbmVkLFxuICAgICAgICBob29rczogb3B0aW9ucy5ob29rcyxcbiAgICAgICAgbmVlZHNBcHByb3ZhbDpcbiAgICAgICAgICBvcHRpb25zLm5lZWRzQXBwcm92YWwgYXMgRGlzcGF0Y2hDb250ZXh0W1wibmVlZHNBcHByb3ZhbFwiXSxcbiAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlLFxuICAgICAgICBnZXRTdG9yYWdlSGFuZGxlcnMsXG4gICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICBvdmVycmlkZXMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkaXNwYXRjaChtZXRob2QsIHBhcmFtcywgZGlzcGF0Y2hDb250ZXh0LCBuYW1lKTtcblxuICAgICAgaWYgKCFpc1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdHVzID0gXCJlcnJvclwiIGluIHJlc3VsdCA/IChyZXN1bHQuc3RhdHVzID8/IDUwMCkgOiAyMDA7XG4gICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgXCJlcnJvclwiIGluIHJlc3VsdCA/IHsgZXJyb3I6IHJlc3VsdC5lcnJvciB9IDogeyByZXN1bHQ6IHJlc3VsdC5yZXN1bHQgfSxcbiAgICAgICAgeyBzdGF0dXMgfVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgdG9vbHM6IHsgLi4uYnVpbHRJblRvb2xzLCAuLi5vcHRpb25zLnRvb2xzIH0gYXMgdHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzLFxuXG4gICAgLyoqIFBoYW50b20gcHJvcGVydHkgZm9yIHR5cGUgaW5mZXJlbmNlLiBVc2UgYHR5cGVvZiBteUFnZW50LiRVSU1lc3NhZ2VgIHRvIGdldCB0aGUgdHlwZWQgVUlNZXNzYWdlLiAqL1xuICAgICRVSU1lc3NhZ2U6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFVJTWVzc2FnZTxcbiAgICAgIHVua25vd24sXG4gICAgICBBZ2VudERhdGFUeXBlcyxcbiAgICAgIEluZmVyVUlUb29sczx0eXBlb2YgYnVpbHRJblRvb2xzICYgVG9vbHM+XG4gICAgPixcblxuICAgIC8qKiBBZ2VudCBuYW1lIHVzZWQgYXMga2V5IGZvciB0aGUgUlBDIHJlZ2lzdHJ5LiBTZXQgYnkgdGhlIGxvYWRlciBpbml0LiAqL1xuICAgIF9hZ2VudE5hbWU6IHN0b3JhZ2VDb25maWcubmFtZSA/PyBERUZBVUxUX05BTUVTUEFDRSxcblxuICAgIHJwYzogKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJycGMgbm90IGNvbmZpZ3VyZWQuIEVuc3VyZSB3aXRoQWdlbnQgaXMgc2V0IHVwIGluIG5leHQuY29uZmlnLnRzXCJcbiAgICAgICk7XG4gICAgfSkgYXMgKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+LFxuICB9O1xuXG4gIHJldHVybiBhZ2VudE9iajtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBGaW5pc2hSZWFzb24gfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGRlZmluZUhvb2ssIEZhdGFsRXJyb3IsIGdldFdyaXRhYmxlIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgeyBjb21wbGV0ZU1lc3NhZ2VTdGVwLCBzdHJlYW1UZXh0U3RlcCB9IGZyb20gXCIuL2FnZW50LXdvcmtmbG93LXN0ZXBzXCI7XG5pbXBvcnQgdHlwZSB7IFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlQ29uZmlnIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UgfSBmcm9tIFwiLi91dGlscy91c2FnZVwiO1xuXG5leHBvcnQgdHlwZSBBZ2VudElucHV0ID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59O1xuXG5leHBvcnQgdHlwZSBBZ2VudE1lc3NhZ2VJbnB1dCA9IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5leHBvcnQgdHlwZSBBcHByb3ZhbFJlc3BvbnNlID0ge1xuICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGFnZW50TWVzc2FnZUhvb2sgPSBkZWZpbmVIb29rPEFnZW50TWVzc2FnZUlucHV0PigpO1xuZXhwb3J0IGNvbnN0IGFwcHJvdmFsSG9vayA9IGRlZmluZUhvb2s8QXBwcm92YWxSZXNwb25zZT4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFnZW50V29ya2Zsb3coe1xuICBpbnB1dCxcbiAgZXZlbnQsXG59OiB7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgY29uc3QgbWVzc2FnZUhvb2sgPSBhZ2VudE1lc3NhZ2VIb29rLmNyZWF0ZSh7IHRva2VuOiBpbnB1dC5zZXNzaW9uSWQgfSk7XG4gIGNvbnN0IGl0ZXJhdG9yID0gbWVzc2FnZUhvb2tbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIGxldCBwZW5kaW5nTmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICBhd2FpdCBvbk1lc3NhZ2UoeyBldmVudCwgaW5wdXQgfSkuY2F0Y2goKGUpID0+IHtcbiAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIk1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQgcGVybWFuZW50bHk6XCIsIGUubWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH0pO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVuZGluZ05leHQ7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkOiBtZXNzYWdlIGhvb2sgaXRlcmF0b3IgZG9uZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IG9uTWVzc2FnZSh7IGV2ZW50OiByZXN1bHQudmFsdWUsIGlucHV0IH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiTWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZCBwZXJtYW5lbnRseTpcIiwgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgICBwZW5kaW5nTmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbk1lc3NhZ2Uoe1xuICBldmVudCxcbiAgaW5wdXQsXG59OiB7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG59KSB7XG4gIGNvbnN0IHdyaXRhYmxlID0gZ2V0V3JpdGFibGUoeyBuYW1lc3BhY2U6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCB9KTtcblxuICBsZXQgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb24gfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0UGFydEluZGV4ID0gMDtcbiAgY29uc3QgdXNhZ2VTdGVwczogU3RlcFVzYWdlW10gPSBbXTtcblxuICB3aGlsZSAoZmluaXNoUmVhc29uICE9PSBcInN0b3BcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW1UZXh0U3RlcCh7XG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2VJZDogZXZlbnQuYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICB3cml0YWJsZSxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsYXN0UGFydEluZGV4LFxuICAgICAgICBzdGVwSW5kZXhPZmZzZXQ6IHVzYWdlU3RlcHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgICBmaW5pc2hSZWFzb24gPSByZXN1bHQuZmluaXNoUmVhc29uO1xuICAgICAgbGFzdFBhcnRJbmRleCA9IHJlc3VsdC5sYXN0UGFydEluZGV4O1xuICAgICAgdXNhZ2VTdGVwcy5wdXNoKC4uLnJlc3VsdC51c2FnZVN0ZXBzKTtcblxuICAgICAgaWYgKHJlc3VsdC5tYXhTdGVwcyAhPSBudWxsICYmIHVzYWdlU3RlcHMubGVuZ3RoID49IHJlc3VsdC5tYXhTdGVwcykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdG9vbHMgbmVlZCBhcHByb3ZhbCwgc3VzcGVuZCB3b3JrZmxvdyB1bnRpbCBhbGwgYXJlIHJlc29sdmVkXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHBlbmRpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBhcHByb3ZhbEhvb2suY3JlYXRlKHsgdG9rZW46IHBlbmRpbmcuYXBwcm92YWxJZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXIgPSBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIC8vIEFsbCBob29rcyByZXNvbHZlZCBcdTIwMTQgYXBwcm92YWwgcmVzcG9uc2VzIGFyZSBub3cgaW4gc3RvcmFnZS5cbiAgICAgICAgLy8gTG9vcCBjb250aW51ZXMgXHUyMTkyIG5leHQgc3RyZWFtVGV4dFN0ZXAgcmVhZHMgdXBkYXRlZCBwYXJ0cy5cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBjb21wbGV0ZU1lc3NhZ2VTdGVwKHtcbiAgICBhc3Npc3RhbnRNZXNzYWdlSWQ6IGV2ZW50LmFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBpbnB1dCxcbiAgICB3cml0YWJsZSxcbiAgICB1c2FnZVN0ZXBzLFxuICB9KTtcbn1cbiIsICJpbXBvcnQge1xuICBjb252ZXJ0VG9Nb2RlbE1lc3NhZ2VzLFxuICBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sXG4gIHR5cGUgRmluaXNoUmVhc29uLFxuICBzdGVwQ291bnRJcyxcbiAgc3RyZWFtVGV4dCxcbiAgdHlwZSBVSU1lc3NhZ2UsXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50SW5wdXQsIEFnZW50TWVzc2FnZUlucHV0IH0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRTdGF0dXMsIFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgZGlzY292ZXJTa2lsbHNJblNhbmRib3ggfSBmcm9tIFwiLi9za2lsbHMvZGlzY292ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBmZXRjaEFwaVRvb2xzTWV0YWRhdGEsIGdldFRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL3Rvb2xzL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0IH0gZnJvbSBcIi4vdXRpbHMvcHJvbXB0LWNhY2hlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi91dGlscy91aVwiO1xuaW1wb3J0IHsgY29tcHV0ZVVzYWdlU3VtbWFyeSwgdHlwZSBTdGVwVXNhZ2UgfSBmcm9tIFwiLi91dGlscy91c2FnZVwiO1xuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBzdGF0dXMgZW1pc3Npb24uIFdyaXRlcyBhIHRyYW5zaWVudCBgZGF0YS1zdGF0dXNgIGNodW5rXG4gKiB0byB0aGUgc3RyZWFtIGFuZCBjYWxscyB0aGUgYGhvb2suc3RhdHVzYCBSUEMuIE5laXRoZXIgYmxvY2tzIHRoZSBjYWxsZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgcnBjLFxufToge1xuICB3cml0ZXI6ICgoZXZlbnQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbDtcbiAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59KSB7XG4gIHdyaXRlcj8uKHsgdHlwZTogXCJkYXRhLXN0YXR1c1wiLCBkYXRhOiBzdGF0dXMsIHRyYW5zaWVudDogdHJ1ZSB9KTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5QmxvY2tTdGF0ZW1lbnRzOiBmaXJlLWFuZC1mb3JnZXRcbiAgcnBjKHsgbWV0aG9kOiBcImhvb2suc3RhdHVzXCIsIHBhcmFtczogeyBzdGF0dXMgfSB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmNvbnN0IEJBU0VfU1lTVEVNX1BST01QVCA9XG4gIFwiWW91IGFyZSBhbiBBSSBhc3Npc3RhbnQgd2l0aCBiYXNpYyB0b29scyB0byBpbnRlcmFjdCB3aXRoIHlvdXIgZW52aXJvbm1lbnQuIEV4cGxvcmUgYW5kIHdvcmsgZnJlZWx5LlwiO1xuXG5mdW5jdGlvbiBqb2luUHJvbXB0U2VjdGlvbnMoXG4gIC4uLnNlY3Rpb25zOiAoc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbClbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLmZpbHRlcigocykgPT4gcz8udHJpbSgpKS5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG5jb25zdCBiYWNrZ3JvdW5kUHJvY2Vzc1Byb21wdCA9IGAjIyBCYWNrZ3JvdW5kIFByb2Nlc3Nlc1xuVGhlc2UgYmFja2dyb3VuZCBwcm9jZXNzIGluc3RydWN0aW9ucyBhcmUgZm9yIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBwcm9jZXNzZXMsIGRvIG5vdCBiZSB0byB2ZXJib3NlIHRvIHRoZSB1c2VyIGFib3V0IHRoZSByZXNwb25zZSBkZXRhaWxzIGxpa2UgXCJob3cgdG8gZGVidWcgdGhlIHByb2Nlc3Mgb3V0cHV0XCIgdGhlIHVzZXIgd2lsbCBoYXZlIGFuIFVJLlxuXG5Vc2UgXFxgd2FpdFVudGlsOiAwXFxgIGZvciBkZXYgc2VydmVycyB0aGF0IHNob3VsZCBydW4gaW5kZWZpbml0ZWx5LlxuSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGNoZWNrIHRoZSBvdXRwdXQgbG9nIGFmdGVyIHJ1bm5pbmcgcHJvY2Vzc2VzIGxpa2UgZGV2IHNlcnZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgc3RhcnRlZCBjb3JyZWN0bHkuXG5cblRvIHJ1biBhIGJhY2tncm91bmQgcHJvY2VzczpcbkJhc2goeyBjb21tYW5kOiBcIm5wbSBydW4gZGV2XCIsIHdhaXRVbnRpbDogMCB9KVxuUmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIFxcYHBpZFxcYCBhbmQgXFxgb3V0cHV0RmlsZVxcYCBwYXRoLlxuXG5UbyBjaGVjayBhIHByb2Nlc3MncyBvdXRwdXQ6XG5CYXNoKHsgY29tbWFuZDogXCJ0YWlsIC0xMDAge291dHB1dEZpbGV9XCIgfSlcblxuVG8ga2lsbCBhIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJraWxsIHtwaWR9XCIgfSkgICAgICAgLy8gR3JhY2VmdWxcbkJhc2goeyBjb21tYW5kOiBcImtpbGwgLTkge3BpZH1cIiB9KSAgICAvLyBGb3JjZVxuXG5UbyBsaXN0IGFsbCBwcm9jZXNzZXM6XG5CYXNoKHsgY29tbWFuZDogXCJwcyBhdXggfCBncmVwIG5vZGVcIiB9KVxuYDtcblxuZnVuY3Rpb24gYnVpbGRTa2lsbHNDb250ZXh0KHNraWxsczogU2tpbGxTdW1tYXJ5W10pOiBzdHJpbmcge1xuICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3Qgc2tpbGxMaW5lcyA9IHNraWxsc1xuICAgIC5tYXAoKHMpID0+IGAtICR7cy5uYW1lfTogJHtzLmRlc2NyaXB0aW9ufVxcbiAgUGF0aDogJHtzLnNraWxsTWRQYXRofWApXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgcmV0dXJuIGAjIyBBdmFpbGFibGUgU2tpbGxzXG4ke3NraWxsTGluZXN9XG5cbiR7YmFja2dyb3VuZFByb2Nlc3NQcm9tcHR9XG5cbllvdSBjYW4gdXNlIHRoZSBSZWFkIHRvb2wgdG8gcmVhZCBhbnkgc2tpbGwncyBTS0lMTC5tZCBmaWxlIHRvIGxlYXJuIG1vcmUgYWJvdXQgaXQuYDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlTWVzc2FnZVN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICB3cml0YWJsZSxcbiAgdXNhZ2VTdGVwcyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW07XG4gIHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdO1xufSkge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBnZXRTdG9yYWdlIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvY2xpZW50XCIpO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjOiBpbnB1dC5ycGMgfSk7XG5cbiAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQoYXNzaXN0YW50TWVzc2FnZUlkKTtcbiAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2U7XG4gIH1cbiAgaWYgKCFtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlICR7YXNzaXN0YW50TWVzc2FnZUlkfSBub3QgZm91bmRgKTtcbiAgfVxuXG4gIGNvbnN0IHVzYWdlID1cbiAgICB1c2FnZVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgID8ge1xuICAgICAgICAgIHN0ZXBzOiB1c2FnZVN0ZXBzLFxuICAgICAgICAgIHN1bW1hcnk6IGNvbXB1dGVVc2FnZVN1bW1hcnkodXNhZ2VTdGVwcyksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2Uuc2V0KHtcbiAgICAuLi5tZXNzYWdlLFxuICAgIGNvbXBsZXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIHVzYWdlLFxuICB9KTtcbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcmVzdWx0O1xuICB9XG5cbiAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbn1cblxuY29uc3QgSU5URVJSVVBUX1BPTExfSU5URVJWQUxfTVMgPSA1MDA7XG5cbmZ1bmN0aW9uIHBvbGxGb3JJbnRlcnJ1cHQoe1xuICBzdG9yYWdlLFxuICBtZXNzYWdlSWQsXG4gIHNpZ25hbCxcbiAgYWJvcnRDb250cm9sbGVyLFxufToge1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59KTogeyBmaXJzdENoZWNrOiBQcm9taXNlPHZvaWQ+IH0ge1xuICBsZXQgcmVzb2x2ZUZpcnN0Q2hlY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IGZpcnN0Q2hlY2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVGaXJzdENoZWNrID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQobWVzc2FnZUlkKTtcbiAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICByZXNvbHZlRmlyc3RDaGVjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjayB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dFN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICBldmVudCxcbiAgd3JpdGFibGUsXG4gIGxhc3RQYXJ0SW5kZXgsXG4gIHN0ZXBJbmRleE9mZnNldCxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbn0pOiBQcm9taXNlPHtcbiAgZmluaXNoUmVhc29uOiBGaW5pc2hSZWFzb247XG4gIGxhc3RQYXJ0SW5kZXg6IG51bWJlcjtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG4gIHBlbmRpbmdBcHByb3ZhbHM6IHsgYXBwcm92YWxJZDogc3RyaW5nOyB0b29sTmFtZTogc3RyaW5nIH1bXTtcbiAgbWF4U3RlcHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2NsaWVudFwiKTtcbiAgY29uc3QgeyBnZXRTYW5kYm94IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3NhbmRib3hcIik7XG5cbiAgY29uc3QgcnBjID0gaW5wdXQucnBjO1xuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7IGNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZywgcnBjIH0pO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgcG9sbENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgeyBmaXJzdENoZWNrIH0gPSBwb2xsRm9ySW50ZXJydXB0KHtcbiAgICBzdG9yYWdlLFxuICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIHNpZ25hbDogcG9sbENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGFib3J0Q29udHJvbGxlcixcbiAgfSk7XG5cbiAgY29uc3QgW1xuICAgICxcbiAgICBtZXNzYWdlc1Jlc3VsdCxcbiAgICBwYXJ0c1Jlc3VsdCxcbiAgICB7IHNlc3Npb24sIHNhbmRib3gsIHNhbmRib3hSZWNvcmQgfSxcbiAgICBhcGlUb29sc01ldGFkYXRhLFxuICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZpcnN0Q2hlY2ssXG4gICAgc3RvcmFnZS5tZXNzYWdlLmxpc3QoaW5wdXQuc2Vzc2lvbklkKSxcbiAgICBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpLFxuICAgIHN0b3JhZ2Uuc2Vzc2lvbi5nZXQoaW5wdXQuc2Vzc2lvbklkKS50aGVuKGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNlc3Npb247XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gc2Vzc2lvbi5zYW5kYm94SWRcbiAgICAgICAgPyBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNlc3Npb24uc2FuZGJveElkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNhbmRib3hSZWNvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgYFNhbmRib3ggbm90IGZvdW5kIGZvciBzZXNzaW9uICR7aW5wdXQuc2Vzc2lvbklkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbmRib3ggPSBnZXRTYW5kYm94KHtcbiAgICAgICAgc2FuZGJveFJlY29yZCxcbiAgICAgICAgc3RvcmFnZUNvbmZpZzogaW5wdXQuc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBzZXNzaW9uLCBzYW5kYm94LCBzYW5kYm94UmVjb3JkIH07XG4gICAgfSksXG4gICAgZmV0Y2hBcGlUb29sc01ldGFkYXRhKHtcbiAgICAgIHJwYyxcbiAgICB9KSxcbiAgXSk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0O1xuICB9XG4gIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcGFydHNSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgaXRlcmF0aW9uLCBtYXJrIGFsbCBtZXNzYWdlcyBpbiB0aGlzIGJhdGNoIGFzIHN0YXJ0ZWQuXG4gICAqIFVzZXIgbWVzc2FnZXMgYXJlIGFsc28gbWFya2VkIGFzIGNvbXBsZXRlZCAodGhleSdyZSBkb25lKS5cbiAgICogVGhlIGFzc2lzdGFudCBtZXNzYWdlIGlzIG9ubHkgbWFya2VkIGFzIHN0YXJ0ZWQgKHN0cmVhbWluZyBpbiBwcm9ncmVzcykuXG4gICAqL1xuICBjb25zdCBzZXRTdGFydGVkUHJvbWlzZSA9XG4gICAgbGFzdFBhcnRJbmRleCA9PT0gMFxuICAgICAgPyAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgcGVuZGluZ01lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKG0pID0+IG0uY3JlYXRlZEF0IDw9IGV2ZW50LmNyZWF0ZWRBdCAmJiBtLnN0YXJ0ZWRBdCA9PT0gbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIHBlbmRpbmdNZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5tZXNzYWdlLnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbS5yb2xlID09PSBcImFzc2lzdGFudFwiID8gbnVsbCA6IG5vdyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBudWxsO1xuXG4gIC8vIE11dGFibGUgcmVmIHNvIG9uU3ViVG9vbENhbGwgY2FuIHdyaXRlIHRvIHRoZSBzdHJlYW0gb25jZSBhdmFpbGFibGVcbiAgY29uc3Qgc3RyZWFtV3JpdGVyUmVmOiB7XG4gICAgY3VycmVudDogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICB9ID0geyBjdXJyZW50OiBudWxsIH07XG5cbiAgY29uc3Qgc3ViVG9vbFBhcnRJZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFNoYXJlZCBjb3VudGVyIGZvciBwYXJ0IGluZGljZXMgXHUyMDE0IHN1Yi10b29sIHBhcnRzIGluY3JlbWVudCB0aGlzIGR1cmluZ1xuICAvLyB0aGUgc3RyZWFtLCB0aGVuIHN0ZXBQYXJ0cyBjb250aW51ZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLlxuICBsZXQgbmV4dFBhcnRJbmRleCA9IGxhc3RQYXJ0SW5kZXg7XG5cbiAgY29uc3Qgb25TdWJUb29sQ2FsbDogT25TdWJUb29sQ2FsbCA9IGFzeW5jICh0b29sTmFtZSwgdG9vbElucHV0LCBleGVjdXRlKSA9PiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB0b29sIG5lZWRzIGFwcHJvdmFsIHZpYSBSUENcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMoe1xuICAgICAgbWV0aG9kOiBcInRvb2xzLm5lZWRzQXBwcm92YWxcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKFwiZXJyb3JcIiBpbiByZXMgfHwgcmVzLnJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gTm8gYXBwcm92YWwgbmVlZGVkIFx1MjAxNCBqdXN0IGV4ZWN1dGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcHJvdmFsIG5lZWRlZCBcdTIwMTQgc3VyZmFjZSB0byB1c2VyIHZpYSBzdHJlYW0gZXZlbnRzXG4gICAgY29uc3QgYXBwcm92YWxJZCA9IGBqc19hcHByb3ZhbF8ke3VsaWQoKX1gO1xuICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBganNfdGNfJHt1bGlkKCl9YDtcbiAgICBjb25zdCBwYXJ0SWQgPSBgcGFydF8ke3VsaWQoKX1gO1xuICAgIHN1YlRvb2xQYXJ0SWRzLnB1c2gocGFydElkKTtcblxuICAgIC8vIFN0b3JlIGFwcHJvdmFsLXJlcXVlc3QgcGFydFxuICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgaWQ6IHBhcnRJZCxcbiAgICAgIGluZGV4OiBuZXh0UGFydEluZGV4KyssXG4gICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgcGFydDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke3Rvb2xOYW1lfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcImFwcHJvdmFsLXJlcXVlc3RlZFwiLFxuICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICBhcHByb3ZhbDogeyBpZDogYXBwcm92YWxJZCB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl0sXG4gICAgfSk7XG5cbiAgICAvLyBXcml0ZSBzdHJlYW0gZXZlbnRzIGZvciB0aGUgVUlcbiAgICAvLyB0b29sLWlucHV0LXN0YXJ0IGlzIHJlcXVpcmVkIFx1MjAxNCB0aGUgQUkgU0RLIGNsaWVudCBjcmVhdGVzIHRoZSB0b29sIHBhcnRcbiAgICAvLyB3aGVuIGl0IHNlZXMgdGhpcyBldmVudC4gV2l0aG91dCBpdCwgc3Vic2VxdWVudCBldmVudHMgYXJlIGlnbm9yZWQuXG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICB9KTtcbiAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgICB0b29sTmFtZSxcbiAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgfSk7XG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgYXBwcm92YWxJZCxcbiAgICAgIHRvb2xDYWxsSWQsXG4gICAgfSk7XG5cbiAgICAvLyBQb2xsIHN0b3JhZ2UgZm9yIGFwcHJvdmFsIHJlc3BvbnNlXG4gICAgY29uc3QgUE9MTF9NUyA9IDUwMDtcbiAgICBjb25zdCBUSU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgVElNRU9VVF9NUykge1xuICAgICAgY29uc3QgcGFydHMgPSBhd2FpdCBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpO1xuICAgICAgaWYgKCEocGFydHMgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHBhcnRzLml0ZW1zLmZpbmQoXG4gICAgICAgICAgKHApID0+XG4gICAgICAgICAgICBwLmlkID09PSBwYXJ0SWQgJiZcbiAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgY29uc3QgYXBwcm92YWwgPSAoXG4gICAgICAgICAgICB1cGRhdGVkLnBhcnQgYXMge1xuICAgICAgICAgICAgICBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICAgIGlmIChhcHByb3ZhbD8uYXBwcm92ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogZXJyb3IsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZW5pZWRcbiAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHthcHByb3ZhbD8ucmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBlcnJvcjogXCJBcHByb3ZhbCB0aW1lZCBvdXRcIiB9O1xuICB9O1xuXG4gIGNvbnN0IHJhd1Rvb2xzID0gZ2V0VG9vbHMoe1xuICAgIGlucHV0LFxuICAgIGV2ZW50LFxuICAgIHNhbmRib3gsXG4gICAgc2Vzc2lvbixcbiAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQsXG4gICAgYXBpVG9vbHNNZXRhZGF0YSxcbiAgICBvblN1YlRvb2xDYWxsLFxuICB9KTtcblxuICBpZiAoIXNlc3Npb24ubW9kZWwpIHtcbiAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcIlNlc3Npb24gbW9kZWwgaXMgbm90IHNldFwiKTtcbiAgfVxuXG4gIGNvbnN0IGFsbFBhcnRzID0gcGFydHNSZXN1bHQuaXRlbXM7XG4gIGNvbnN0IHVzYWdlU3RlcHM6IFN0ZXBVc2FnZVtdID0gW107XG4gIGxldCBpbnRlcm5hbFN0ZXBJbmRleCA9IDA7XG5cbiAgY29uc3QgdG9vbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmF3VG9vbHMpLm1hcCgoW25hbWUsIHRdKSA9PiBbXG4gICAgICBuYW1lLFxuICAgICAge1xuICAgICAgICAuLi50LFxuICAgICAgICBuZWVkc0FwcHJvdmFsOiBhc3luYyAoXG4gICAgICAgICAgdG9vbElucHV0OiB1bmtub3duLFxuICAgICAgICAgIG9wdHM6IHsgdG9vbENhbGxJZDogc3RyaW5nOyBtZXNzYWdlczogdW5rbm93bltdIH1cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcnBjKHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJ0b29scy5uZWVkc0FwcHJvdmFsXCIsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdG9vbE5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IG9wdHMudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IG9wdHMubWVzc2FnZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcmVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB0b29scy5uZWVkc0FwcHJvdmFsIFJQQyBmYWlsZWQgZm9yICR7bmFtZX06ICR7cmVzLmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcy5yZXN1bHQgYXMgYm9vbGVhbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSlcbiAgKTtcblxuICBsZXQgc2tpbGxzUmVmOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHN0cmVhbVRleHQoe1xuICAgIC8vIFBsYWNlaG9sZGVyIHRvIHBhc3MgdmFsaWRhdGlvbiBcdTIwMTQgcHJlcGFyZVN0ZXAgcmVwbGFjZXMgbWVzc2FnZXMgZW50aXJlbHkuXG4gICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiIGFzIGNvbnN0LCBjb250ZW50OiBcIi5cIiB9XSxcbiAgICB0b29scyxcbiAgICBtb2RlbDogc2Vzc2lvbi5tb2RlbCxcbiAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBhY3RpdmVUb29sczogc2Vzc2lvbi5hY3RpdmVUb29scyA/PyB1bmRlZmluZWQsXG4gICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDEpLFxuICAgIHRlbXBlcmF0dXJlOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRlbXBlcmF0dXJlLFxuICAgIHRvcEs6IHNlc3Npb24uZ2VuZXJhdGlvbj8udG9wSyxcbiAgICB0b3BQOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRvcFAsXG4gICAgZnJlcXVlbmN5UGVuYWx0eTogc2Vzc2lvbi5nZW5lcmF0aW9uPy5mcmVxdWVuY3lQZW5hbHR5LFxuICAgIHByZXNlbmNlUGVuYWx0eTogc2Vzc2lvbi5nZW5lcmF0aW9uPy5wcmVzZW5jZVBlbmFsdHksXG4gICAgbWF4T3V0cHV0VG9rZW5zOiBzZXNzaW9uLmdlbmVyYXRpb24/Lm1heE91dHB1dFRva2VucyxcbiAgICBoZWFkZXJzOiBzZXNzaW9uLmdlbmVyYXRpb24/LmhlYWRlcnMsXG4gICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHtcbiAgICAgIHNlc3Npb24sXG4gICAgICBzYW5kYm94LFxuICAgICAgc3RvcmFnZSxcbiAgICAgIGNvbnRleHQ6IGV2ZW50LmNvbnRleHQsXG4gICAgfSxcbiAgICBwcmVwYXJlU3RlcDogYXN5bmMgKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgLy8gT24gdGhlIGZpcnN0IHN0ZXAsIGVtaXQgc2FuZGJveCBzdGF0dXMsIGF3YWl0IHNldHVwLCBhbmQgbG9hZCBza2lsbHMuXG4gICAgICAvLyBzdHJlYW1Xcml0ZXJSZWYgaXMgc2V0IGJ5IHRoZSBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0gZXhlY3V0b3JcbiAgICAgIC8vIHdoaWNoIHJ1bnMgYmVmb3JlIHByZXBhcmVTdGVwIChhZnRlciBgc3RhcnRgIGlzIHdyaXR0ZW4pLlxuICAgICAgaWYgKGxhc3RQYXJ0SW5kZXggPT09IDApIHtcbiAgICAgICAgaWYgKHNhbmRib3guX3NldHVwTWV0YSkge1xuICAgICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBzYW5kYm94Ll9zZXR1cE1ldGE7XG4gICAgICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgICAgc3RhdHVzOiBtZXRhLm5lZWRzU2V0dXBSdW5cbiAgICAgICAgICAgICAgPyB7IHR5cGU6IFwic2FuZGJveC1zZXR1cC1jb2xkXCIgfVxuICAgICAgICAgICAgICA6IHsgdHlwZTogXCJzYW5kYm94LXNldHVwXCIgfSxcbiAgICAgICAgICAgIHJwYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2FuZGJveC5fb25SZWFkeSkge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3guX29uUmVhZHk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0U3RhdHVzKHtcbiAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcImxvYWRpbmctc2tpbGxzXCIgfSxcbiAgICAgICAgICBycGMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBza2lsbHMgPSBhd2FpdCBkaXNjb3ZlclNraWxsc0luU2FuZGJveCh7XG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICBza2lsbHNEaXJzOiBzZXNzaW9uLnNraWxsc0RpciB8fCBbXSxcbiAgICAgICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNraWxsc1JlZiA9IHNraWxscztcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSBhcHByb3ZlZCB0b29scyBzbyB0aGUgbW9kZWwgc2VlcyBjb21wbGV0ZSB0b29sIGNhbGwgKyByZXN1bHRcbiAgICAgIC8vIHBhaXJzLiBUaGlzIHJ1bnMgb3V0c2lkZSB0aGUgbGFzdFBhcnRJbmRleCA9PT0gMCBnYXRlIGJlY2F1c2VcbiAgICAgIC8vIGFwcHJvdmFscyBhcnJpdmUgb24gc3Vic2VxdWVudCBtZXNzYWdlcyAobGFzdFBhcnRJbmRleCA+IDApLlxuICAgICAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgcC5wYXJ0ICYmXG4gICAgICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiICYmXG4gICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ/OiBib29sZWFuIH0gfSkuYXBwcm92YWxcbiAgICAgICAgICAgID8uYXBwcm92ZWQgPT09IHRydWVcbiAgICAgICk7XG5cbiAgICAgIGlmIChhcHByb3ZlZFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW1pdFN0YXR1cyh7XG4gICAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJwcm9jZXNzaW5nLWFwcHJvdmFsc1wiIH0sXG4gICAgICAgICAgcnBjLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBCdWlsZCBjb250ZXh0IG1lc3NhZ2VzIGZvciB0b29sIGV4ZWN1dGUgKGluY29tcGxldGUgY2FsbHMgZmlsdGVyZWQgb3V0KS5cbiAgICAgICAgY29uc3QgcHJlRXhlY01lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgICBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLFxuICAgICAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICAgICAgdW50aWw6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIGluY2x1ZGVRdWV1ZWQ6IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHsgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYXBwcm92ZWRQYXJ0cy5tYXAoYXN5bmMgKGFwKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFwLnBhcnQudHlwZS5zdGFydHNXaXRoKFwidG9vbC1cIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFydCA9IGFwLnBhcnQgYXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgICAgICAgeyB0eXBlOiBgdG9vbC0ke3N0cmluZ31gIH1cbiAgICAgICAgICAgID47XG4gICAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcnQudHlwZS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB0b29sRGVmID0gcmF3VG9vbHNbdG9vbE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAodG9vbERlZj8uZXhlY3V0ZSAmJiBwYXJ0LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sT3V0cHV0ID0gYXdhaXQgdG9vbERlZi5leGVjdXRlKHBhcnQuaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcmVFeGVjTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGV2ZW50LmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1hdmFpbGFibGVcIjtcbiAgICAgICAgICAgICAgICBwYXJ0Lm91dHB1dCA9IHRvb2xPdXRwdXQ7XG4gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgb3V0cHV0OiB0b29sT3V0cHV0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgICAgICAgICBwYXJ0LmVycm9yVGV4dCA9XG4gICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBlcnJvclRleHQ6IHBhcnQuZXJyb3JUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoeyAuLi5hcCwgcGFydCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBlbWl0U3RhdHVzKHtcbiAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwidGhpbmtpbmdcIiB9LFxuICAgICAgICBycGMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2tpbGxzQ29udGV4dCA9IGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHNSZWYpO1xuICAgICAgY29uc3Qgc3lzdGVtSGVhZGVyID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICBCQVNFX1NZU1RFTV9QUk9NUFQsXG4gICAgICAgIHNlc3Npb24uc3lzdGVtXG4gICAgICApO1xuICAgICAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhza2lsbHNDb250ZXh0KTtcbiAgICAgIGNvbnN0IHN5c3RlbU1lc3NhZ2VzID0gW1xuICAgICAgICAuLi4oc3lzdGVtSGVhZGVyLnRyaW0oKVxuICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtSGVhZGVyIH1dXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihzeXN0ZW1Db250ZXh0LnRyaW0oKVxuICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtQ29udGV4dCB9XVxuICAgICAgICAgIDogW10pLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdWlNZXNzYWdlcyA9IGFzc2VtYmxlVUlNZXNzYWdlcyh7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICB1bnRpbDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vZGVsTWVzc2FnZXMgPSBbXG4gICAgICAgIC4uLnN5c3RlbU1lc3NhZ2VzLFxuICAgICAgICAuLi4oYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyh1aU1lc3NhZ2VzLCB7XG4gICAgICAgICAgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSxcbiAgICAgICAgfSkpLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgcHJvbXB0Q2FjaGluZyA9IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0KHtcbiAgICAgICAgbW9kZWw6IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogbW9kZWwubW9kZWxJZCxcbiAgICAgICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBtb2RlbE1lc3NhZ2VzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2VzOiBwcm9tcHRDYWNoaW5nLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IHByb21wdENhY2hpbmcucHJvdmlkZXJPcHRpb25zLFxuICAgICAgfTtcbiAgICB9LFxuICAgIG9uU3RlcEZpbmlzaDogKHsgdXNhZ2UgfSkgPT4ge1xuICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgIHVzYWdlU3RlcHMucHVzaCh7XG4gICAgICAgICAgc3RlcEluZGV4OiBzdGVwSW5kZXhPZmZzZXQgKyBpbnRlcm5hbFN0ZXBJbmRleCxcbiAgICAgICAgICBtb2RlbDogc2Vzc2lvbi5tb2RlbCA/PyBcInVua25vd25cIixcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIHRvdGFsVG9rZW5zOiB1c2FnZS50b3RhbFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlUmVhZFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbkRldGFpbHM/LmNhY2hlUmVhZFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlV3JpdGVUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5EZXRhaWxzPy5jYWNoZVdyaXRlVG9rZW5zID8/IDAsXG4gICAgICAgICAgcmVhc29uaW5nVG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbkRldGFpbHM/LnJlYXNvbmluZ1Rva2VucyA/PyAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGludGVybmFsU3RlcEluZGV4Kys7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcFBhcnRzOiBVSU1lc3NhZ2VbXCJwYXJ0c1wiXSA9IFtdO1xuICBsZXQgd2FzQWJvcnRlZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgIGV4ZWN1dGU6ICh7IHdyaXRlciB9KSA9PiB7XG4gICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50ID0gKGV2ZW50OiB1bmtub3duKSA9PlxuICAgICAgICAgIHdyaXRlci53cml0ZShldmVudCBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB3cml0ZXIud3JpdGU+WzBdKTtcblxuICAgICAgICAvLyBNZXJnZSB0aGUgc3RyZWFtVGV4dCBzdHJlYW0uIHByZXBhcmVTdGVwIGhhbmRsZXMgc2FuZGJveCBzZXR1cCxcbiAgICAgICAgLy8gc2tpbGxzIGxvYWRpbmcsIGFwcHJvdmFsIGV4ZWN1dGlvbiwgYW5kIHN0YXR1cyBlbWlzc2lvbiBiZWZvcmVcbiAgICAgICAgLy8gdGhlIG1vZGVsIHN0YXJ0cyBnZW5lcmF0aW5nLlxuICAgICAgICB3cml0ZXIubWVyZ2UoXG4gICAgICAgICAgcmVzdWx0LnRvVUlNZXNzYWdlU3RyZWFtKHtcbiAgICAgICAgICAgIGdlbmVyYXRlTWVzc2FnZUlkOiAoKSA9PiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICBvbkZpbmlzaDogKHsgbWVzc2FnZXMgfSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgaGFzQXBwcm92YWxzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBQYXJ0cy5wdXNoKC4uLm0ucGFydHMpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIG0ucGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RhdGVcIiBpbiBwICYmIHAuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNBcHByb3ZhbHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoYXNBcHByb3ZhbHMpIHtcbiAgICAgICAgICAgICAgICBlbWl0U3RhdHVzKHtcbiAgICAgICAgICAgICAgICAgIHdyaXRlcjogc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IHsgdHlwZTogXCJuZWVkcy1hcHByb3ZhbFwiIH0sXG4gICAgICAgICAgICAgICAgICBycGMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBzdHJlYW0ucGlwZVRvKHdyaXRhYmxlLCB7IHByZXZlbnRDbG9zZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgd2FzQWJvcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbc3RyZWFtVGV4dFN0ZXBdIHN0cmVhbSBlcnJvcjpcIiwgZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcG9sbENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHN0ZXBQYXJ0cy5tYXAoYXN5bmMgKHVpUGFydCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5wYXJ0LnNldCh7XG4gICAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgICBpbmRleDogbmV4dFBhcnRJbmRleCsrLFxuICAgICAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIHBhcnQ6IHVpUGFydCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSlcbiAgKTtcblxuICBpZiAoc2V0U3RhcnRlZFByb21pc2UpIHtcbiAgICBjb25zdCBzZXRTdGFydGVkUmVzdWx0ID0gYXdhaXQgc2V0U3RhcnRlZFByb21pc2U7XG4gICAgaWYgKHNldFN0YXJ0ZWRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgc2V0U3RhcnRlZFJlc3VsdDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtIG9mIHNldFN0YXJ0ZWRSZXN1bHQgPz8gW10pIHtcbiAgICAgIGlmIChtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gc3RlcFBhcnRzXG4gICAgLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyB0eXBlb2YgcCAmIHsgYXBwcm92YWw6IHsgaWQ6IHN0cmluZyB9IH0gPT5cbiAgICAgICAgXCJzdGF0ZVwiIGluIHAgJiZcbiAgICAgICAgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiAmJlxuICAgICAgICBcImFwcHJvdmFsXCIgaW4gcCAmJlxuICAgICAgICAhIShwIGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWRcbiAgICApXG4gICAgLm1hcCgocCkgPT4gKHtcbiAgICAgIGFwcHJvdmFsSWQ6IHAuYXBwcm92YWwuaWQsXG4gICAgICB0b29sTmFtZTogXCJ0eXBlXCIgaW4gcCA/IFN0cmluZyhwLnR5cGUpLnJlcGxhY2UoXCJ0b29sLVwiLCBcIlwiKSA6IFwidW5rbm93blwiLFxuICAgIH0pKTtcblxuICBjb25zdCBmaW5hbEZpbmlzaFJlYXNvbiA9IHdhc0Fib3J0ZWRcbiAgICA/IChcInN0b3BcIiBhcyBGaW5pc2hSZWFzb24pXG4gICAgOiBhd2FpdCByZXN1bHQuZmluaXNoUmVhc29uO1xuXG4gIHJldHVybiB7XG4gICAgZmluaXNoUmVhc29uOiBmaW5hbEZpbmlzaFJlYXNvbixcbiAgICBsYXN0UGFydEluZGV4OiBuZXh0UGFydEluZGV4LFxuICAgIHVzYWdlU3RlcHMsXG4gICAgcGVuZGluZ0FwcHJvdmFscyxcbiAgICBtYXhTdGVwczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhTdGVwcyxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNraWxsc0RpciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUGFyc2VkIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZyb250bWF0dGVyID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIGZyb20gYSBTS0lMTC5tZCBmaWxlIGNvbnRlbnQuXG4gKiBGcm9udG1hdHRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgZGVsaW1pdGVkIGJ5IGAtLS1gIG1hcmtlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYG1hcmtkb3duXG4gKiAtLS1cbiAqIG5hbWU6IGNzdlxuICogZGVzY3JpcHRpb246IEFuYWx5emUgQ1NWIGRhdGFcbiAqIC0tLVxuICogIyBDU1YgU2tpbGxcbiAqIC4uLlxuICogYGBgXG4gKlxuICogQHJldHVybnMgUGFyc2VkIG5hbWUgYW5kIGRlc2NyaXB0aW9uLCBvciBudWxsIGlmIGZyb250bWF0dGVyIGlzIG1pc3NpbmcvaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKFxuICBjb250ZW50OiBzdHJpbmdcbik6IFNraWxsRnJvbnRtYXR0ZXIgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IGNvbnRlbnQudHJpbSgpO1xuXG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBlbmRNYXJrZXJJbmRleCA9IHRyaW1tZWQuaW5kZXhPZihcIi0tLVwiLCAzKTtcbiAgaWYgKGVuZE1hcmtlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXJCbG9jayA9IHRyaW1tZWQuc2xpY2UoMywgZW5kTWFya2VySW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTaW1wbGVZYW1sKGZyb250bWF0dGVyQmxvY2spO1xuXG4gIGlmICghKHBhcnNlZC5uYW1lICYmIHBhcnNlZC5kZXNjcmlwdGlvbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogU3RyaW5nKHBhcnNlZC5uYW1lKSxcbiAgICBkZXNjcmlwdGlvbjogU3RyaW5nKHBhcnNlZC5kZXNjcmlwdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHNpbXBsZSBZQU1MIGtleS12YWx1ZSBwYWlycyAoc2luZ2xlLWxpbmUgdmFsdWVzIG9ubHkpLlxuICogVGhpcyBhdm9pZHMgYWRkaW5nIGEgZnVsbCBZQU1MIHBhcnNlciBkZXBlbmRlbmN5IGZvciBiYXNpYyBmcm9udG1hdHRlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaW1wbGVZYW1sKHlhbWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgeWFtbC5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb25JbmRleCA9IHRyaW1tZWRMaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpO1xuICAgIGxldCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnNsaWNlKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzIGlmIHByZXNlbnRcbiAgICBpZiAoXG4gICAgICAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpXG4gICAgKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBza2lsbHNEaXIgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyPzogU2tpbGxzRGlyKTogc3RyaW5nW10ge1xuICBpZiAoIXNraWxsc0Rpcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShza2lsbHNEaXIpID8gc2tpbGxzRGlyIDogW3NraWxsc0Rpcl07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB7IHBhcnNlU2tpbGxGcm9udG1hdHRlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIERpc2NvdmVycyBza2lsbHMgZnJvbSBkaXJlY3RvcmllcyBpbnNpZGUgdGhlIHNhbmRib3ggYnkgZmluZGluZyBhbmQgcGFyc2luZyBTS0lMTC5tZCBmaWxlcy5cbiAqIFNjYW5zIGVhY2ggZGlyZWN0b3J5IGZvciBzdWJkaXJlY3RvcmllcyBjb250YWluaW5nIFNLSUxMLm1kLCBleHRyYWN0cyBmcm9udG1hdHRlciBtZXRhZGF0YSxcbiAqIGFuZCByZXR1cm5zIHN1bW1hcmllcyBmb3IgdXNlIGluIHRoZSBzeXN0ZW0gcHJvbXB0LlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIHNraWxsIHN1bW1hcmllcyAoZGVkdXBsaWNhdGVkIGJ5IG5hbWUsIGZpcnN0IG9jY3VycmVuY2Ugd2lucylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94KG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyczogc3RyaW5nW107XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlycywgZGVidWcgfSA9IG9wdHM7XG5cbiAgY29uc3Qgc3VtbWFyaWVzOiBTa2lsbFN1bW1hcnlbXSA9IFtdO1xuICBjb25zdCBzZWVuTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHNraWxsc0RpciBvZiBza2lsbHNEaXJzKSB7XG4gICAgY29uc3QgZGlyU3VtbWFyaWVzID0gYXdhaXQgZGlzY292ZXJTa2lsbHNJbkRpcmVjdG9yeSh7XG4gICAgICBzYW5kYm94LFxuICAgICAgc2tpbGxzRGlyLFxuICAgICAgZGVidWcsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgZGlyU3VtbWFyaWVzKSB7XG4gICAgICBpZiAoIXNlZW5OYW1lcy5oYXMoc3VtbWFyeS5uYW1lKSkge1xuICAgICAgICBzZWVuTmFtZXMuYWRkKHN1bW1hcnkubmFtZSk7XG4gICAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbHNEaXI6IHN0cmluZztcbiAgZGVidWc/OiBib29sZWFuO1xufSk6IFByb21pc2U8U2tpbGxTdW1tYXJ5W10+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0gPSBvcHRzO1xuICBjb25zdCBza2lsbFBhdGhzID0gYXdhaXQgZmluZFNraWxsRmlsZXMoeyBzYW5kYm94LCBza2lsbHNEaXIsIGRlYnVnIH0pO1xuXG4gIGlmIChza2lsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNraWxsTWRQYXRoIG9mIHNraWxsUGF0aHMpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgcGFyc2VTa2lsbEZpbGUoeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgZGVidWcgfSk7XG4gICAgaWYgKHN1bW1hcnkpIHtcbiAgICAgIHN1bW1hcmllcy5wdXNoKHN1bW1hcnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRTa2lsbEZpbGVzKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9ID0gb3B0cztcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImZpbmRcIixcbiAgICBhcmdzOiBbc2tpbGxzRGlyLCBcIi1uYW1lXCIsIFwiU0tJTEwubWRcIiwgXCItdHlwZVwiLCBcImZcIl0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gRmFpbGVkIHRvIHNjYW4gc2tpbGxzIGRpcmVjdG9yeSBcIiR7c2tpbGxzRGlyfVwiOiAke2V4ZWNSZXN1bHQubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkaXNjb3Zlcl0gZmluZCByZXN1bHQ6IGV4aXRDb2RlPSR7ZXhpdENvZGV9LCBzdGRvdXQ9XCIke3N0ZG91dC50cmltKCl9XCIsIHN0ZGVycj1cIiR7c3RkZXJyLnRyaW0oKX1cImBcbiAgICApO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIFNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGluYWNjZXNzaWJsZTogJHtza2lsbHNEaXJ9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGF0aHMgPSBzdGRvdXRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLmZpbHRlcigocCkgPT4gcC5sZW5ndGggPiAwKTtcbiAgaWYgKGRlYnVnKSB7XG4gICAgY29uc29sZS5sb2coXCJbZGlzY292ZXJdIEZvdW5kIHNraWxsIHBhdGhzOlwiLCBwYXRocyk7XG4gIH1cbiAgcmV0dXJuIHBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVNraWxsRmlsZShvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsTWRQYXRoOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeSB8IG51bGw+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBza2lsbE1kUGF0aCwgZGVidWcgfSA9IG9wdHM7XG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwiY2F0XCIsXG4gICAgYXJnczogW3NraWxsTWRQYXRoXSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBGYWlsZWQgdG8gcmVhZCBza2lsbCBmaWxlIFwiJHtza2lsbE1kUGF0aH1cIjogJHtleGVjUmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKGBbZGlzY292ZXJdIENvdWxkIG5vdCByZWFkIHNraWxsIGZpbGU6ICR7c2tpbGxNZFBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VTa2lsbEZyb250bWF0dGVyKHN0ZG91dCk7XG5cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gSW52YWxpZCBvciBtaXNzaW5nIGZyb250bWF0dGVyIGluOiAke3NraWxsTWRQYXRofWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYXJzZWQubmFtZSxcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VkLmRlc2NyaXB0aW9uLFxuICAgIHNraWxsTWRQYXRoLFxuICB9O1xufVxuIiwgImltcG9ydCB7IGpzb25TY2hlbWEsIHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRJbnB1dCwgQWdlbnRNZXNzYWdlSW5wdXQgfSBmcm9tIFwiLi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgUnBjUGF5bG9hZCwgUnBjUmVzdWx0IH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB7IERFRkFVTFRfV0FJVF9VTlRJTCB9IGZyb20gXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTZXNzaW9uLCBTdG9yYWdlIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGNyZWF0ZUphdmFTY3JpcHRUb29sLCB0eXBlIE9uU3ViVG9vbENhbGwgfSBmcm9tIFwiLi9qYXZhc2NyaXB0XCI7XG5cbmNvbnN0IEFHRU5UX1BST1RPQ09MX1ZFUlNJT04gPSBcInYxXCI7XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSB7XG4gICAgcmV0dXJuIGAke2J5dGVzfWA7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX1LYDtcbiAgfVxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX1NYDtcbiAgfVxuICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9R2A7XG59XG5cbnR5cGUgSW50ZXJuYWxUb29sQ29udGV4dCA9IHtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgYXBpVG9vbHNNZXRhZGF0YToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBpbnB1dFNjaGVtYT86IHVua25vd247XG4gIH1bXTtcbiAgb25TdWJUb29sQ2FsbD86IE9uU3ViVG9vbENhbGw7XG59O1xuXG5leHBvcnQgdHlwZSBUb29sQ29udGV4dDxUQ29udGV4dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgY29udGV4dDogVENvbnRleHQ7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbHRJblRvb2xzID0ge1xuICBSZWFkOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50cyB3aXRoIG1ldGFkYXRhLiBGb3IgZmlsZXMgb3ZlciAyMDAgbGluZXMsIGF1dG9tYXRpY2FsbHkgc2hvd3MgZmlyc3QgMTAwIGxpbmVzIHVubGVzcyBhIHNwZWNpZmljIGxpbmUgcmFuZ2UgaXMgcHJvdmlkZWQuIFVzZSBzdGFydExpbmUgYW5kIGVuZExpbmUgcGFyYW1ldGVycyB0byByZWFkIHNwZWNpZmljIHBvcnRpb25zIG9mIGxhcmdlIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIHN0YXJ0TGluZTogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3RhcnRpbmcgbGluZSBudW1iZXIgKDEtaW5kZXhlZCkuIElmIHByb3ZpZGVkIHdpdGggZW5kTGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICAgIGVuZExpbmU6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkVuZGluZyBsaW5lIG51bWJlciAoMS1pbmRleGVkLCBpbmNsdXNpdmUpLiBJZiBwcm92aWRlZCB3aXRoIHN0YXJ0TGluZSwgcmVhZHMgZXhhY3QgcmFuZ2UgcmVnYXJkbGVzcyBvZiBmaWxlIHNpemUuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJGaWxlIGNvbnRlbnRcIiksXG4gICAgICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgICAgICB0b3RhbExpbmVzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmaWxlXCIpLFxuICAgICAgICBsaW5lc1Nob3duOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGxpbmVzIGluY2x1ZGVkIGluIHRoaXMgcmVzcG9uc2VcIiksXG4gICAgICAgIHN0YXJ0TGluZTogei5udW1iZXIoKS5kZXNjcmliZShcIkZpcnN0IGxpbmUgbnVtYmVyIHNob3duICgxLWluZGV4ZWQpXCIpLFxuICAgICAgICBlbmRMaW5lOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTGFzdCBsaW5lIG51bWJlciBzaG93biAoMS1pbmRleGVkKVwiKSxcbiAgICAgICAgaXNQYWdpbmF0ZWQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiV2hldGhlciB0aGlzIGlzIGEgcGFydGlhbCB2aWV3IG9mIHRoZSBmaWxlXCIpLFxuICAgICAgICBmaWxlU2l6ZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5kZXNjcmliZShcIkh1bWFuLXJlYWRhYmxlIGZpbGUgc2l6ZSAoZS5nLiwgJzIuNUsnLCAnMS4yTScpXCIpLFxuICAgICAgICBwYXRoOiB6XG4gICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbiAgR3JlcDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBmb3IgcGF0dGVybnMgaW4gZmlsZXMgdXNpbmcgcmlwZ3JlcC4gVXNlIHRoaXMgdG8gZmluZCBjb2RlIHBhdHRlcm5zLCBmdW5jdGlvbiBkZWZpbml0aW9ucywgaW1wb3J0cywgZXRjLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJSZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgKHJpcGdyZXAgc3ludGF4KVwiKSxcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlBhdGggdG8gc2VhcmNoIGluIChkZWZhdWx0cyB0byB3b3Jrc3BhY2Ugcm9vdCkuIENhbiBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5LlwiXG4gICAgICAgICksXG4gICAgICBmaWxlVHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRmlsZSB0eXBlIHRvIGZpbHRlciBieSAoZS5nLiwgJ3RzJywgJ2pzJywgJ3B5JywgJ21kJykuIFVzZXMgcmlwZ3JlcCdzIGJ1aWx0LWluIHR5cGUgZmlsdGVycy5cIlxuICAgICAgICApLFxuICAgICAgZ2xvYjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciBmaWxlcyAoZS5nLiwgJyoudHN4JywgJ3NyYy8qKi8qLnRzJylcIlxuICAgICAgICApLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgIC5kZXNjcmliZShcIldoZXRoZXIgc2VhcmNoIGlzIGNhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiB0cnVlKVwiKSxcbiAgICAgIGNvbnRleHRMaW5lczogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gc2hvdyBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggbWF0Y2hcIlxuICAgICAgICApLFxuICAgICAgbWF4Q291bnQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gbnVtYmVyIG9mIG1hdGNoZXMgcGVyIGZpbGUgKHVzZWZ1bCBmb3IgbGltaXRpbmcgb3V0cHV0KVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc1dpdGhNYXRjaGVzOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk9ubHkgc2hvdyBmaWxlIHBhdGhzIHRoYXQgY29udGFpbiBtYXRjaGVzLCBub3QgdGhlIG1hdGNoaW5nIGxpbmVzIHRoZW1zZWx2ZXNcIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWF0Y2hlczogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU2VhcmNoIHJlc3VsdHMgd2l0aCBmaWxlIHBhdGhzLCBsaW5lIG51bWJlcnMsIGFuZCBtYXRjaGluZyBjb250ZW50XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgbWF0Y2hDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBtYXRjaGVzIGZvdW5kXCIpLFxuICAgICAgICBmaWxlQ291bnQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgZmlsZXMgY29udGFpbmluZyBtYXRjaGVzXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBzZWFyY2hlZFwiKSxcbiAgICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdHRlcm4gdGhhdCB3YXMgc2VhcmNoZWQgZm9yXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBMaXN0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVjdXJzaXZlbHkgbGlzdCBkaXJlY3RvcnkgY29udGVudHMuIFVzZSB0aGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvZGViYXNlIHN0cnVjdHVyZSwgZmluZCBmaWxlcywgb3IgZXhwbG9yZSBkaXJlY3Rvcmllcy4gQ29udHJvbCBkZXB0aCB0byBiYWxhbmNlIGRldGFpbCB2cy4gb3ZlcnZpZXcuIERlcHRoIDEgc2hvd3MgaW1tZWRpYXRlIGNoaWxkcmVuLCBkZXB0aCAyIGluY2x1ZGVzIHN1YmRpcmVjdG9yaWVzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlBhdGggdG8gbGlzdCAoZGVmYXVsdHMgdG8gd29ya3NwYWNlIHJvb3QpXCIpLFxuICAgICAgZGVwdGg6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gZGVwdGggdG8gdHJhdmVyc2UuIENob29zZSBiYXNlZCBvbiBjb250ZXh0OiAxLTIgZm9yIHF1aWNrIG92ZXJ2aWV3LCAzLTQgZm9yIGRldGFpbGVkIGV4cGxvcmF0aW9uLCA1KyBmb3IgY29tcHJlaGVuc2l2ZSBtYXBwaW5nXCJcbiAgICAgICAgKSxcbiAgICAgIGluY2x1ZGVIaWRkZW46IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSW5jbHVkZSBoaWRkZW4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICh0aG9zZSBzdGFydGluZyB3aXRoICcuJylcIlxuICAgICAgICApLFxuICAgICAgZmlsZXNPbmx5OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcIk9ubHkgc2hvdyBmaWxlcywgbm90IGRpcmVjdG9yaWVzXCIpLFxuICAgICAgcGF0dGVybjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciByZXN1bHRzIChlLmcuLCAnKi50cycsICcqdGVzdConKVwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxpc3Rpbmc6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkRpcmVjdG9yeSB0cmVlIGxpc3Rpbmcgc2hvd2luZyBwYXRocyByZWxhdGl2ZSB0byBzZWFyY2ggcm9vdFwiXG4gICAgICAgICksXG4gICAgICBzdW1tYXJ5OiB6Lm9iamVjdCh7XG4gICAgICAgIHRvdGFsSXRlbXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgaXRlbXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRmlsZXM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJUb3RhbCBudW1iZXIgb2YgZmlsZXMgZm91bmRcIiksXG4gICAgICAgIHRvdGFsRGlyczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBkaXJlY3RvcmllcyBmb3VuZFwiKSxcbiAgICAgICAgc2VhcmNoUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdGhhdCB3YXMgbGlzdGVkXCIpLFxuICAgICAgICBkZXB0aDogelxuICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiTWF4aW11bSBkZXB0aCB1c2VkIChpZiBzcGVjaWZpZWQpXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBXcml0ZTogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIldyaXRlIGNvbnRlbnQgdG8gYSBmaWxlLiBDcmVhdGVzIHBhcmVudCBkaXJlY3RvcmllcyBhdXRvbWF0aWNhbGx5LiBPdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdFwiKSxcbiAgICAgIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDb250ZW50IHRvIHdyaXRlIHRvIHRoZSBmaWxlXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3VjY2Vzczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJXaGV0aGVyIHRoZSB3cml0ZSBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgd3JpdHRlbiBmaWxlXCIpLFxuICAgICAgYnl0ZXNXcml0dGVuOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiB3cml0ZSBmYWlsZWRcIiksXG4gICAgfSksXG4gIH0pLFxuICBFZGl0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRWRpdCBhIGZpbGUgYnkgcmVwbGFjaW5nIGFuIGV4YWN0IHN0cmluZy4gRmFpbHMgaWYgb2xkX3N0cmluZyBpcyBub3QgZm91bmQgb3IgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyAobm90IHVuaXF1ZSkuIEZvciBtdWx0aXBsZSByZXBsYWNlbWVudHMsIGNhbGwgdGhpcyB0b29sIG11bHRpcGxlIHRpbWVzIHdpdGggdW5pcXVlIGNvbnRleHQuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgb2xkX3N0cmluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRXhhY3Qgc3RyaW5nIHRvIGZpbmQgYW5kIHJlcGxhY2UgKG11c3QgYmUgdW5pcXVlIGluIGZpbGUpXCIpLFxuICAgICAgbmV3X3N0cmluZzogei5zdHJpbmcoKS5kZXNjcmliZShcIlN0cmluZyB0byByZXBsYWNlIG9sZF9zdHJpbmcgd2l0aFwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN1Y2Nlc3M6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgZWRpdCBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZWRpdGVkIGZpbGVcIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiBlZGl0IGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEJhc2g6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFeGVjdXRlcyBhIGJhc2ggY29tbWFuZCBpbnNpZGUgdGhlIHdvcmtzcGFjZS4gQ1dEIHBlcnNpc3RzIGJldHdlZW4gY29tbWFuZHMgd2l0aGluIGEgc2Vzc2lvbi4gVXNlIHdhaXRVbnRpbDowIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NlcyAoZGV2IHNlcnZlcnMpLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb21tYW5kOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVGhlIHNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZVwiKSxcbiAgICAgIHdhaXRVbnRpbDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIGBNYXggbXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbiAoZGVmYXVsdDogJHtERUZBVUxUX1dBSVRfVU5USUx9KS4gVXNlIDAgdG8gcnVuIGluIGJhY2tncm91bmQgYW5kIHJldHVybiBpbW1lZGlhdGVseS5gXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBwaWQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlN5c3RlbSBQSUQgKDAgZm9yIGZvcmVncm91bmQsID4wIGZvciBiYWNrZ3JvdW5kIC0gdXNlIHRvIGtpbGwpXCJcbiAgICAgICAgKSxcbiAgICAgIG91dHB1dDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQ29tbWFuZCBzdGRvdXQrc3RkZXJyIGNvbWJpbmVkIChlbXB0eSBmb3IgYmFja2dyb3VuZClcIiksXG4gICAgICBleGl0Q29kZTogei5udW1iZXIoKS5kZXNjcmliZShcIkV4aXQgY29kZSAoLTEgZm9yIGJhY2tncm91bmQvcnVubmluZylcIiksXG4gICAgICBzdGF0dXM6IHpcbiAgICAgICAgLmVudW0oW1wicnVubmluZ1wiLCBcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiXSlcbiAgICAgICAgLmRlc2NyaWJlKFwiUHJvY2VzcyBzdGF0dXNcIiksXG4gICAgICBjd2Q6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFmdGVyIGNvbW1hbmRcIiksXG4gICAgICBvdXRwdXRGaWxlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJQYXRoIHRvIG91dHB1dCBsb2cgKGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NlcylcIiksXG4gICAgfSksXG4gIH0pLFxuICBKYXZhU2NyaXB0OiB0b29sKHtcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29kZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiSmF2YVNjcmlwdCBhc3luYyBmdW5jdGlvbiBib2R5LiBgY3R4YCBpcyBpbiBzY29wZS4gTXVzdCB1c2UgYHJldHVybmAgdG8gcHJvZHVjZSBvdXRwdXQuXCJcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgfSksXG59IHNhdGlzZmllcyBUb29sU2V0O1xuXG5leHBvcnQgdHlwZSBCdWlsdEluVG9vbE5hbWUgPSBrZXlvZiB0eXBlb2YgYnVpbHRJblRvb2xzO1xuZXhwb3J0IGNvbnN0IGJ1aWx0aW5Ub29sTmFtZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKGJ1aWx0SW5Ub29scykubWFwKChbbmFtZV0pID0+IFtuYW1lLCBuYW1lXSlcbikgYXMgeyBbSyBpbiBCdWlsdEluVG9vbE5hbWVdOiBLIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb29scyhjb250ZXh0OiBJbnRlcm5hbFRvb2xDb250ZXh0KSB7XG4gIGNvbnN0IHRvb2xzOiBUb29sU2V0ID0ge1xuICAgIFtidWlsdGluVG9vbE5hbWVzLlJlYWRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5SZWFkLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgc3RhcnRMaW5lLCBlbmRMaW5lIH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbUmVhZCBUb29sXVwiLCByZXN1bHQpO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogYEVycm9yOiBGaWxlIG5vdCBmb3VuZCAtICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHRvdGFsTGluZXM6IDAsXG4gICAgICAgICAgICAgIGxpbmVzU2hvd246IDAsXG4gICAgICAgICAgICAgIHN0YXJ0TGluZTogMCxcbiAgICAgICAgICAgICAgZW5kTGluZTogMCxcbiAgICAgICAgICAgICAgaXNQYWdpbmF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogXCIwXCIsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBmdWxsQ29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gQSB0cmFpbGluZyBuZXdsaW5lIHByb2R1Y2VzIGFuIGVtcHR5IGxhc3QgZWxlbWVudCBcdTIwMTQgcmVtb3ZlIGl0XG4gICAgICAgIC8vIHNvIGxpbmUgY291bnQgbWF0Y2hlcyBgd2MgLWxgIC8gYGF3ayAnRU5Ee3ByaW50IE5SfSdgIGJlaGF2aW9yLlxuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lcy5hdCgtMSkgPT09IFwiXCIpIHtcbiAgICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbExpbmVzID0gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChmdWxsQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVTaXplID0gZm9ybWF0RmlsZVNpemUoZmlsZUJ5dGVzKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgcmFuZ2VcbiAgICAgICAgY29uc3QgUEFHRV9TSVpFID0gMTAwO1xuICAgICAgICBsZXQgYWN0dWFsU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgbGV0IGFjdHVhbEVuZDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChzdGFydExpbmUgIT09IHVuZGVmaW5lZCAmJiBlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBlbmRMaW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSBzdGFydExpbmU7XG4gICAgICAgICAgYWN0dWFsRW5kID0gTWF0aC5taW4oc3RhcnRMaW5lICsgUEFHRV9TSVpFIC0gMSwgdG90YWxMaW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodG90YWxMaW5lcyA+IDIwMCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gMTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBQQUdFX1NJWkU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IHRvdGFsTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBsaW5lIHJhbmdlICgxLWluZGV4ZWQpXG4gICAgICAgIGNvbnN0IHNsaWNlZExpbmVzID0gbGluZXMuc2xpY2UoYWN0dWFsU3RhcnQgLSAxLCBhY3R1YWxFbmQpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gc2xpY2VkTGluZXMuam9pbihcIlxcblwiKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB0b3RhbExpbmVzLFxuICAgICAgICAgICAgbGluZXNTaG93bjogTWF0aC5tYXgoMCwgYWN0dWFsRW5kIC0gYWN0dWFsU3RhcnQgKyAxKSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogYWN0dWFsU3RhcnQsXG4gICAgICAgICAgICBlbmRMaW5lOiBhY3R1YWxFbmQsXG4gICAgICAgICAgICBpc1BhZ2luYXRlZDogYWN0dWFsRW5kIDwgdG90YWxMaW5lcyxcbiAgICAgICAgICAgIGZpbGVTaXplLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5HcmVwXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuR3JlcCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7XG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICBnbG9iLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlLFxuICAgICAgICBjb250ZXh0TGluZXMsXG4gICAgICAgIG1heENvdW50LFxuICAgICAgICBmaWxlc1dpdGhNYXRjaGVzLFxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXRoID0gcGF0aCA/PyBcIi5cIjtcblxuICAgICAgICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tbGluZS1udW1iZXJcIik7XG4gICAgICAgIGFyZ3MucHVzaChcIi0taGVhZGluZ1wiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1jb2xvclwiLCBcIm5ldmVyXCIpO1xuXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi1pXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVUeXBlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS10eXBlXCIsIGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1nbG9iXCIsIGdsb2IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHRMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLUNcIiwgU3RyaW5nKGNvbnRleHRMaW5lcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLW1heC1jb3VudFwiLCBTdHJpbmcobWF4Q291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc1dpdGhNYXRjaGVzKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLS1maWxlcy13aXRoLW1hdGNoZXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnB1c2goXCItLVwiLCBwYXR0ZXJuLCBzZWFyY2hQYXRoKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3guZXhlYyh7IGNvbW1hbmQ6IFwicmdcIiwgYXJncyB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0dyZXAgVG9vbF1cIiwgcmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIgJiYgIXN0ZGVyci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwibm8gbWF0Y2hlc1wiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtHcmVwIFRvb2xdIFdhcm5pbmc6ICR7c3RkZXJyfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ1bmNhdGUgb3V0cHV0IHRvIHByZXZlbnQgXCJpbnB1dCB0b28gbG9uZ1wiIGVycm9ycyAoNTBrIGNoYXJzIFx1MjI0OCAxMi41ayB0b2tlbnMpXG4gICAgICAgIGNvbnN0IE1BWF9HUkVQX09VVFBVVF9DSEFSUyA9IDUwXzAwMDtcbiAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gc3Rkb3V0O1xuICAgICAgICBsZXQgd2FzVHJ1bmNhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChmaW5hbE91dHB1dC5sZW5ndGggPiBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMpIHtcbiAgICAgICAgICBmaW5hbE91dHB1dCA9XG4gICAgICAgICAgICBmaW5hbE91dHB1dC5zbGljZSgwLCBNQVhfR1JFUF9PVVRQVVRfQ0hBUlMpICtcbiAgICAgICAgICAgIFwiXFxuXFxuW091dHB1dCB0cnVuY2F0ZWQgLSB1c2UgbW9yZSBzcGVjaWZpYyBwYXR0ZXJuIG9yIHBhdGhdXCI7XG4gICAgICAgICAgd2FzVHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVzID0gZmluYWxPdXRwdXRcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLmZpbHRlcigobCkgPT4gbC5sZW5ndGggPiAwKTtcbiAgICAgICAgY29uc3QgZmlsZUNvdW50ID0gZmlsZXNXaXRoTWF0Y2hlc1xuICAgICAgICAgID8gbGluZXMubGVuZ3RoXG4gICAgICAgICAgOiBuZXcgU2V0KFxuICAgICAgICAgICAgICBsaW5lc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGwpID0+ICFsLnN0YXJ0c1dpdGgoXCIgXCIpICYmIGwuaW5jbHVkZXMoXCI6XCIpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGwpID0+IGwuc3BsaXQoXCI6XCIpWzBdKVxuICAgICAgICAgICAgKS5zaXplO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgbWF0Y2hDb3VudDogZmlsZXNXaXRoTWF0Y2hlc1xuICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgOiBsaW5lcy5maWx0ZXIoKGwpID0+IGwuaW5jbHVkZXMoXCI6XCIpKS5sZW5ndGgsXG4gICAgICAgICAgICBmaWxlQ291bnQsXG4gICAgICAgICAgICBzZWFyY2hQYXRoLFxuICAgICAgICAgICAgcGF0dGVybixcbiAgICAgICAgICAgIHdhc1RydW5jYXRlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hdGNoZXM6IGZpbmFsT3V0cHV0IHx8IFwiKG5vIG1hdGNoZXMgZm91bmQpXCIsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkxpc3RdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5MaXN0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgZGVwdGgsIGluY2x1ZGVIaWRkZW4sIGZpbGVzT25seSwgcGF0dGVybiB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdGggPSBwYXRoID8/IFwiLlwiO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5leGVjKHtcbiAgICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBzZXQgLWVcbiAgICAgICAgICAgIFNFQVJDSF9QQVRIPVwiJDFcIlxuICAgICAgICAgICAgREVQVEg9XCIkMlwiXG4gICAgICAgICAgICBJTkNMVURFX0hJRERFTj1cIiQzXCJcbiAgICAgICAgICAgIEZJTEVTX09OTFk9XCIkNFwiXG4gICAgICAgICAgICBQQVRURVJOPVwiJDVcIlxuXG4gICAgICAgICAgICAjIEJ1aWxkIGZpbmQgY29tbWFuZCBhcmd1bWVudHNcbiAgICAgICAgICAgIEZJTkRfQVJHUz1cIlwiXG4gICAgICAgICAgICBbIC1uIFwiJERFUFRIXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1tYXhkZXB0aCAkREVQVEhcIlxuICAgICAgICAgICAgWyBcIiRJTkNMVURFX0hJRERFTlwiICE9IFwidHJ1ZVwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG4gICAgICAgICAgICBbIFwiJEZJTEVTX09OTFlcIiA9IFwidHJ1ZVwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtdHlwZSBmXCJcbiAgICAgICAgICAgIFsgLW4gXCIkUEFUVEVSTlwiIF0gJiYgRklORF9BUkdTPVwiJEZJTkRfQVJHUyAtbmFtZSAnJFBBVFRFUk4nXCJcblxuICAgICAgICAgICAgIyBHZXQgbGlzdGluZ1xuICAgICAgICAgICAgTElTVElORz0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRGSU5EX0FSR1NcIiAyPi9kZXYvbnVsbCB8IHNvcnQpXG5cbiAgICAgICAgICAgICMgR2V0IGNvdW50c1xuICAgICAgICAgICAgQ09VTlRfQVJHUz1cIlwiXG4gICAgICAgICAgICBbIC1uIFwiJERFUFRIXCIgXSAmJiBDT1VOVF9BUkdTPVwiJENPVU5UX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBDT1VOVF9BUkdTPVwiJENPVU5UX0FSR1MgISAtcGF0aCAnKi8uKidcIlxuXG4gICAgICAgICAgICBGSUxFX0NPVU5UPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJENPVU5UX0FSR1MgLXR5cGUgZlwiIDI+L2Rldi9udWxsIHwgd2MgLWwpXG4gICAgICAgICAgICBESVJfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBkXCIgMj4vZGV2L251bGwgfCB3YyAtbClcblxuICAgICAgICAgICAgIyBPdXRwdXQ6IGNvdW50cyBmaXJzdCwgdGhlbiBsaXN0aW5nXG4gICAgICAgICAgICBlY2hvIFwiJEZJTEVfQ09VTlR8JERJUl9DT1VOVFwiXG4gICAgICAgICAgICBlY2hvIFwifHx8TElTVElOR3x8fFwiXG4gICAgICAgICAgICBlY2hvIFwiJExJU1RJTkdcIiB8IHNlZCBcInN8XiRTRUFSQ0hfUEFUSHwufFwiXG4gICAgICAgICAgYCxcbiAgICAgICAgICAgIFwiLS1cIixcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aD8udG9TdHJpbmcoKSB8fCBcIlwiLFxuICAgICAgICAgICAgaW5jbHVkZUhpZGRlbiA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgICAgICAgZmlsZXNPbmx5ID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBwYXR0ZXJuIHx8IFwiXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltMaXN0IFRvb2xdXCIsIHJlc3VsdCk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcblxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbTGlzdCBUb29sXSBzdGRlcnI6ICR7c3RkZXJyfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2NvdW50c0xpbmUsIC4uLnJlc3RdID0gc3Rkb3V0LnNwbGl0KFwifHx8TElTVElOR3x8fFwiKTtcbiAgICAgICAgY29uc3QgbGlzdGluZyA9IHJlc3Quam9pbihcInx8fExJU1RJTkd8fHxcIikudHJpbSgpO1xuICAgICAgICBjb25zdCBbZmlsZUNvdW50U3RyLCBkaXJDb3VudFN0cl0gPSBjb3VudHNMaW5lLnRyaW0oKS5zcGxpdChcInxcIik7XG5cbiAgICAgICAgY29uc3QgdG90YWxGaWxlcyA9IE51bWJlci5wYXJzZUludChmaWxlQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCB0b3RhbERpcnMgPSBOdW1iZXIucGFyc2VJbnQoZGlyQ291bnRTdHIsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGxpc3Rpbmcuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbGluZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxGaWxlcyxcbiAgICAgICAgICAgIHRvdGFsRGlycyxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxpc3RpbmcsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLldyaXRlXTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuV3JpdGUsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aC5zbGljZSgxKSA6IHBhdGg7XG4gICAgICAgIGNvbnN0IGRpciA9IGZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKVxuICAgICAgICAgID8gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKVxuICAgICAgICAgIDogXCIuXCI7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGZpbGVQYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGRpciAhPT0gXCIuXCIpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJta2RpclwiLCBhcmdzOiBbXCItcFwiLCBkaXJdIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGNvbnRleHQuc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlTmFtZSwgY29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBkaXIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgYnl0ZXNXcml0dGVuOiBCdWZmZXIuYnl0ZUxlbmd0aChjb250ZW50LCBcInV0ZjhcIiksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IDAsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JNc2csXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSxcbiAgICBbYnVpbHRpblRvb2xOYW1lcy5FZGl0XTogdG9vbCh7XG4gICAgICAuLi5idWlsdEluVG9vbHMuRWRpdCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIG9sZF9zdHJpbmcsIG5ld19zdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LnNhbmRib3gucmVhZEZpbGUoeyBwYXRoOiBmaWxlUGF0aCB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gY29udGVudC5zcGxpdChvbGRfc3RyaW5nKS5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmIChvY2N1cnJlbmNlcyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgZXJyb3I6IFwib2xkX3N0cmluZyBub3QgZm91bmQgaW4gZmlsZVwiLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2NjdXJyZW5jZXMgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogYG9sZF9zdHJpbmcgYXBwZWFycyAke29jY3VycmVuY2VzfSB0aW1lcyBpbiBmaWxlIChtdXN0IGJlIHVuaXF1ZSkuIEluY2x1ZGUgbW9yZSBzdXJyb3VuZGluZyBjb250ZXh0IHRvIG1ha2UgdGhlIG1hdGNoIHVuaXF1ZS5gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKG9sZF9zdHJpbmcsIG5ld19zdHJpbmcpO1xuICAgICAgICBjb25zdCBkaXIgPSBmaWxlUGF0aC5pbmNsdWRlcyhcIi9cIilcbiAgICAgICAgICA/IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIilcbiAgICAgICAgICA6IFwiLlwiO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBmaWxlUGF0aDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNvbnRleHQuc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgICAgIGZpbGVzOiBbeyBwYXRoOiBmaWxlTmFtZSwgY29udGVudDogbmV3Q29udGVudCB9XSxcbiAgICAgICAgICAgIGRlc3RQYXRoOiBkaXIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgcGF0aDogZmlsZVBhdGgsIGVycm9yOiBlcnJvck1zZyB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkJhc2hdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5CYXNoLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVQcm9jZXNzTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NNYW5hZ2VyID0gY3JlYXRlUHJvY2Vzc01hbmFnZXIoe1xuICAgICAgICAgIHNhbmRib3g6IGNvbnRleHQuc2FuZGJveCxcbiAgICAgICAgICBzZXNzaW9uSWQ6IGNvbnRleHQuaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBwcm9jZXNzTWFuYWdlci5pbml0KCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NNYW5hZ2VyLnJ1bih7IGNvbW1hbmQsIHdhaXRVbnRpbCB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG5cbiAgaWYgKGNvbnRleHQuYXBpVG9vbHNNZXRhZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgYXBpVG9vbHMgPSBidWlsZEFwaVRvb2xzKHtcbiAgICAgIHJwYzogY29udGV4dC5pbnB1dC5ycGMsXG4gICAgICBtZXRhZGF0YTogY29udGV4dC5hcGlUb29sc01ldGFkYXRhLFxuICAgICAgc2Vzc2lvbjogY29udGV4dC5zZXNzaW9uLFxuICAgICAgc2FuZGJveFJlY29yZDogY29udGV4dC5zYW5kYm94UmVjb3JkLFxuICAgICAgY29udGV4dDogY29udGV4dC5ldmVudC5jb250ZXh0LFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24odG9vbHMsIGFwaVRvb2xzKTtcbiAgfVxuXG4gIHRvb2xzW2J1aWx0aW5Ub29sTmFtZXMuSmF2YVNjcmlwdF0gPSBjcmVhdGVKYXZhU2NyaXB0VG9vbCh7XG4gICAgdG9vbHMsXG4gICAgc2Vzc2lvbjogY29udGV4dC5zZXNzaW9uLFxuICAgIHNhbmRib3g6IGNvbnRleHQuc2FuZGJveCxcbiAgICBvblN1YlRvb2xDYWxsOiBjb250ZXh0Lm9uU3ViVG9vbENhbGwsXG4gIH0pO1xuXG4gIHJldHVybiB0b29scztcbn1cblxudHlwZSBBcGlUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEFwaVRvb2xzTWV0YWRhdGEob3B0czoge1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0Pjtcbn0pOiBQcm9taXNlPEFwaVRvb2xNZXRhZGF0YVtdPiB7XG4gIGNvbnN0IHsgcnBjIH0gPSBvcHRzO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyh7IG1ldGhvZDogXCJ0b29scy5saXN0XCIsIHBhcmFtczoge30gfSk7XG5cbiAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW2FnZW50XSBGYWlsZWQgdG8gZmV0Y2ggdG9vbHM6XCIsIHJlc3VsdC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIChyZXN1bHQucmVzdWx0IGFzIEFwaVRvb2xNZXRhZGF0YVtdKSA/PyBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXBpVG9vbHMob3B0czoge1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0PjtcbiAgbWV0YWRhdGE6IEFwaVRvb2xNZXRhZGF0YVtdO1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn0pOiBUb29sU2V0IHtcbiAgY29uc3QgeyBycGMsIG1ldGFkYXRhLCBzZXNzaW9uLCBzYW5kYm94UmVjb3JkLCBjb250ZXh0IH0gPSBvcHRzO1xuICBjb25zdCB0b29sczogVG9vbFNldCA9IHt9O1xuXG4gIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhZGF0YSkge1xuICAgIHRvb2xzW21ldGEubmFtZV0gPSB0b29sKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhLmRlc2NyaXB0aW9uID8/IGBDdXN0b20gdG9vbDogJHttZXRhLm5hbWV9YCxcbiAgICAgIGlucHV0U2NoZW1hOiBtZXRhLmlucHV0U2NoZW1hXG4gICAgICAgID8ganNvblNjaGVtYShtZXRhLmlucHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWE+WzBdKVxuICAgICAgICA6IHoub2JqZWN0KHt9KSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoe1xuICAgICAgICAgIG1ldGhvZDogXCJ0b29scy5leGVjdXRlXCIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBuYW1lOiBtZXRhLm5hbWUsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vbCBleGVjdXRpb24gZmFpbGVkOiAke3Jlc3VsdC5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0b29scztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBcGlVcmwob3B0czogeyBhcGk6IHN0cmluZyB8IHVuZGVmaW5lZCB9KTogc3RyaW5nIHtcbiAgbGV0IG9yaWdpbiA9IFwiXCI7XG4gIGxldCBwYXRoID0gYC8ud2VsbC1rbm93bi9hZ2VudC8ke0FHRU5UX1BST1RPQ09MX1ZFUlNJT059YDtcblxuICBpZiAob3B0cy5hcGkpIHtcbiAgICBpZiAob3B0cy5hcGkuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIHBhdGggPSBvcHRzLmFwaTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2VlIGlmIGl0J3MgZnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRzLmFwaSk7XG4gICAgICAgIG9yaWdpbiA9IHVybC5vcmlnaW47XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoO1xuICAgICAgICBpZiAoZnVsbFBhdGguc3RhcnRzV2l0aChcIi9cIikgJiYgZnVsbFBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgICAgcGF0aCA9IGZ1bGxQYXRoO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3JpZ2luKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIG9yaWdpbiA9IGBodHRwOi8vbG9jYWxob3N0OiR7XG4gICAgICAgIHByb2Nlc3MuZW52LlBPUlQgPz8gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfUE9SVCA/PyAzMDAwXG4gICAgICB9YDtcbiAgICB9XG4gICAgY29uc3QgdmVyY2VsVXJsID1cbiAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgPz8gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfVkVSQ0VMX1VSTDtcbiAgICBpZiAodmVyY2VsVXJsKSB7XG4gICAgICBvcmlnaW4gPSBgaHR0cHM6Ly8ke3ZlcmNlbFVybH1gO1xuICAgIH1cbiAgfVxuXG4gIGlmICghb3JpZ2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJbYWdlbnRdIENvdWxkbid0IGRldGVybWluZSBBUEkgb3JpZ2luIChubyBvcmlnaW4gZGV0ZWN0ZWQgaW4gYGFwaWAgb3B0aW9uIGFuZCBubyBWRVJDRUxfVVJMIHNldClcIlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYCR7b3JpZ2lufSR7cGF0aH1gO1xufVxuIiwgImltcG9ydCB7IHR5cGUgVG9vbFNldCwgdG9vbCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgdHlwZSB7IFNlc3Npb24gfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgYnVpbHRJblRvb2xzIH0gZnJvbSBcIi5cIjtcblxuZXhwb3J0IGNvbnN0IEpBVkFTQ1JJUFRfVE9PTF9OQU1FID0gXCJKYXZhU2NyaXB0XCI7XG5cbmV4cG9ydCB0eXBlIFN1YlRvb2xDYWxsUmVzdWx0ID0geyByZXN1bHQ/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgT25TdWJUb29sQ2FsbCA9IChcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgaW5wdXQ6IHVua25vd24sXG4gIGV4ZWN1dGU6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbikgPT4gUHJvbWlzZTxTdWJUb29sQ2FsbFJlc3VsdD47XG5cbmNvbnN0IFJFUVVFU1RfTUFSS0VSX1NUQVJUID0gXCJfX1RPT0xfUkVRVUVTVF9fXCI7XG5jb25zdCBSRVFVRVNUX01BUktFUl9FTkQgPSBcIl9fVE9PTF9SRVFVRVNUX0VORF9fXCI7XG5jb25zdCBFWEVDVVRJT05fVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogVGhlIHJ1bm5lciBzY3JpcHQgaXMgd3JpdHRlbiB0byB0aGUgc2FuZGJveCBhbmQgZXhlY3V0ZWQgdmlhIE5vZGUuanMuXG4gKiBJdCByZWFkcyB0aGUgbW9kZWwncyBjb2RlIGZyb20gY29kZS5qcywgc2V0cyB1cCBjdHgudG9vbHMgYXMgUlBDIHByb3hpZXNcbiAqIChyZXF1ZXN0cyBzZW50IHZpYSBzdGRlcnIgbWFya2VycywgcmVzcG9uc2VzIHBvbGxlZCBmcm9tIGZpbGVzKSwgZXhlY3V0ZXNcbiAqIHRoZSBjb2RlLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gc3Rkb3V0IGFzIEpTT04uXG4gKi9cbmNvbnN0IFJVTk5FUl9TQ1JJUFQgPSBgXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMsIHVubGlua1N5bmMsIG1rZGlyU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5jb25zdCBTQ1JJUFRfRElSID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgVE9PTF9DQUxMX1RJTUVPVVRfTVMgPSAzMDBfMDAwO1xuXG5sZXQgcmVxQ291bnRlciA9IDA7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxUb29sKG5hbWUsIGlucHV0KSB7XG4gIGNvbnN0IGlkID0gJ3JlcV8nICsgKCsrcmVxQ291bnRlcikgKyAnXycgKyBEYXRlLm5vdygpO1xuICBjb25zdCByZXNwb25zZUZpbGUgPSBqb2luKFNDUklQVF9ESVIsIGlkICsgJy5yZXNwb25zZS5qc29uJyk7XG5cbiAgY29uc3QgcmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHsgaWQsIHRvb2w6IG5hbWUsIGlucHV0IH0pO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnJHtSRVFVRVNUX01BUktFUl9TVEFSVH0nICsgcmVxdWVzdCArICcke1JFUVVFU1RfTUFSS0VSX0VORH0nICsgJ1xcXFxuJyk7XG5cbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICB3aGlsZSAoIWV4aXN0c1N5bmMocmVzcG9uc2VGaWxlKSkge1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiBUT09MX0NBTExfVElNRU9VVF9NUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb29sIGNhbGwgJyArIG5hbWUgKyAnIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNwb25zZScpO1xuICAgIH1cbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMzApKTtcbiAgfVxuXG4gIGxldCByYXc7XG4gIHRyeSB7XG4gICAgcmF3ID0gcmVhZEZpbGVTeW5jKHJlc3BvbnNlRmlsZSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgcmF3ID0gcmVhZEZpbGVTeW5jKHJlc3BvbnNlRmlsZSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyYXcpO1xuICB0cnkgeyB1bmxpbmtTeW5jKHJlc3BvbnNlRmlsZSk7IH0gY2F0Y2gge31cblxuICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IpO1xuICB9XG4gIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG59XG5cbmNvbnN0IGNvZGUgPSByZWFkRmlsZVN5bmMoam9pbihTQ1JJUFRfRElSLCAnY29kZS5qcycpLCAndXRmOCcpO1xuY29uc3QgdG9vbE5hbWVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoam9pbihTQ1JJUFRfRElSLCAndG9vbHMuanNvbicpLCAndXRmOCcpKTtcblxuY29uc3QgY3R4ID0geyB0b29sczoge30gfTtcbmZvciAoY29uc3QgbmFtZSBvZiB0b29sTmFtZXMpIHtcbiAgY3R4LnRvb2xzW25hbWVdID0gKGlucHV0KSA9PiBjYWxsVG9vbChuYW1lLCBpbnB1dCk7XG59XG5cbmNvbnN0IGxvZ3MgPSBbXTtcbmNvbnN0IGN1c3RvbUNvbnNvbGUgPSB7XG4gIGxvZzogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaChhcmdzLm1hcChhID0+IHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IGEgOiBKU09OLnN0cmluZ2lmeShhKSkuam9pbignICcpKSxcbiAgZXJyb3I6ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1tlcnJvcl0gJyArIGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICB3YXJuOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKCdbd2Fybl0gJyArIGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxufTtcblxudHJ5IHtcbiAgY29uc3QgQXN5bmNGdW5jdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbigpIHt9KS5jb25zdHJ1Y3RvcjtcbiAgY29uc3QgZm4gPSBuZXcgQXN5bmNGdW5jdGlvbignY3R4JywgJ2NvbnNvbGUnLCBjb2RlKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oY3R4LCBjdXN0b21Db25zb2xlKTtcblxuICBjb25zdCBvdXRwdXQgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogcmVzdWx0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQgOiBudWxsIH07XG4gIGlmIChsb2dzLmxlbmd0aCA+IDApIG91dHB1dC5sb2dzID0gbG9ncztcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7XG59IGNhdGNoIChlcnIpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge1xuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlICsgJ1xcXFxuJyArIGVyci5zdGFjayA6IFN0cmluZyhlcnIpLFxuICB9O1xuICBpZiAobG9ncy5sZW5ndGggPiAwKSBvdXRwdXQubG9ncyA9IGxvZ3M7XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKEpTT04uc3RyaW5naWZ5KG91dHB1dCkpO1xufVxuYDtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHBsYWluIEpTT04gU2NoZW1hIGZyb20gd2hhdGV2ZXIgZm9ybWF0IHRoZSBBSSBTREsgdG9vbCB1c2VzXG4gKiAoWm9kIHNjaGVtYSwgQUkgU0RLIHdyYXBwZWQgc2NoZW1hLCBvciByYXcgSlNPTiBTY2hlbWEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEpzb25TY2hlbWEoXG4gIHNjaGVtYTogdW5rbm93blxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIFwiX2RlZlwiIGluIHNjaGVtYSAmJlxuICAgIHR5cGVvZiAoc2NoZW1hIGFzIHsgX2RlZjogdW5rbm93biB9KS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gei50b0pTT05TY2hlbWEoc2NoZW1hIGFzIHouWm9kVHlwZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICBpZiAoU3ltYm9sLmZvcihcInZlcmNlbC5haS5zY2hlbWFcIikgaW4gcyAmJiBcImpzb25TY2hlbWFcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBzIHx8IFwicHJvcGVydGllc1wiIGluIHMpIHtcbiAgICByZXR1cm4gcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvblNjaGVtYVRvVHMoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluZGVudCA9IDBcbik6IHN0cmluZyB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5lbnVtICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5lbnVtLm1hcCgodikgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmFueU9mICYmIEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgIHJldHVybiBzY2hlbWEuYW55T2ZcbiAgICAgIC5tYXAoKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBqc29uU2NoZW1hVG9UcyhzLCBpbmRlbnQpKVxuICAgICAgLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5vbmVPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLm9uZU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlIGFzIHN0cmluZztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBzY2hlbWEuaXRlbXNcbiAgICAgICAgPyBqc29uU2NoZW1hVG9UcyhzY2hlbWEuaXRlbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluZGVudClcbiAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIHJldHVybiBgQXJyYXk8JHtpdGVtc30+YDtcbiAgICB9XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hLnByb3BlcnRpZXMgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gbmV3IFNldCgoc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gICAgICBjb25zdCBwYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuICAgICAgY29uc3QgY2xvc2VQYWQgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wiO1xuICAgICAgICByZXR1cm4gYCR7cGFkfSR7a2V5fSR7b3B0fTogJHtqc29uU2NoZW1hVG9Ucyh2YWx1ZSwgaW5kZW50ICsgMSl9YDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGB7XFxuJHtwcm9wcy5qb2luKFwiO1xcblwiKX07XFxuJHtjbG9zZVBhZH19YDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb250ZXh0VHlwZVN0cmluZyh0b29sczogVG9vbFNldCk6IHN0cmluZyB7XG4gIGNvbnN0IHNpZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdF0gb2YgT2JqZWN0LmVudHJpZXModG9vbHMpKSB7XG4gICAgY29uc3QgcmF3ID0gdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpbnB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5pbnB1dFNjaGVtYSA/PyByYXcucGFyYW1ldGVycyk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gZXh0cmFjdEpzb25TY2hlbWEocmF3Lm91dHB1dFNjaGVtYSk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBpbnB1dFNjaGVtYSA/IGpzb25TY2hlbWFUb1RzKGlucHV0U2NoZW1hLCAyKSA6IFwie31cIjtcbiAgICBjb25zdCBvdXRwdXRUeXBlID0gb3V0cHV0U2NoZW1hXG4gICAgICA/IGpzb25TY2hlbWFUb1RzKG91dHB1dFNjaGVtYSwgMilcbiAgICAgIDogXCJ1bmtub3duXCI7XG5cbiAgICBzaWdzLnB1c2goYCAgICAke25hbWV9KGlucHV0OiAke2lucHV0VHlwZX0pOiBQcm9taXNlPCR7b3V0cHV0VHlwZX0+YCk7XG4gIH1cblxuICByZXR1cm4gYHR5cGUgQ29udGV4dCA9IHtcXG4gIHRvb2xzOiB7XFxuJHtzaWdzLmpvaW4oXCI7XFxuXCIpfTtcXG4gIH1cXG59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUluU2FuZGJveCh7XG4gIGNvZGUsXG4gIHJwY0RpcixcbiAgYWJvcnRDb250cm9sbGVyLFxuICBzYW5kYm94LFxuICBhdmFpbGFibGVUb29scyxcbiAgb25TdWJUb29sQ2FsbCxcbn06IHtcbiAgY29kZTogc3RyaW5nO1xuICBycGNEaXI6IHN0cmluZztcbiAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IG1rZGlyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm1rZGlyXCIsXG4gICAgYXJnczogW1wiLXBcIiwgcnBjRGlyXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBta2RpclJlc3VsdC5tZXNzYWdlIH07XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgZmlsZXM6IFtcbiAgICAgIHsgcGF0aDogXCJydW5uZXIubWpzXCIsIGNvbnRlbnQ6IFJVTk5FUl9TQ1JJUFQgfSxcbiAgICAgIHsgcGF0aDogXCJjb2RlLmpzXCIsIGNvbnRlbnQ6IGNvZGUgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogXCJ0b29scy5qc29uXCIsXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGF2YWlsYWJsZVRvb2xzKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgfSk7XG5cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0sIDEwKTtcbiAgY29uc3QgcGVybWlzc2lvbkZsYWcgPVxuICAgIG5vZGVNYWpvciA+PSAyMiA/IFwiLS1wZXJtaXNzaW9uXCIgOiBcIi0tZXhwZXJpbWVudGFsLXBlcm1pc3Npb25cIjtcblxuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcIm5vZGVcIixcbiAgICBhcmdzOiBbXG4gICAgICBwZXJtaXNzaW9uRmxhZyxcbiAgICAgIGAtLWFsbG93LWZzLXJlYWQ9JHtycGNEaXJ9YCxcbiAgICAgIGAtLWFsbG93LWZzLXdyaXRlPSR7cnBjRGlyfWAsXG4gICAgICBgJHtycGNEaXJ9L3J1bm5lci5tanNgLFxuICAgIF0sXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBleGVjUmVzdWx0Lm1lc3NhZ2UgfTtcbiAgfVxuXG4gIGNvbnN0IGZhdGFsOiB7IGVycm9yOiBFcnJvciB8IG51bGwgfSA9IHsgZXJyb3I6IG51bGwgfTtcblxuICBjb25zdCBhYm9ydCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBpZiAoIWZhdGFsLmVycm9yKSB7XG4gICAgICBmYXRhbC5lcnJvciA9IGVycm9yO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVRvb2xSZXF1ZXN0ID0gYXN5bmMgKHJlcXVlc3RKc29uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgcGFyc2VkOiB7IGlkOiBzdHJpbmc7IHRvb2w6IHN0cmluZzsgaW5wdXQ6IHVua25vd24gfTtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXF1ZXN0SnNvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBpZCwgdG9vbDogdG9vbE5hbWUsIGlucHV0IH0gPSBwYXJzZWQ7XG5cbiAgICBsZXQgcmVzcG9uc2U6IHsgcmVzdWx0PzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGF2YWlsYWJsZVRvb2xzW3Rvb2xOYW1lXTtcbiAgICAgIGlmICghdD8uZXhlY3V0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvb2wgJHt0b29sTmFtZX0gbm90IGZvdW5kIG9yIGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlYyA9IHQuZXhlY3V0ZS5iaW5kKHQpO1xuICAgICAgaWYgKG9uU3ViVG9vbENhbGwpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBvblN1YlRvb2xDYWxsKHRvb2xOYW1lLCBpbnB1dCwgKCkgPT5cbiAgICAgICAgICBleGVjKGlucHV0LCB7XG4gICAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBganNfJHt0b29sTmFtZX1fJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7IHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgcmVzcG9uc2UgPSB7IGVycm9yOiBtc2cgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2FuZGJveC53cml0ZUZpbGVzKHtcbiAgICAgICAgZmlsZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBgJHtpZH0ucmVzcG9uc2UuanNvbmAsXG4gICAgICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShyZXNwb25zZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVzdFBhdGg6IHJwY0RpcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB3cml0aW5nIHRoZSByZXNwb25zZSBmaWxlIGZhaWxzLCB0aGUgcnVubmVyIHdpbGwgcG9sbCBmb3JldmVyXG4gICAgICAgKiB3YWl0aW5nIGZvciBpdC4gQWJvcnQgdGhlIHJ1bm5lciBwcm9jZXNzIHNvIHdlIGRvbid0IGRlYWRsb2NrLlxuICAgICAgICovXG4gICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBhYm9ydChuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSBSUEMgcmVzcG9uc2UgZm9yICR7dG9vbE5hbWV9OiAke21zZ31gKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHRvb2xDYWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBsZXQgc3RkZXJyQnVmZmVyID0gXCJcIjtcbiAgbGV0IG5vbk1hcmtlclN0ZGVyciA9IFwiXCI7XG5cbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGFib3J0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgSmF2YVNjcmlwdCBleGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7RVhFQ1VUSU9OX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApXG4gICAgKTtcbiAgfSwgRVhFQ1VUSU9OX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBleGVjUmVzdWx0LmxvZ3MoKSkge1xuICAgICAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3RyZWFtID09PSBcInN0ZGVyclwiKSB7XG4gICAgICAgIHN0ZGVyckJ1ZmZlciArPSBlbnRyeS5kYXRhO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9TVEFSVCk7XG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlTWFya2VyID0gc3RkZXJyQnVmZmVyLnNsaWNlKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICBpZiAoYmVmb3JlTWFya2VyLnRyaW0oKSkge1xuICAgICAgICAgICAgbm9uTWFya2VyU3RkZXJyICs9IGJlZm9yZU1hcmtlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzdGFydElkeCArIFJFUVVFU1RfTUFSS0VSX1NUQVJULmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBzdGRlcnJCdWZmZXIuaW5kZXhPZihSRVFVRVNUX01BUktFUl9FTkQsIGNvbnRlbnRTdGFydCk7XG4gICAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RKc29uID0gc3RkZXJyQnVmZmVyLnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSWR4KTtcbiAgICAgICAgICBzdGRlcnJCdWZmZXIgPSBzdGRlcnJCdWZmZXIuc2xpY2UoZW5kSWR4ICsgUkVRVUVTVF9NQVJLRVJfRU5ELmxlbmd0aCk7XG5cbiAgICAgICAgICB0b29sQ2FsbFByb21pc2VzLnB1c2goaGFuZGxlVG9vbFJlcXVlc3QocmVxdWVzdEpzb24pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cblxuICBpZiAoc3RkZXJyQnVmZmVyLnRyaW0oKSkge1xuICAgIG5vbk1hcmtlclN0ZGVyciArPSBzdGRlcnJCdWZmZXI7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodG9vbENhbGxQcm9taXNlcyk7XG5cbiAgaWYgKGZhdGFsLmVycm9yKSB7XG4gICAgZXhlY1Jlc3VsdC5yZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogZmF0YWwuZXJyb3IubWVzc2FnZSxcbiAgICAgIC4uLihub25NYXJrZXJTdGRlcnIgPyB7IHN0ZGVycjogbm9uTWFya2VyU3RkZXJyLnNsaWNlKDAsIDIwMDApIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgUnVubmVyIGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkuYCxcbiAgICAgIHN0ZGVycjogKG5vbk1hcmtlclN0ZGVyciArIHN0ZGVycikuc2xpY2UoMCwgMjAwMCksXG4gICAgICBzdGRvdXQ6IHN0ZG91dC5zbGljZSgwLCAxMDAwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKYXZhU2NyaXB0VG9vbChvcHRzOiB7XG4gIHRvb2xzOiBUb29sU2V0O1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn0pIHtcbiAgY29uc3QgeyBzZXNzaW9uLCBzYW5kYm94LCBvblN1YlRvb2xDYWxsIH0gPSBvcHRzO1xuICBjb25zdCBhY3RpdmVTZXQgPSBzZXNzaW9uLmFjdGl2ZVRvb2xzID8gbmV3IFNldChzZXNzaW9uLmFjdGl2ZVRvb2xzKSA6IG51bGw7XG4gIGNvbnN0IGF2YWlsYWJsZVRvb2xzOiBUb29sU2V0ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMudG9vbHMpKSB7XG4gICAgaWYgKCFhY3RpdmVTZXQgfHwgYWN0aXZlU2V0LmhhcyhuYW1lKSkge1xuICAgICAgYXZhaWxhYmxlVG9vbHNbbmFtZV0gPSB0O1xuICAgIH1cbiAgfVxuICBjb25zdCBjb250ZXh0VHlwZSA9IGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcoYXZhaWxhYmxlVG9vbHMpO1xuXG4gIHJldHVybiB0b29sKHtcbiAgICAuLi5idWlsdEluVG9vbHMuSmF2YVNjcmlwdCxcbiAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGUgSmF2YVNjcmlwdCB0byBvcmNoZXN0cmF0ZSBtdWx0aXBsZSB0b29sIGNhbGxzIGluIGEgc2luZ2xlIHN0ZXAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcnVuIHNldmVyYWwgdG9vbHMgaW4gc2VxdWVuY2UsIHRyYW5zZm9ybSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgb3IgcGFyYWxsZWxpemUgaW5kZXBlbmRlbnQgb3BlcmF0aW9ucyB3aXRoIFByb21pc2UuYWxsLlxuXG5UaGUgY29kZSBydW5zIGFzIGFuIGFzeW5jIGZ1bmN0aW9uIGJvZHkgd2l0aCBcXGBjdHhcXGAgaW4gc2NvcGU6XG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbiR7Y29udGV4dFR5cGV9XG5cXGBcXGBcXGBcblxuRXhhbXBsZXM6XG4tIFNlcXVlbnRpYWw6IFxcYGNvbnN0IGZpbGUgPSBhd2FpdCBjdHgudG9vbHMuUmVhZCh7IHBhdGg6IFwicGFja2FnZS5qc29uXCIgfSk7IHJldHVybiBKU09OLnBhcnNlKGZpbGUuY29udGVudCk7XFxgXG4tIFBhcmFsbGVsOiBcXGBjb25zdCBbYSwgYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImEudHNcIiB9KSwgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcImIudHNcIiB9KV0pOyByZXR1cm4geyBhOiBhLmNvbnRlbnQsIGI6IGIuY29udGVudCB9O1xcYFxuLSBUcmFuc2Zvcm06IFxcYGNvbnN0IGdyZXAgPSBhd2FpdCBjdHgudG9vbHMuR3JlcCh7IHBhdHRlcm46IFwiVE9ET1wiIH0pOyByZXR1cm4gZ3JlcC5tYXRjaGVzLnNwbGl0KFwiXFxcXG5cIikubGVuZ3RoO1xcYFxuXG5SZXR1cm4gYSB2YWx1ZSB0byBwYXNzIHJlc3VsdHMgYmFjay4gVXNlIGNvbnNvbGUubG9nKCkgZm9yIGRlYnVnIG91dHB1dC5gLFxuICAgIGV4ZWN1dGU6ICh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgcnVuSWQgPSBgcnVuXyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgLnNsaWNlKDIsIDgpfWA7XG4gICAgICBjb25zdCBycGNEaXIgPSBgLmFnZW50L2pzLXJwYy8ke3J1bklkfWA7XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHJldHVybiBleGVjdXRlSW5TYW5kYm94KHtcbiAgICAgICAgY29kZSxcbiAgICAgICAgcnBjRGlyLFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIHNhbmRib3gsXG4gICAgICAgIGF2YWlsYWJsZVRvb2xzLFxuICAgICAgICBvblN1YlRvb2xDYWxsLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUsIE1vZGVsTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuXG50eXBlIFByb3ZpZGVyT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEpTT05WYWx1ZT4+O1xuXG5jb25zdCBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUID0gNDtcblxuY29uc3QgQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMgPSBbXCJjbGF1ZGVcIiwgXCJhbnRocm9waWNcIl07XG5cbmNvbnN0IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TOiBQcm92aWRlck9wdGlvbnMgPSB7XG4gIGFudGhyb3BpYzoge1xuICAgIGNhY2hlQ29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIG9wZW5yb3V0ZXI6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBiZWRyb2NrOiB7XG4gICAgY2FjaGVQb2ludDogeyB0eXBlOiBcImRlZmF1bHRcIiB9LFxuICB9LFxuICBvcGVuYWlDb21wYXRpYmxlOiB7XG4gICAgY2FjaGVfY29udHJvbDogeyB0eXBlOiBcImVwaGVtZXJhbFwiIH0sXG4gIH0sXG4gIGNvcGlsb3Q6IHtcbiAgICBjb3BpbG90X2NhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0R2F0ZXdheVByb3ZpZGVyKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2xhc2hJbmRleCA9IG1vZGVsLmluZGV4T2YoXCIvXCIpO1xuICBpZiAoc2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbW9kZWwuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBudW1iZXIge1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSAobWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9KVxuICAgICAgLnByb3ZpZGVyT3B0aW9ucztcbiAgICBpZiAocHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBjb25zdCBwYXJ0UHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcbiAgICAgICAgaWYgKHBhcnRQcm92aWRlck9wdGlvbnM/LmFudGhyb3BpYz8uY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2xhdWRlTGlrZU1vZGVsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbG93ZXIgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gQ0xBVURFX0xJS0VfTU9ERUxfTUFUQ0hFUlMuc29tZSgobSkgPT4gbG93ZXIuaW5jbHVkZXMobSkpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyT3B0aW9ucyhvcHRzOiB7XG4gIGN1cnJlbnQ6IFByb3ZpZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcGF0Y2g6IFByb3ZpZGVyT3B0aW9ucztcbn0pOiBQcm92aWRlck9wdGlvbnMge1xuICBjb25zdCBuZXh0OiBQcm92aWRlck9wdGlvbnMgPSB7IC4uLihvcHRzLmN1cnJlbnQgPz8ge30pIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMucGF0Y2gpKSB7XG4gICAgbmV4dFtrZXldID0geyAuLi4obmV4dFtrZXldID8/IHt9KSwgLi4udmFsdWUgfTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KHBhcnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFwYXJ0IHx8IHR5cGVvZiBwYXJ0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQgJiYgKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlID09PSBcInRleHRcIikge1xuICAgIGNvbnN0IHRleHQgPSAocGFydCBhcyB7IHRleHQ/OiB1bmtub3duIH0pLnRleHQ7XG4gICAgaWYgKHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcGFydCkge1xuICAgIGNvbnN0IHR5cGUgPSAocGFydCBhcyB7IHR5cGU/OiB1bmtub3duIH0pLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwidGhpbmtpbmdcIiB8fCB0eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZTogTW9kZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC50cmltKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50LnNvbWUoKHBhcnQpID0+IGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0KSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q2FjaGVhYmxlUGFydEluZGV4KGNvbnRlbnQ6IHVua25vd25bXSk6IG51bWJlciB8IG51bGwge1xuICBmb3IgKGxldCBpID0gY29udGVudC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGlmIChpc0NhY2hlYWJsZUNsYXVkZVBhcnQoY29udGVudFtpXSkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyW10ge1xuICBjb25zdCBzeXN0ZW1JbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBmaW5hbEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGggJiYgc3lzdGVtSW5kaWNlcy5sZW5ndGggPCAyOyBpICs9IDEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJzeXN0ZW1cIiAmJiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2UpKSB7XG4gICAgICBzeXN0ZW1JbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiBmaW5hbEluZGljZXMubGVuZ3RoIDwgMjsgaSAtPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgZmluYWxJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgZmluYWxJbmRpY2VzLnJldmVyc2UoKTtcblxuICByZXR1cm4gWy4uLnN5c3RlbUluZGljZXMsIC4uLmZpbmFsSW5kaWNlc107XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0OiBudW1iZXI7XG59KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBleGlzdGluZ0JyZWFrcG9pbnRzID0gY291bnRBbnRocm9waWNDYWNoZUJyZWFrcG9pbnRzKG9wdHMubWVzc2FnZXMpO1xuICBjb25zdCByZW1haW5pbmdCdWRnZXQgPSBNYXRoLm1heChcbiAgICAwLFxuICAgIG9wdHMubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0IC0gZXhpc3RpbmdCcmVha3BvaW50c1xuICApO1xuXG4gIGlmIChyZW1haW5pbmdCdWRnZXQgPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEluZGljZXMgPSBzZWxlY3RDbGF1ZGVDYWNoaW5nVGFyZ2V0cyhvcHRzLm1lc3NhZ2VzKS5zbGljZShcbiAgICAwLFxuICAgIHJlbWFpbmluZ0J1ZGdldFxuICApO1xuICBpZiAodGFyZ2V0SW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0cy5tZXNzYWdlcztcbiAgfVxuXG4gIGNvbnN0IHVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgPVxuICAgIG9wdHMucHJvdmlkZXJJZCA9PT0gXCJhbnRocm9waWNcIiB8fFxuICAgIEJvb2xlYW4ob3B0cy5wcm92aWRlcklkPy5pbmNsdWRlcyhcImJlZHJvY2tcIikpO1xuXG4gIGNvbnN0IG5leHRNZXNzYWdlcyA9IG9wdHMubWVzc2FnZXMuc2xpY2UoKTtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2VJbmRleCBvZiB0YXJnZXRJbmRpY2VzKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuXG4gICAgY29uc3Qgc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgPVxuICAgICAgIXVzZU1lc3NhZ2VMZXZlbE9wdGlvbnMgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSAmJlxuICAgICAgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoc2hvdWxkVXNlQ29udGVudE9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJ0SW5kZXggPSBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgaWYgKHBhcnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJ0ID0gbWVzc2FnZS5jb250ZW50W3BhcnRJbmRleF07XG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICAgIHBhcnQgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfVxuICAgICAgICAgICkucHJvdmlkZXJPcHRpb25zO1xuXG4gICAgICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgICAgICBuZXh0Q29udGVudFtwYXJ0SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4uKHBhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBtZXJnZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICAgICAgICAgIGN1cnJlbnQ6IHBhcnRQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgIHBhdGNoOiBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0gYXMgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQpW251bWJlcl07XG5cbiAgICAgICAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb250ZW50OiBuZXh0Q29udGVudCxcbiAgICAgICAgICB9IGFzIE1vZGVsTWVzc2FnZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2VQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICBtZXNzYWdlIGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgIG5leHRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICBjdXJyZW50OiBtZXNzYWdlUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5leHRNZXNzYWdlcztcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Q2FjaGluZ1Jlc3VsdCA9IHtcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByb21wdENhY2hpbmdUb01vZGVsUmVxdWVzdChvcHRzOiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIGFudGhyb3BpYz86IHsgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0PzogbnVtYmVyIH07XG4gIG9wZW5haT86IHsgc2V0UHJvbXB0Q2FjaGVLZXk/OiBib29sZWFuIH07XG59KTogUHJvbXB0Q2FjaGluZ1Jlc3VsdCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0R2F0ZXdheVByb3ZpZGVyKG9wdHMubW9kZWwpO1xuXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9uczogUHJvdmlkZXJPcHRpb25zID0ge307XG5cbiAgaWYgKFxuICAgIChwcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBwcm92aWRlciA9PT0gXCJhenVyZVwiKSAmJlxuICAgIG9wdHMub3BlbmFpPy5zZXRQcm9tcHRDYWNoZUtleSAhPT0gZmFsc2VcbiAgKSB7XG4gICAgcHJvdmlkZXJPcHRpb25zLm9wZW5haSA9IHsgcHJvbXB0Q2FjaGVLZXk6IG9wdHMuc2Vzc2lvbklkIH07XG4gIH1cblxuICBjb25zdCBtYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPVxuICAgIG9wdHMuYW50aHJvcGljPy5tYXhCcmVha3BvaW50c1BlclJlcXVlc3QgPz9cbiAgICBBTlRIUk9QSUNfTUFYX0NBQ0hFX0JSRUFLUE9JTlRTX1BFUl9SRVFVRVNUO1xuXG4gIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gaXNDbGF1ZGVMaWtlTW9kZWwob3B0cy5tb2RlbClcbiAgICA/IGFwcGx5Q2xhdWRlUHJvbXB0Q2FjaGluZyh7XG4gICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICBwcm92aWRlcklkOiBwcm92aWRlcixcbiAgICAgICAgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0LFxuICAgICAgfSlcbiAgICA6IG9wdHMubWVzc2FnZXM7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlczogY2FjaGVkTWVzc2FnZXMsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG4vKiogU3ViLXRvb2wgcGFydHMgKGZyb20gSmF2YVNjcmlwdCBtZXRhLXRvb2wpIHVzZSB0aGlzIHRvb2xDYWxsSWQgcHJlZml4LiAqL1xuZnVuY3Rpb24gaXNTdWJUb29sUGFydChwYXJ0OiBQYXJ0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwYXJ0LnBhcnQgYXMgeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gIHJldHVybiB0eXBlb2YgcD8udG9vbENhbGxJZCA9PT0gXCJzdHJpbmdcIiAmJiBwLnRvb2xDYWxsSWQuc3RhcnRzV2l0aChcImpzX3RjX1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVUlNZXNzYWdlcyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlW107XG4gIHBhcnRzOiBQYXJ0W107XG4gIHVudGlsPzogbnVtYmVyO1xuICBpbmNsdWRlUXVldWVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZmlsdGVycyBvdXQgc3ViLXRvb2wgcGFydHMgc28gdGhlIExMTSBkb2Vzbid0IHNlZSB0aGVtLiAqL1xuICBleGNsdWRlU3ViVG9vbFBhcnRzPzogYm9vbGVhbjtcbn0pOiBVSU1lc3NhZ2VbXSB7XG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcnRzQnlNZXNzYWdlLmdldChwYXJ0Lm1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQocGFydC5tZXNzYWdlSWQsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJlZFxuICAgIC5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHBhcnRzQnlNZXNzYWdlLmdldChtLmlkKSA/PyBbXTtcbiAgICAgIG1lc3NhZ2VQYXJ0cy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbS5pZCxcbiAgICAgICAgcm9sZTogbS5yb2xlLFxuICAgICAgICBwYXJ0czogbWVzc2FnZVBhcnRzLm1hcCgocCkgPT4gcC5wYXJ0KSxcbiAgICAgIH0gc2F0aXNmaWVzIFVJTWVzc2FnZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG0pID0+IG0ucGFydHMubGVuZ3RoID4gMCk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGVwVXNhZ2UsIFVzYWdlU3VtbWFyeSB9IGZyb20gXCIuLi9zdG9yYWdlL3JwY1wiO1xuXG5leHBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH07XG5cbmZ1bmN0aW9uIHN1bShpdGVtczogU3RlcFVzYWdlW10sIGtleToga2V5b2YgU3RlcFVzYWdlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtW2tleV07XG4gICAgcmV0dXJuIGFjYyArICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApO1xuICB9LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVVc2FnZVN1bW1hcnkoc3RlcHM6IFN0ZXBVc2FnZVtdKTogVXNhZ2VTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogc3RlcHNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW0oc3RlcHMsIFwiaW5wdXRUb2tlbnNcIiksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW0oc3RlcHMsIFwib3V0cHV0VG9rZW5zXCIpLFxuICAgIHRvdGFsVG9rZW5zOiBzdW0oc3RlcHMsIFwidG90YWxUb2tlbnNcIiksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW0oc3RlcHMsIFwiY2FjaGVSZWFkVG9rZW5zXCIpLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bShzdGVwcywgXCJjYWNoZVdyaXRlVG9rZW5zXCIpLFxuICAgIHJlYXNvbmluZ1Rva2Vuczogc3VtKHN0ZXBzLCBcInJlYXNvbmluZ1Rva2Vuc1wiKSxcbiAgICBzdGVwQ291bnQ6IHN0ZXBzLmxlbmd0aCxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvblVzYWdlID0ge1xuICB0b3RhbDogVXNhZ2VTdW1tYXJ5ICYgeyBtZXNzYWdlQ291bnQ6IG51bWJlciB9O1xuICBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNlc3Npb25Vc2FnZShcbiAgbWVzc2FnZXM6IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzYWdlOiB7IHN0ZXBzOiBTdGVwVXNhZ2VbXTsgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5IH0gfCBudWxsO1xuICB9PlxuKTogU2Vzc2lvblVzYWdlIHtcbiAgY29uc3QgYnlNZXNzYWdlSWQ6IFJlY29yZDxzdHJpbmcsIFVzYWdlU3VtbWFyeSB8IG51bGw+ID0ge307XG4gIGZvciAoY29uc3QgbSBvZiBtZXNzYWdlcykge1xuICAgIGJ5TWVzc2FnZUlkW20uaWRdID0gbS51c2FnZT8uc3VtbWFyeSA/PyBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3VtbWFyaWVzID0gbWVzc2FnZXNcbiAgICAubWFwKChtKSA9PiBtLnVzYWdlPy5zdW1tYXJ5KVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIFVzYWdlU3VtbWFyeSA9PiBzICE9PSB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHRvdGFsID0ge1xuICAgIG1vZGVsOiBzdW1tYXJpZXNbMF0/Lm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgIGlucHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuaW5wdXRUb2tlbnMsIDApLFxuICAgIG91dHB1dFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLm91dHB1dFRva2VucywgMCksXG4gICAgdG90YWxUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy50b3RhbFRva2VucywgMCksXG4gICAgY2FjaGVSZWFkVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVSZWFkVG9rZW5zLCAwKSxcbiAgICBjYWNoZVdyaXRlVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMuY2FjaGVXcml0ZVRva2VucywgMCksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMucmVhc29uaW5nVG9rZW5zLCAwKSxcbiAgICBzdGVwQ291bnQ6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5zdGVwQ291bnQsIDApLFxuICAgIG1lc3NhZ2VDb3VudDogc3VtbWFyaWVzLmxlbmd0aCxcbiAgfTtcblxuICByZXR1cm4geyB0b3RhbCwgYnlNZXNzYWdlSWQgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3LCBUb29sLCBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudFJwY092ZXJyaWRlcyxcbiAgQWdlbnRScGNSZXN1bHQsXG4gIEFnZW50U3RhdHVzLFxuICBScGNSZXN1bHQsXG59IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgZ2V0U2FuZGJveCB9IGZyb20gXCIuL3NhbmRib3hcIjtcbmltcG9ydCB0eXBlIHtcbiAgU3RvcmFnZSBhcyBBZ2VudFN0b3JhZ2UsXG4gIE1ldGhvZE5hbWUsXG4gIFJwY0ZuLFxuICBScGNSZXF1ZXN0LFxuICBScGNSZXNwb25zZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU3RvcmFnZUNvbmZpZyxcbiAgSGFuZGxlcnMgYXMgU3RvcmFnZUhhbmRsZXJzLFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBTVE9SQUdFX1JQQ19NRVRIT0RTIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIHJlc29sdmVBcGlVcmwsIHR5cGUgVG9vbENvbnRleHQgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgdHlwZSBUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogSlNPTlNjaGVtYTc7XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc0V4ZWN1dGVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQgPSB7XG4gIGlucHV0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICByZXN1bHQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xBZnRlclJlc3VsdCA9IHtcbiAgcmVzdWx0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMgPSB7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQgPSBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBIb29rU3RhdHVzUGFyYW1zID0ge1xuICBzdGF0dXM6IEFnZW50U3RhdHVzO1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1N0YXR1c1Jlc3VsdCA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPjtcblxudHlwZSBBZ2VudEhvb2tzID0ge1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICBcInRvb2wuYWZ0ZXJcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IHJlc3VsdDogdW5rbm93biB9PjtcbiAgc3RhdHVzPzogKHN0YXR1czogQWdlbnRTdGF0dXMpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufTtcblxudHlwZSBOZWVkc0FwcHJvdmFsRW50cnkgPVxuICB8IGJvb2xlYW5cbiAgfCAoKFxuICAgICAgaW5wdXQ6IHVua25vd24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHVua25vd25bXTtcbiAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVua25vd247XG4gICAgICB9XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG5cbmV4cG9ydCB0eXBlIERpc3BhdGNoQ29udGV4dCA9IHtcbiAgdG9vbHM6IFRvb2xTZXQgfCB1bmRlZmluZWQ7XG4gIGhvb2tzOiBBZ2VudEhvb2tzIHwgdW5kZWZpbmVkO1xuICBuZWVkc0FwcHJvdmFsOiBSZWNvcmQ8c3RyaW5nLCBOZWVkc0FwcHJvdmFsRW50cnk+IHwgdW5kZWZpbmVkO1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBnZXRTdG9yYWdlSW5zdGFuY2U6ICgpID0+IEFnZW50U3RvcmFnZTtcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG4gIHJwYzogUnBjRm47XG4gIG92ZXJyaWRlcz86IEFnZW50UnBjT3ZlcnJpZGVzO1xufTtcblxuLyoqIERlZmF1bHQgbmVlZHNBcHByb3ZhbCBmb3IgYnVpbHQtaW4gdG9vbHMgKHVzZXIgY2FuIG92ZXJyaWRlIHZpYSBuZWVkc0FwcHJvdmFsIGNvbmZpZykuICovXG5jb25zdCBidWlsdGluTmVlZHNBcHByb3ZhbDogUGFydGlhbDxcbiAgUmVjb3JkPEJ1aWx0SW5Ub29sTmFtZSwgTmVlZHNBcHByb3ZhbEVudHJ5PlxuPiA9IHtcbiAgQmFzaDogdHJ1ZSxcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gb3ZlcnJpZGUgcmVzdWx0IHRvIFJwY1Jlc3VsdCwgb3IgbnVsbCB0byBmYWxsIHRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU92ZXJyaWRlUmVzdWx0PFQ+KHJlczogQWdlbnRScGNSZXN1bHQ8VD4pOiBScGNSZXN1bHQ8VD4gfCBudWxsIHtcbiAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChyZXMub2spIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHJlcy5yZXN1bHQgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGVycm9yOiB7IGNvZGU6IFwiSEFORExFUl9FUlJPUlwiLCBtZXNzYWdlOiByZXMuZXJyb3IgfSxcbiAgICBzdGF0dXM6IDQwMCxcbiAgfTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBkaXNwYXRjaCBmdW5jdGlvbi4gUmV0dXJucyBScGNSZXN1bHQsIG5vdCBSZXNwb25zZS5cbiAqIEVuYWJsZXMgcmVjdXJzaXZlIGNhbGxzIGZvciBob29rcyB3aXRob3V0IEpTT04gcm91bmQtdHJpcHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwYXRjaChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHBhcmFtczogdW5rbm93bixcbiAgY29udGV4dDogRGlzcGF0Y2hDb250ZXh0LFxuICBuYW1lPzogc3RyaW5nXG4pOiBQcm9taXNlPFJwY1Jlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgdG9vbHMsXG4gICAgaG9va3MsXG4gICAgbmVlZHNBcHByb3ZhbCxcbiAgICBzdG9yYWdlQ29uZmlnLFxuICAgIGdldFN0b3JhZ2VJbnN0YW5jZSxcbiAgICBnZXRTdG9yYWdlSGFuZGxlcnMsXG4gICAgcnBjLFxuICAgIG92ZXJyaWRlcyxcbiAgfSA9IGNvbnRleHQ7XG5cbiAgc3dpdGNoIChtZXRob2QpIHtcbiAgICBjYXNlIFwidG9vbHMubGlzdFwiOiB7XG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9ICgpOiBScGNSZXN1bHQ8VG9vbE1ldGFkYXRhW10+ID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHRvb2xzTWFwKS5tYXAoKFtuYW1lLCB0XSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAodCBhcyBUb29sKS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBpbnB1dFNjaGVtYTogc2NoZW1hVG9Kc29uU2NoZW1hKCh0IGFzIFRvb2wpLmlucHV0U2NoZW1hKSxcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5saXN0XCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4oe30pO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVkID0gaGFuZGxlT3ZlcnJpZGVSZXN1bHQob3ZlcnJpZGVSZXN1bHQpO1xuICAgICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiSEFORExFUl9FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcInRvb2xzLm5lZWRzQXBwcm92YWxcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBUb29sc05lZWRzQXBwcm92YWxQYXJhbXM7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gYXN5bmMgKCk6IFByb21pc2U8UnBjUmVzdWx0PGJvb2xlYW4+PiA9PiB7XG4gICAgICAgIC8vIDEuIFBlci10b29sIG5lZWRzQXBwcm92YWwgb24gY3VzdG9tIHRvb2xzIHRha2VzIHByaW9yaXR5XG4gICAgICAgIGNvbnN0IHRvb2xzTWFwID0gdG9vbHMgPz8gKHt9IGFzIFRvb2xTZXQpO1xuICAgICAgICBjb25zdCB0b29sRGVmID0gdG9vbHNNYXBbcC50b29sTmFtZV0gYXMgVG9vbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRvb2xEZWY/Lm5lZWRzQXBwcm92YWwgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdG9vbERlZi5uZWVkc0FwcHJvdmFsID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiB0b29sRGVmLm5lZWRzQXBwcm92YWwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdG9vbERlZi5uZWVkc0FwcHJvdmFsKHAuaW5wdXQsIHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHAudG9vbENhbGxJZCxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBwLm1lc3NhZ2VzIGFzIG5ldmVyW10sXG4gICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQWdlbnQtbGV2ZWwgbmVlZHNBcHByb3ZhbCBtYXAsIGZhbGxpbmcgYmFjayB0byBidWlsdC1pbiBkZWZhdWx0c1xuICAgICAgICBjb25zdCBlbnRyeSA9XG4gICAgICAgICAgbmVlZHNBcHByb3ZhbD8uW3AudG9vbE5hbWVdID8/XG4gICAgICAgICAgYnVpbHRpbk5lZWRzQXBwcm92YWxbcC50b29sTmFtZSBhcyBCdWlsdEluVG9vbE5hbWVdID8/XG4gICAgICAgICAgZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBlbnRyeSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudHJ5KHAuaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBwLnRvb2xDYWxsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IHAubWVzc2FnZXMsXG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcInRvb2xzLm5lZWRzQXBwcm92YWxcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/LihwKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGhhbmRsZU92ZXJyaWRlUmVzdWx0KG92ZXJyaWRlUmVzdWx0KTtcbiAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWZhdWx0SGFuZGxlcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIk5FRURTX0FQUFJPVkFMX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwiaG9vay50b29sLmJlZm9yZVwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIEhvb2tUb29sQmVmb3JlUGFyYW1zO1xuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jIChcbiAgICAgICAgaG9va1BhcmFtczogSG9va1Rvb2xCZWZvcmVQYXJhbXNcbiAgICAgICk6IFByb21pc2U8SG9va1Rvb2xCZWZvcmVSZXN1bHQ+ID0+IHtcbiAgICAgICAgaWYgKCFob29rcz8uW1widG9vbC5iZWZvcmVcIl0pIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2tzW1widG9vbC5iZWZvcmVcIl0oaG9va1BhcmFtcyk7XG4gICAgICAgIHJldHVybiBob29rUmVzdWx0ID8/IHt9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcImhvb2sudG9vbC5iZWZvcmVcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBjdXJyZW50UGFyYW1zID0gcDtcbiAgICAgICAgbGV0IG1lcmdlZDogSG9va1Rvb2xCZWZvcmVSZXN1bHQgPSB7fTtcblxuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdD8ub2spIHtcbiAgICAgICAgICBtZXJnZWQgPSB7IC4uLm1lcmdlZCwgLi4ub3ZlcnJpZGVSZXN1bHQucmVzdWx0IH07XG4gICAgICAgICAgaWYgKG1lcmdlZC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQucmVzdWx0LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbXMgPSB7XG4gICAgICAgICAgICAgIC4uLmN1cnJlbnRQYXJhbXMsXG4gICAgICAgICAgICAgIGlucHV0OiBvdmVycmlkZVJlc3VsdC5yZXN1bHQuaW5wdXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRSZXN1bHQgPSBhd2FpdCBkZWZhdWx0SGFuZGxlcihjdXJyZW50UGFyYW1zKTtcbiAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLmRlZmF1bHRSZXN1bHQgfTtcblxuICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIkhPT0tfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgXCJob29rLnRvb2wuYWZ0ZXJcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBIb29rVG9vbEFmdGVyUGFyYW1zO1xuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jIChcbiAgICAgICAgaG9va1BhcmFtczogSG9va1Rvb2xBZnRlclBhcmFtc1xuICAgICAgKTogUHJvbWlzZTxIb29rVG9vbEFmdGVyUmVzdWx0PiA9PiB7XG4gICAgICAgIGlmICghaG9va3M/LltcInRvb2wuYWZ0ZXJcIl0pIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2tzW1widG9vbC5hZnRlclwiXShob29rUGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGhvb2tSZXN1bHQgPz8ge307XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcz8uW1wiaG9vay50b29sLmFmdGVyXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgY3VycmVudFBhcmFtcyA9IHA7XG4gICAgICAgIGxldCBtZXJnZWQ6IEhvb2tUb29sQWZ0ZXJSZXN1bHQgPSB7fTtcblxuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdD8ub2spIHtcbiAgICAgICAgICBtZXJnZWQgPSB7IC4uLm1lcmdlZCwgLi4ub3ZlcnJpZGVSZXN1bHQucmVzdWx0IH07XG4gICAgICAgICAgaWYgKG1lcmdlZC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQucmVzdWx0LnJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjdXJyZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgICAuLi5jdXJyZW50UGFyYW1zLFxuICAgICAgICAgICAgICByZXN1bHQ6IG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5yZXN1bHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRSZXN1bHQgPSBhd2FpdCBkZWZhdWx0SGFuZGxlcihjdXJyZW50UGFyYW1zKTtcbiAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLmRlZmF1bHRSZXN1bHQgfTtcblxuICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIkhPT0tfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgXCJob29rLnN0YXR1c1wiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIEhvb2tTdGF0dXNQYXJhbXM7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBob29rcz8uc3RhdHVzPy4ocC5zdGF0dXMpO1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHt9IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiSE9PS19FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcInRvb2xzLmV4ZWN1dGVcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBUb29sc0V4ZWN1dGVQYXJhbXM7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gYXN5bmMgKCk6IFByb21pc2U8UnBjUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHRvb2xzTWFwID0gdG9vbHMgPz8gKHt9IGFzIFRvb2xTZXQpO1xuICAgICAgICBjb25zdCB0b29sRGVmID0gdG9vbHNNYXBbcC5uYW1lIGFzIGtleW9mIHR5cGVvZiB0b29sc01hcF07XG4gICAgICAgIGlmICghdG9vbERlZikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIlRPT0xfTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmtub3duIHRvb2w6ICR7cC5uYW1lfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4ZWN1dGUgPSAodG9vbERlZiBhcyBUb29sKS5leGVjdXRlO1xuICAgICAgICBpZiAoIWV4ZWN1dGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgY29kZTogXCJOT19FWEVDVVRFXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBUb29sICR7cC5uYW1lfSBoYXMgbm8gZXhlY3V0ZSBmdW5jdGlvbmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNhbmRib3hJbnN0YW5jZSA9IGdldFNhbmRib3goe1xuICAgICAgICAgIHNhbmRib3hSZWNvcmQ6IHAuc2FuZGJveFJlY29yZCxcbiAgICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICAgIHN0b3JhZ2U6IGdldFN0b3JhZ2VJbnN0YW5jZSgpLFxuICAgICAgICAgIHJwYyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdG9vbENvbnRleHQ6IFRvb2xDb250ZXh0ID0ge1xuICAgICAgICAgIHNlc3Npb246IHAuc2Vzc2lvbixcbiAgICAgICAgICBzYW5kYm94OiBzYW5kYm94SW5zdGFuY2UsXG4gICAgICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICAgICAgY29udGV4dDogcC5jb250ZXh0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0b29sSW5wdXQgPSBwLmlucHV0O1xuXG4gICAgICAgIGNvbnN0IGJlZm9yZVJlc3VsdCA9IGF3YWl0IGRpc3BhdGNoKFxuICAgICAgICAgIFwiaG9vay50b29sLmJlZm9yZVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICBjb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoXCJlcnJvclwiIGluIGJlZm9yZVJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBiZWZvcmVSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmVmb3JlSG9vayA9IGJlZm9yZVJlc3VsdC5yZXN1bHQgYXMgSG9va1Rvb2xCZWZvcmVSZXN1bHQ7XG4gICAgICAgIGlmIChiZWZvcmVIb29rLnN0b3ApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgY29kZTogXCJIT09LX1NUT1BQRURcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJ0b29sLmJlZm9yZSBob29rIHN0b3BwZWQgZXhlY3V0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVmb3JlSG9vay5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdG9vbElucHV0ID0gYmVmb3JlSG9vay5pbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKHRvb2xJbnB1dCBhcyBuZXZlciwge1xuICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICB0b29sQ2FsbElkOiBcInJwY1wiLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYWZ0ZXJSZXN1bHQgPSBhd2FpdCBkaXNwYXRjaChcbiAgICAgICAgICBcImhvb2sudG9vbC5hZnRlclwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBjb250ZXh0OiB0b29sQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoXCJlcnJvclwiIGluIGFmdGVyUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGFmdGVyUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFmdGVySG9vayA9IGFmdGVyUmVzdWx0LnJlc3VsdCBhcyBIb29rVG9vbEFmdGVyUmVzdWx0O1xuICAgICAgICBpZiAoYWZ0ZXJIb29rLnN0b3ApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgY29kZTogXCJIT09LX1NUT1BQRURcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCJ0b29sLmFmdGVyIGhvb2sgc3RvcHBlZCBleGVjdXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlckhvb2sucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBhZnRlckhvb2sucmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcz8uW1widG9vbHMuZXhlY3V0ZVwiXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHApO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVkID0gaGFuZGxlT3ZlcnJpZGVSZXN1bHQob3ZlcnJpZGVSZXN1bHQpO1xuICAgICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmF1bHRIYW5kbGVyKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiRVhFQ1VURV9FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZCBhcyBNZXRob2ROYW1lO1xuICAgICAgaWYgKCFTVE9SQUdFX1JQQ19NRVRIT0RTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiVU5LTk9XTl9NRVRIT0RcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmtub3duIFJQQyBtZXRob2Q6ICR7bWV0aG9kfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ+ID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZVN0b3JhZ2VSZXF1ZXN0KHtcbiAgICAgICAgICBjb25maWc6IHN0b3JhZ2VDb25maWcsXG4gICAgICAgICAgcmVxdWVzdDogeyBtZXRob2QsIHBhcmFtcyB9LFxuICAgICAgICAgIG5hbWU6IG5hbWUgPz8gc3RvcmFnZUNvbmZpZy5uYW1lID8/IFwiZGVmYXVsdFwiLFxuICAgICAgICAgIGdldFN0b3JhZ2VIYW5kbGVycyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcz8uW21ldGhvZE5hbWVdIGFzXG4gICAgICAgIHwgKChwYXJhbXM6IHVua25vd24pID0+IFByb21pc2U8QWdlbnRScGNSZXN1bHQ8dW5rbm93bj4+KVxuICAgICAgICB8IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHBhcmFtcyk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJTVE9SQUdFX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSb3V0ZXMgc3RvcmFnZSBSUEMgcmVxdWVzdHMgYmFzZWQgb24gc3RvcmFnZSBjb25maWcgdHlwZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RvcmFnZVJlcXVlc3Qoe1xuICBjb25maWcsXG4gIHJlcXVlc3QsXG4gIG5hbWUsXG4gIGdldFN0b3JhZ2VIYW5kbGVycyxcbn06IHtcbiAgY29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICByZXF1ZXN0OiBScGNSZXF1ZXN0O1xuICBuYW1lOiBzdHJpbmc7XG4gIGdldFN0b3JhZ2VIYW5kbGVyczogKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxTdG9yYWdlSGFuZGxlcnM+O1xufSk6IFByb21pc2U8UnBjUmVzcG9uc2U+IHtcbiAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgIGNhc2UgXCJsb2NhbFwiOiB7XG4gICAgICBjb25zdCBoYW5kbGVycyA9IGF3YWl0IGdldFN0b3JhZ2VIYW5kbGVycyhuYW1lKTtcbiAgICAgIGNvbnN0IHsgaGFuZGxlU3RvcmFnZVJwYyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zdG9yYWdlL2hhbmRsZXJcIik7XG4gICAgICByZXR1cm4gaGFuZGxlU3RvcmFnZVJwYyhyZXF1ZXN0LCBoYW5kbGVycyk7XG4gICAgfVxuICAgIGNhc2UgXCJ2ZXJjZWxcIjoge1xuICAgICAgY29uc3QgeyBnZXRWZXJjZWxTdG9yYWdlQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi9zdG9yYWdlL2JpbmRpbmdzL3ZlcmNlbFwiXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBnZXRWZXJjZWxTdG9yYWdlQ29uZmlnKCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJveHlTdG9yYWdlUmVxdWVzdCh7XG4gICAgICAgIHVybDogcmVzb2x2ZWQudXJsLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLnJlc29sdmVkLmhlYWRlcnMsIFwieC1hZ2VudC1uYW1lXCI6IG5hbWUgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIFwiY3VzdG9tXCI6IHtcbiAgICAgIHJldHVybiBhd2FpdCBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgICAgICAgdXJsOiByZXNvbHZlQXBpVXJsKHsgYXBpOiBjb25maWcudXJsIH0pLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmNvbmZpZy5oZWFkZXJzLCBcIngtYWdlbnQtbmFtZVwiOiBuYW1lIH0sXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICB9KTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uZmlnIHNhdGlzZmllcyBuZXZlcjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gc3RvcmFnZSB0eXBlOiAkeyhjb25maWcgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFByb3hpZXMgYSBzdG9yYWdlIFJQQyByZXF1ZXN0IHRvIGFuIGV4dGVybmFsIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJveHlTdG9yYWdlUmVxdWVzdCh7XG4gIHVybCxcbiAgaGVhZGVycyxcbiAgcmVxdWVzdCxcbn06IHtcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZXF1ZXN0OiBScGNSZXF1ZXN0O1xufSk6IFByb21pc2U8UnBjUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgLi4uaGVhZGVycyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiUFJPWFlfRVJST1JcIixcbiAgICAgICAgbWVzc2FnZTogYFN0b3JhZ2UgcHJveHkgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8UnBjUmVzcG9uc2U+O1xufVxuXG5mdW5jdGlvbiBzY2hlbWFUb0pzb25TY2hlbWEoc2NoZW1hOiB1bmtub3duKTogSlNPTlNjaGVtYTcgfCB1bmRlZmluZWQge1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHNjaGVtYSAhPT0gbnVsbCAmJlxuICAgIFwiX2RlZlwiIGluIHNjaGVtYSAmJlxuICAgIHR5cGVvZiAoc2NoZW1hIGFzIHouWm9kVHlwZSkuX2RlZiA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICByZXR1cm4gei50b0pTT05TY2hlbWEoc2NoZW1hIGFzIHouWm9kVHlwZSkgYXMgSlNPTlNjaGVtYTc7XG4gIH1cblxuICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJiBzY2hlbWEgIT09IG51bGwpIHtcbiAgICBjb25zdCBzID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChTeW1ib2wuZm9yKFwidmVyY2VsLmFpLnNjaGVtYVwiKSBpbiBzICYmIFwianNvblNjaGVtYVwiIGluIHMpIHtcbiAgICAgIHJldHVybiBzLmpzb25TY2hlbWEgYXMgSlNPTlNjaGVtYTc7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICBzY2hlbWEgIT09IG51bGwgJiZcbiAgICAoXCJ0eXBlXCIgaW4gc2NoZW1hIHx8IFwicHJvcGVydGllc1wiIGluIHNjaGVtYSlcbiAgKSB7XG4gICAgcmV0dXJuIHNjaGVtYSBhcyBKU09OU2NoZW1hNztcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHR5cGUgeyBTZW5kSW5wdXQgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9NZXNzYWdlQW5kUGFydHMoe1xuICBzZXNzaW9uSWQsXG4gIGlkLFxuICBpbnB1dCxcbiAgZGVmYXVsdFJvbGUsXG59OiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaW5wdXQ6IFNlbmRJbnB1dDtcbiAgZGVmYXVsdFJvbGU6IFVJTWVzc2FnZVtcInJvbGVcIl07XG59KTogeyBtZXNzYWdlOiBNZXNzYWdlOyBwYXJ0czogUGFydFtdIH0ge1xuICBsZXQgbWVzc2FnZUlkID0gaWQgPz8gYG1lc3NhZ2VfJHt1bGlkKCl9YDtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICByb2xlOiBkZWZhdWx0Um9sZSxcbiAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIHBhcnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIHBhcnQ6IHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGlucHV0IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbiAgaWYgKGlucHV0LmlkKSB7XG4gICAgbWVzc2FnZUlkID0gaW5wdXQuaWQ7XG4gIH1cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKGlucHV0LmlkKSB7XG4gICAgbWVzc2FnZUlkID0gaW5wdXQuaWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICB1c2FnZTogbnVsbCxcbiAgICAgIHJvbGU6IGlucHV0LnJvbGUgPz8gZGVmYXVsdFJvbGUsXG4gICAgfSxcbiAgICBwYXJ0czogaW5wdXQucGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIG1lc3NhZ2VJZCxcbiAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgaW5kZXgsXG4gICAgICBwYXJ0LFxuICAgIH0pKSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUVhLG9CQU1QLFlBMkZPO0FBbkdiO0FBQUE7QUFBQTtBQUVPLElBQU0scUJBQXFCO0FBTWxDLElBQU0sYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUVBLFlBQU0sU0FBUyxXQUFXLFNBQVUsT0FBTyxVQUFVLE1BQU87QUFDNUQsYUFBTyxTQUFTO0FBQUEsUUFDZCxXQUFXLFNBQVMsRUFBRSxPQUFPLE9BQU8sTUFBTSxJQUFJLEVBQUUsUUFBUSxPQUFPLE9BQU87QUFBQSxRQUN0RSxFQUFFLE9BQU87QUFBQSxNQUNYO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTyxFQUFFLEdBQUcsY0FBYyxHQUFHLFFBQVEsTUFBTTtBQUFBO0FBQUEsSUFHM0MsWUFBWTtBQUFBO0FBQUEsSUFPWixZQUFZLGNBQWMsUUFBUTtBQUFBLElBRWxDLE1BQU0sTUFBTTtBQUNWLFlBQU0sSUFBSTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7OztBRHhuQ0E7QUFVQTsiLAogICJuYW1lcyI6IFsib3B0cyIsICJwYXRoIiwgImVycm9yZSIsICJyZXN1bHQiLCAicmVzb2x2ZSIsICJzdG9yYWdlIiwgInNhbmRib3hSZWNvcmQiLCAiaW1wb3J0X3pvZCIsICJWZXJjZWxTYW5kYm94U0RLIiwgImdldFN0b3JhZ2UiLCAicGF0aCIsICJpbXBvcnRfc2FuZGJveCIsICJlcnJvcmUiLCAiZ2V0VGVzdENyZWRlbnRpYWxzIiwgInNhbmRib3giLCAiVmVyY2VsU2FuZGJveFNESyIsICJyZXNvbHZlIiwgInNuYXBzaG90SWQiLCAiZ2V0U2FuZGJveCIsICJzYW5kYm94UmVjb3JkIiwgImluaXRfY2xpZW50IiwgImluaXRfY2xpZW50IiwgImluaXRfdmVyY2VsIiwgImVxdWFsIiwgImltcG9ydF9haSIsICJlcnJvcmUiLCAiaW1wb3J0X2Zhc3RfZGVlcF9lcXVhbCIsICJpbXBvcnRfdWxpZCIsICJpbXBvcnRfYXBpIiwgImltcG9ydF93b3JrZmxvdyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3VsaWQiLCAiaW1wb3J0X3dvcmtmbG93IiwgImRlYnVnIiwgImltcG9ydF9haSIsICJpbXBvcnRfem9kIiwgInBhdGgiLCAiY3JlYXRlUHJvY2Vzc01hbmFnZXIiLCAiZ2V0U3RvcmFnZSIsICJyZXNvbHZlIiwgImdldFNhbmRib3giLCAic2Vzc2lvbiIsICJzYW5kYm94UmVjb3JkIiwgInNhbmRib3giLCAicmVzdWx0IiwgInN0YXJ0IiwgImV2ZW50IiwgImltcG9ydF96b2QiLCAibmFtZSIsICJyZXN1bHQiLCAiaGFuZGxlU3RvcmFnZVJwYyIsICJnZXRWZXJjZWxTdG9yYWdlQ29uZmlnIiwgImltcG9ydF91bGlkIiwgIm5vdyIsICJqb2luIiwgImNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyIsICJlcXVhbCIsICJzZXNzaW9uIl0KfQo=
6290
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyLnRzIiwgIi4uL3NyYy9lcnJvcnMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvY2xpZW50LnRzIiwgIi4uL3NyYy91dGlscy9kZWJ1Zy50cyIsICIuLi9zcmMvc2FuZGJveC93cml0ZS1maWxlcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy92ZXJjZWwtc2RrLnRzIiwgIi4uL3NyYy9zdG9yYWdlL3JwYy50cyIsICIuLi9zcmMvc3RvcmFnZS9oYW5kbGVyLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2luZGV4LnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9saWZlY3ljbGUtd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2NsaWVudC50cyIsICIuLi9zcmMvc2FuZGJveC9pbmRleC50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy92ZXJjZWwudHMiLCAiLi4vc3JjL3V0aWxzL3BhZ2luYXRlLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2JpbmRpbmdzL2xvY2FsLWZzLWhhbmRsZXJzLnRzIiwgIi4uL3NyYy9pbmRleC50cyIsICIuLi9zcmMvY2xpZW50LnRzIiwgIi4uL3NyYy9hZ2VudC13b3JrZmxvdy50cyIsICIuLi9zcmMvYWdlbnQtd29ya2Zsb3ctc3RlcHMudHMiLCAiLi4vc3JjL3NraWxscy9wYXJzZXIudHMiLCAiLi4vc3JjL3NraWxscy9kaXNjb3Zlci50cyIsICIuLi9zcmMvdG9vbHMvaW5kZXgudHMiLCAiLi4vc3JjL3Rvb2xzL2phdmFzY3JpcHQudHMiLCAiLi4vc3JjL3V0aWxzL3Byb21wdC1jYWNoZS50cyIsICIuLi9zcmMvdXRpbHMvdWkudHMiLCAiLi4vc3JjL3V0aWxzL3VzYWdlLnRzIiwgIi4uL3NyYy9ycGMtZGlzcGF0Y2gudHMiLCAiLi4vc3JjL3V0aWxzL21lc3NhZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQmFzaFJlc3VsdCwgU2FuZGJveCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBSVRfVU5USUwgPSAyMDAwO1xuXG4vKipcbiAqIFNoZWxsIHNjcmlwdCB0aGF0IGhhbmRsZXMgYWxsIHByb2Nlc3MgZXhlY3V0aW9uIGxvZ2ljLlxuICogSW5zdGFsbGVkIHRvIH4vLmFnZW50L2Jpbi9ydW4uc2ggZHVyaW5nIGluaXQoKS5cbiAqL1xuY29uc3QgUlVOX1NDUklQVCA9IGAjIS9iaW4vc2hcbiMgUHJvY2VzcyBydW5uZXIgZm9yIEFnZW50IFNES1xuIyBBbGwgcGFyYW1ldGVycyBwYXNzZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBhdm9pZCBlc2NhcGluZyBpc3N1ZXNcbiMgT3V0cHV0IGlzIGJhc2U2NCBlbmNvZGVkIHRvIGF2b2lkIEpTT04gZXNjYXBpbmcgaXNzdWVzXG5cbkFHRU5UX0RJUj1cIiRIT01FLy5hZ2VudFwiXG5DV0RfRklMRT1cIiRBR0VOVF9ESVIvY3dkLyRTRVNTSU9OX0lEXCJcblxuIyBHZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAocGVyLXNlc3Npb24pXG5pZiBbIC1mIFwiJENXRF9GSUxFXCIgXTsgdGhlblxuICBDV0Q9JChjYXQgXCIkQ1dEX0ZJTEVcIilcbmVsc2VcbiAgQ1dEPVwiJEhPTUVcIlxuZmlcblxuIyBEZWNvZGUgY29tbWFuZFxuQ01EPSQoZWNobyBcIiRDTURfQkFTRTY0XCIgfCBiYXNlNjQgLWQpXG5cbiMgQmFja2dyb3VuZCBtb2RlICh3YWl0VW50aWwgPSAwKVxuaWYgWyBcIiRXQUlUX1VOVElMXCIgPSBcIjBcIiBdOyB0aGVuXG4gIGNkIFwiJENXRFwiIHx8IGNkIFwiJEhPTUVcIlxuXG4gICMgR2VuZXJhdGUgYSBzaW1wbGUgbnVtZXJpYyBJRCBmb3Igb3V0cHV0IGZpbGVcbiAgT1VUUFVUX0lEPVwiJChkYXRlICslcykkJFwiXG4gIE9VVFBVVF9GSUxFPVwiJEFHRU5UX0RJUi9vdXRwdXRzLyRPVVRQVVRfSUQubG9nXCJcblxuICAjIERvdWJsZS1mb3JrIHRvIGZ1bGx5IGRldGFjaCB0aGUgcHJvY2Vzc1xuICAoXG4gICAgKFxuICAgICAgZXZhbCBcIiRDTURcIlxuICAgICAgcHdkID4gXCIkQ1dEX0ZJTEVcIiAyPi9kZXYvbnVsbFxuICAgICkgPiBcIiRPVVRQVVRfRklMRVwiIDI+JjEgPCAvZGV2L251bGwgJlxuICAgIGVjaG8gJCEgPiBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiXG4gIClcblxuICAjIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBQSUQgZmlsZSBpcyB3cml0dGVuXG4gIHNsZWVwIDAuMDVcblxuICAjIFJlYWQgUElEXG4gIGlmIFsgLWYgXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIiBdOyB0aGVuXG4gICAgUElEPSQoY2F0IFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCIpXG4gIGVsc2VcbiAgICBQSUQ9MFxuICBmaVxuXG4gICMgT3V0cHV0IEpTT04gcmVzdWx0IChubyBvdXRwdXQgZm9yIGJhY2tncm91bmQsIHNvIG5vIGVuY29kaW5nIG5lZWRlZClcbiAgcHJpbnRmICd7XCJwaWRcIjolZCxcIm91dHB1dEJhc2U2NFwiOlwiXCIsXCJleGl0Q29kZVwiOi0xLFwic3RhdHVzXCI6XCJydW5uaW5nXCIsXCJvdXRwdXRGaWxlXCI6XCIlc1wiLFwiY3dkXCI6XCIlc1wifVxcXFxuJyBcXFxcXG4gICAgXCIkUElEXCIgXCIkT1VUUFVUX0ZJTEVcIiBcIiRDV0RcIlxuICBleGl0IDBcbmZpXG5cbiMgRm9yZWdyb3VuZCBtb2RlICh3YWl0VW50aWwgPiAwKSAtIHJ1biBkaXJlY3RseSBhbmQgY2FwdHVyZSBvdXRwdXRcbmNkIFwiJENXRFwiIHx8IGNkIFwiJEhPTUVcIlxuXG4jIFJ1biBjb21tYW5kLCBjYXB0dXJlIG91dHB1dCBhbmQgZXhpdCBjb2RlXG5PVVRQVVQ9JChldmFsIFwiJENNRFwiIDI+JjEpXG5FWElUX0NPREU9JD9cblxuIyBVcGRhdGUgQ1dEIGFmdGVyIGNvbW1hbmRcbk5FV19DV0Q9JChwd2QpXG5lY2hvIFwiJE5FV19DV0RcIiA+IFwiJENXRF9GSUxFXCJcblxuIyBEZXRlcm1pbmUgc3RhdHVzXG5pZiBbICRFWElUX0NPREUgLWVxIDAgXTsgdGhlblxuICBTVEFUVVM9XCJjb21wbGV0ZWRcIlxuZWxzZVxuICBTVEFUVVM9XCJmYWlsZWRcIlxuZmlcblxuIyBCYXNlNjQgZW5jb2RlIG91dHB1dCB0byBhdm9pZCBBTEwgZXNjYXBpbmcgaXNzdWVzXG5PVVRQVVRfQkFTRTY0PSQocHJpbnRmICclcycgXCIkT1VUUFVUXCIgfCBiYXNlNjQgfCB0ciAtZCAnXFxcXG4nKVxuXG4jIE91dHB1dCBKU09OIHJlc3VsdCB3aXRoIGJhc2U2NC1lbmNvZGVkIG91dHB1dFxucHJpbnRmICd7XCJwaWRcIjowLFwib3V0cHV0QmFzZTY0XCI6XCIlc1wiLFwiZXhpdENvZGVcIjolZCxcInN0YXR1c1wiOlwiJXNcIixcIm91dHB1dEZpbGVcIjpcIlwiLFwiY3dkXCI6XCIlc1wifVxcXFxuJyBcXFxcXG4gIFwiJE9VVFBVVF9CQVNFNjRcIiBcIiRFWElUX0NPREVcIiBcIiRTVEFUVVNcIiBcIiRORVdfQ1dEXCJcbmA7XG5cbnR5cGUgUnVuT3B0aW9ucyA9IHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICAvKipcbiAgICogTWF4IG1zIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uXG4gICAqIC0gMDogQmFja2dyb3VuZCBtb2RlIC0gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggUElEXG4gICAqIC0gPjA6IEZvcmVncm91bmQgbW9kZSAtIHdhaXQgZm9yIGNvbXBsZXRpb24gKGRlZmF1bHQ6IDMwMDAwKVxuICAgKi9cbiAgd2FpdFVudGlsPzogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIG1hbmFnZXIgdGhhdCB1c2VzIGEgc2luZ2xlIHNoZWxsIHNjcmlwdCB0byBoYW5kbGUgYWxsIGV4ZWN1dGlvbiBsb2dpYy5cbiAqIFJlZHVjZXMgcm91bmQtdHJpcHMgdG8gdGhlIHNhbmRib3ggYnkgZG9pbmcgZXZlcnl0aGluZyBpbiBvbmUgZXhlYyBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvY2Vzc01hbmFnZXIgPSAob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBzZXNzaW9uSWQgfSA9IG9wdHM7XG4gIGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGluaXQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwic2hcIixcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgbWtkaXIgLXAgJEhPTUUvLmFnZW50L2JpbiAkSE9NRS8uYWdlbnQvcGlkcyAkSE9NRS8uYWdlbnQvb3V0cHV0cyAkSE9NRS8uYWdlbnQvY3dkXG5jYXQgPiAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaCA8PCAnU0NSSVBUX0VPRidcbiR7UlVOX1NDUklQVH1cblNDUklQVF9FT0ZcbmNobW9kICt4ICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoYCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3VsdDtcbiAgICB9XG4gICAgYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gIH07XG5cbiAgY29uc3QgcnVuID0gYXN5bmMgKG9wdHM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEJhc2hSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBpbml0KCk7XG5cbiAgICBjb25zdCB7IGNvbW1hbmQsIHdhaXRVbnRpbCA9IERFRkFVTFRfV0FJVF9VTlRJTCB9ID0gb3B0cztcbiAgICBjb25zdCBjbWRCYXNlNjQgPSBCdWZmZXIuZnJvbShjb21tYW5kLCBcInV0Zi04XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwic2hcIixcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgQ01EX0JBU0U2ND1cIiR7Y21kQmFzZTY0fVwiIFdBSVRfVU5USUw9XCIke3dhaXRVbnRpbH1cIiBTRVNTSU9OX0lEPVwiJHtzZXNzaW9uSWR9XCIgJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2hgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0LnRyaW0oKSkgYXMge1xuICAgICAgcGlkOiBudW1iZXI7XG4gICAgICBvdXRwdXRCYXNlNjQ6IHN0cmluZztcbiAgICAgIGV4aXRDb2RlOiBudW1iZXI7XG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gICAgICBvdXRwdXRGaWxlOiBzdHJpbmc7XG4gICAgICBjd2Q6IHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gRGVjb2RlIGJhc2U2NCBvdXRwdXRcbiAgICBjb25zdCBvdXRwdXQgPSBwYXJzZWQub3V0cHV0QmFzZTY0XG4gICAgICA/IEJ1ZmZlci5mcm9tKHBhcnNlZC5vdXRwdXRCYXNlNjQsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmLThcIilcbiAgICAgIDogXCJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBwaWQ6IHBhcnNlZC5waWQsXG4gICAgICBvdXRwdXQsXG4gICAgICBleGl0Q29kZTogcGFyc2VkLmV4aXRDb2RlLFxuICAgICAgc3RhdHVzOiBwYXJzZWQuc3RhdHVzLFxuICAgICAgY3dkOiBwYXJzZWQuY3dkLFxuICAgICAgb3V0cHV0RmlsZTogcGFyc2VkLm91dHB1dEZpbGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBnZXRDd2QgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBhd2FpdCBpbml0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgY29tbWFuZDogXCJzaFwiLFxuICAgICAgYXJnczogW1xuICAgICAgICBcIi1jXCIsXG4gICAgICAgIGBjYXQgJEhPTUUvLmFnZW50L2N3ZC8ke3Nlc3Npb25JZH0gMj4vZGV2L251bGwgfHwgZWNobyBcIiRIT01FXCJgLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHByb2Nlc3MuY3dkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgcmV0dXJuIHN0ZG91dC50cmltKCkgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGluaXQsXG4gICAgcnVuLFxuICAgIGdldEN3ZCxcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb2Nlc3NNYW5hZ2VyID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUHJvY2Vzc01hbmFnZXI+O1xuIiwgImltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbk5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25FcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIGZhaWxlZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNhbmRib3ggJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VDb25mbGljdEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlQ29uZmxpY3RFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiTWVzc2FnZU5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJNZXNzYWdlICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZU5vdEZvdW5kRXJyb3IsXG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbiAgU3RvcmFnZUNvbmZsaWN0RXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWV0aG9kcyB9IGZyb20gXCIuL3JwY1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBQYXJ0LFxuICBTZXR1cFNuYXBzaG90LFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG50eXBlIFJwY1Jlc3BvbnNlPFQ+ID1cbiAgfCB7IHJlc3VsdDogVCB9XG4gIHwgeyBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IH07XG5cbmV4cG9ydCB0eXBlIFJwY0ZuID0gKHBhcmFtczoge1xuICBuYW1lPzogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGFyYW1zOiB1bmtub3duO1xufSkgPT4gUHJvbWlzZTxScGNSZXNwb25zZTx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlQ2xpZW50KHJwY0ZuOiBScGNGbiwgbmFtZT86IHN0cmluZyk6IFN0b3JhZ2Uge1xuICBhc3luYyBmdW5jdGlvbiBycGM8TSBleHRlbmRzIGtleW9mIFN0b3JhZ2VNZXRob2RzPihcbiAgICBtZXRob2Q6IE0sXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicGFyYW1zXCJdPlxuICApOiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjRm4oeyBuYW1lLCBtZXRob2QsIHBhcmFtcyB9KTtcblxuICAgIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LmVycm9yLmNvZGUgPT09IFwiQ09ORkxJQ1RcIikge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUNvbmZsaWN0RXJyb3IoeyByZWFzb246IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcih7XG4gICAgICAgIHJlYXNvbjogYFske3Jlc3VsdC5lcnJvci5jb2RlfV0gJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2Vzc2lvbi5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnNldFwiLCBzZXNzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24udXBkYXRlXCIsIG9wdHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlQ29uZmxpY3RFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNlc3Npb24uZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTYW5kYm94OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLmxpc3RCeVNhbmRib3hcIiwge1xuICAgICAgICAgICAgc2FuZGJveElkOiBvcHRzLnNhbmRib3hJZCxcbiAgICAgICAgICAgIHRhZ3M6IG9wdHMudGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzLm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzLmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jICh7IHNlc3Npb25JZCwgdGFncyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnRhZy5zZXRcIiwgeyBzZXNzaW9uSWQsIHRhZ3MgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbWVzc2FnZToge1xuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLmxpc3RcIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJtZXNzYWdlLmdldFwiLCB7IGlkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZU5vdEZvdW5kRXJyb3IoeyBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcIm1lc3NhZ2Uuc2V0XCIsIG1lc3NhZ2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGxpc3RCeU1lc3NhZ2U6IGFzeW5jIChtZXNzYWdlSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIiwge1xuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PFBhcnQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3RCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PFBhcnQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHBhcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInBhcnQuc2V0XCIsIHBhcnQpKSBhcyBQYXJ0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZTogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwicGFydC5kZWxldGVcIiwgeyBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldFwiLCB7IGtleSB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGtleSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzYW5kYm94LnNldFwiLCByZWNvcmQpO1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94LnVwZGF0ZVwiLCBvcHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94Lmxpc3RcIiwge1xuICAgICAgICAgICAgdGFnczogb3B0cz8udGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzPy5vcmRlcixcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94LnRhZy5zZXRcIiwgeyBzYW5kYm94SWQsIHRhZ3MgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWNxdWlyZUxvY2s6IGFzeW5jIChyZWNvcmQsIGxvY2tUaW1lb3V0TXMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNhbmRib3guYWNxdWlyZUxvY2tcIiwge1xuICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgbG9ja1RpbWVvdXRNcyxcbiAgICAgICAgICB9KSkgYXMgaW1wb3J0KFwiLi90eXBlc1wiKS5TYW5kYm94UmVjb3JkIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXR1cDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzZXR1cC5nZXRcIiwgeyBrZXkgfSkpIGFzIFNldHVwU25hcHNob3QgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNuYXBzaG90KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2V0dXAuc2V0XCIsIHNuYXBzaG90KTtcbiAgICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWNxdWlyZUxvY2s6IGFzeW5jIChrZXksIGxvY2tJZCwgbG9ja1RpbWVvdXRNcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwic2V0dXAuYWNxdWlyZUxvY2tcIiwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbG9ja0lkLFxuICAgICAgICAgICAgbG9ja1RpbWVvdXRNcyxcbiAgICAgICAgICB9KSkgYXMgU2V0dXBTbmFwc2hvdCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tbWFuZDoge1xuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcImNvbW1hbmQuZ2V0XCIsIHsgaWQgfSkpIGFzIENvbW1hbmQgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGNvbW1hbmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcImNvbW1hbmQuc2V0XCIsIGNvbW1hbmQpKSBhcyBDb21tYW5kO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJjb21tYW5kLmxpc3RcIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgaW5jbHVkZUZpbmlzaGVkOiBvcHRzPy5pbmNsdWRlRmluaXNoZWQsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIExpc3RSZXN1bHQ8Q29tbWFuZD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05BTUVTUEFDRSA9IFwiZGVmYXVsdFwiO1xuZXhwb3J0IGNvbnN0IExPQ0FMX1NUT1JBR0VfVkVSU0lPTiA9IFwidjFcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2Uob3B0czoge1xuICBjb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJwYzogUnBjRm47XG59KTogU3RvcmFnZSB7XG4gIGNvbnN0IG5hbWUgPSBvcHRzLmNvbmZpZy5uYW1lID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICByZXR1cm4gZ2V0U3RvcmFnZUNsaWVudChvcHRzLnJwYywgbmFtZSk7XG59XG4iLCAiY29uc3QgZW5hYmxlZCA9XG4gIHByb2Nlc3MuZW52LkFHRU5UX0RFQlVHID09PSBcIjFcIiB8fCBwcm9jZXNzLmVudi5BR0VOVF9ERUJVRyA9PT0gXCJ0cnVlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgaWYgKGVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBVcGxvYWRhYmxlRmlsZSB9IGZyb20gXCIuLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IE1BWF9SRVRSSUVTID0gMjtcbmNvbnN0IFJFVFJZX0JBU0VfTVMgPSA1MDA7XG5cbi8qKlxuICogRXhlYyBhIGNvbW1hbmQgYW5kIGFzc2VydCBleGl0IGNvZGUgMC4gUmV0cmllcyBvbiB0cmFuc2llbnQgZmFpbHVyZXNcbiAqIChleGl0IGNvZGUgMjU1IHdpdGggZW1wdHkgc3RkZXJyIFx1MjAxNCB0eXBpY2FsbHkgYSBzYW5kYm94IHByb2Nlc3Mga2lsbGVkXG4gKiBiZWZvcmUgaXQgY291bGQgcHJvZHVjZSBvdXRwdXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjQ2hlY2tlZChcbiAgc2FuZGJveDogUGljazxTYW5kYm94LCBcImV4ZWNcIj4sXG4gIG9wdHM6IHsgY29tbWFuZDogc3RyaW5nOyBhcmdzPzogc3RyaW5nW10gfSxcbiAgZXJyb3JMYWJlbDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyhvcHRzKTtcbiAgICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBleGVjUmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGlzVHJhbnNpZW50ID0gcmVzdWx0LmV4aXRDb2RlID09PSAyNTUgJiYgIXJlc3VsdC5zdGRlcnIudHJpbSgpO1xuICAgIGlmIChpc1RyYW5zaWVudCAmJiBhdHRlbXB0IDwgTUFYX1JFVFJJRVMpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFJFVFJZX0JBU0VfTVMgKiAoYXR0ZW1wdCArIDEpKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtlcnJvckxhYmVsfSB3aXRoIGV4aXQgY29kZSAke3Jlc3VsdC5leGl0Q29kZX06ICR7cmVzdWx0LnN0ZGVycn1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBmaWxlcyB0byBhIHNhbmRib3ggYXQgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBwYXRoLlxuICogU2hlbGwgc2NyaXB0cyAoLnNoIGZpbGVzKSBhcmUgYXV0b21hdGljYWxseSBtYWRlIGV4ZWN1dGFibGUuXG4gKlxuICogRm9yIHNtYWxsIGZpbGVzICg8MTAwS0IgdG90YWwpLCB1c2VzIHNpbmdsZSBleGVjIHdpdGggaGVyZWRvYy5cbiAqIEZvciBsYXJnZSBmaWxlcywgd3JpdGVzIGJhc2U2NCBjaHVua3MgdGhlbiBkZWNvZGVzIHRvIGF2b2lkIEFSR19NQVggbGltaXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFBpY2s8U2FuZGJveCwgXCJleGVjXCI+O1xuICBmaWxlczogVXBsb2FkYWJsZUZpbGVbXTtcbiAgZGVzdFBhdGg6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzYW5kYm94LCBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpKTtcbiAgY29uc3QgcGFyZW50RGlycyA9IEFycmF5LmZyb20oXG4gICAgbmV3IFNldChmaWxlUGF0aHMubWFwKChwKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocCkpKVxuICApO1xuICBjb25zdCBzaGVsbFNjcmlwdHMgPSBmaWxlUGF0aHMuZmlsdGVyKChwKSA9PiBwLmVuZHNXaXRoKFwiLnNoXCIpKTtcblxuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIC4uLnBhcmVudERpcnNdLFxuICB9KTtcbiAgaWYgKG1rZGlyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBta2RpclJlc3VsdDtcbiAgfVxuICBhd2FpdCBta2RpclJlc3VsdC5yZXN1bHQ7XG5cbiAgY29uc3QgQ0hVTktfU0laRSA9IDUwXzAwMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gZmlsZVBhdGhzW2ldO1xuICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0b0Jhc2U2NChmaWxlLmNvbnRlbnQpO1xuXG4gICAgaWYgKGJhc2U2NENvbnRlbnQubGVuZ3RoIDwgQ0hVTktfU0laRSkge1xuICAgICAgY29uc3QgbWFya2VyID0gYEVPRl8ke2l9YDtcbiAgICAgIGF3YWl0IGV4ZWNDaGVja2VkKFxuICAgICAgICBzYW5kYm94LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYGJhc2U2NCAtZCA+ICR7cXVvdGUoZnVsbFBhdGgpfSA8PCAnJHttYXJrZXJ9J1xuJHtiYXNlNjRDb250ZW50fVxuJHttYXJrZXJ9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBcIndyaXRlRmlsZXMgZmFpbGVkXCJcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBCNjQgPSBgL3RtcC9jaHVuay0ke0RhdGUubm93KCl9LSR7aX0uYjY0YDtcblxuICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1wiLWNcIiwgYD4gJHtxdW90ZSh0ZW1wQjY0KX1gXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGNsZWFyUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgY2xlYXJSZXN1bHQ7XG4gICAgICB9XG4gICAgICBhd2FpdCBjbGVhclJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBvZmZzZXQgPCBiYXNlNjRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgb2Zmc2V0ICs9IENIVU5LX1NJWkVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGJhc2U2NENvbnRlbnQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgbWFya2VyID0gYENIVU5LXyR7b2Zmc2V0fWA7XG4gICAgICAgIGF3YWl0IGV4ZWNDaGVja2VkKFxuICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgICAgYGNhdCA+PiAke3F1b3RlKHRlbXBCNjQpfSA8PCAnJHttYXJrZXJ9J1xuJHtjaHVua31cbiR7bWFya2VyfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ3cml0ZUZpbGVzIGNodW5rIGZhaWxlZFwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGV4ZWNDaGVja2VkKFxuICAgICAgICBzYW5kYm94LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgXCItY1wiLFxuICAgICAgICAgICAgYGJhc2U2NCAtZCA8ICR7cXVvdGUodGVtcEI2NCl9ID4gJHtxdW90ZShmdWxsUGF0aCl9ICYmIHJtIC1mICR7cXVvdGUodGVtcEI2NCl9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBcIndyaXRlRmlsZXMgZGVjb2RlIGZhaWxlZFwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaGVsbFNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNobW9kUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgIGFyZ3M6IFtcIit4XCIsIC4uLnNoZWxsU2NyaXB0c10sXG4gICAgfSk7XG4gICAgaWYgKGNobW9kUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGNobW9kUmVzdWx0O1xuICAgIH1cbiAgICBhd2FpdCBjaG1vZFJlc3VsdC5yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CYXNlNjQoY29udGVudDogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNvbnRlbnQpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICB9XG4gIHJldHVybiBjb250ZW50LnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3MucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2A7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RlYnVnXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IExvZ0VudHJ5LCBPblJlc3RhcnQsIFNhbmRib3gsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgd3JpdGVGaWxlcyB9IGZyb20gXCIuLi93cml0ZS1maWxlc1wiO1xuXG5leHBvcnQgY29uc3QgbG9jYWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZCAmIHsgY29uZmlnOiB7IHR5cGU6IFwibG9jYWxcIiB9IH07XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59ID0+IHtcbiAgY29uc3QgY29uZmlnID0gc2FuZGJveFJlY29yZC5jb25maWc7XG4gIGNvbnN0IGJhc2VQYXRoID0gY29uZmlnLnBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcHJvY2Vzc2VzID0gbmV3IE1hcDxzdHJpbmcsIENoaWxkUHJvY2Vzcz4oKTtcblxuICBjb25zdCBzYW5kYm94OiBTYW5kYm94PFRUYWdzPiA9IHtcbiAgICBpZDogc2FuZGJveFJlY29yZC5pZCxcbiAgICBjb25maWc6IHNhbmRib3hSZWNvcmQuY29uZmlnLFxuICAgIGV4ZWM6ICh7IGNvbW1hbmQsIGFyZ3MsIHNpZ25hbCB9KSA9PiB7XG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tbWFuZElkID0gYGNvbW1hbmRfJHt1bGlkKCl9YDtcblxuICAgICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgICAgICAgICAgY3dkOiBiYXNlUGF0aCxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHByb2Nlc3Nlcy5zZXQoY29tbWFuZElkLCBjaGlsZCk7XG5cbiAgICAgICAgICBsZXQgc3Rkb3V0ID0gXCJcIjtcbiAgICAgICAgICBsZXQgc3RkZXJyID0gXCJcIjtcbiAgICAgICAgICBjb25zdCBsb2dRdWV1ZTogTG9nRW50cnlbXSA9IFtdO1xuICAgICAgICAgIGxldCBsb2dSZXNvbHZlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBsZXQgY2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgICAgICAgIHN0ZG91dCArPSBzdHI7XG4gICAgICAgICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgc3RkZXJyICs9IHN0cjtcbiAgICAgICAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3RkZXJyXCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFByb21pc2U8e1xuICAgICAgICAgICAgc3Rkb3V0OiBzdHJpbmc7XG4gICAgICAgICAgICBzdGRlcnI6IHN0cmluZztcbiAgICAgICAgICAgIGV4aXRDb2RlOiBudW1iZXI7XG4gICAgICAgICAgfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZTogY29kZSA/PyAwIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhc3luYyBmdW5jdGlvbiogbG9ncygpOiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PiB7XG4gICAgICAgICAgICB3aGlsZSAoIWNsb3NlZCB8fCBsb2dRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbG9nUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsb2dSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsb2dSZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBjb21tYW5kSWQsIGxvZ3MsIHJlc3VsdCB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlOiB1bmtub3duKSA9PlxuICAgICAgICAgIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0RG9tYWluOiAocG9ydCkgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCk7XG4gICAgfSxcblxuICAgIGtpbGw6IGFzeW5jICh7IGNvbW1hbmRJZCwgc3RvcmFnZSB9KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IHByb2Nlc3Nlcy5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgIHJlYXNvbjogYENvbW1hbmQgJHtjb21tYW5kSWR9IG5vdCBmb3VuZCBvciBhbHJlYWR5IGZpbmlzaGVkYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuXG4gICAgICBjb25zdCBjbWQgPSBhd2FpdCBzdG9yYWdlLmNvbW1hbmQuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGNtZC5tZXNzYWdlLCBjYXVzZTogY21kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNtZCAmJiBjbWQuc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmNvbW1hbmQuc2V0KHtcbiAgICAgICAgICAuLi5jbWQsXG4gICAgICAgICAgc3RhdHVzOiBcImtpbGxlZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlc3VsdC5tZXNzYWdlLCBjYXVzZTogcmVzdWx0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlYWRGaWxlOiBhc3luYyAoeyBwYXRoOiBmaWxlUGF0aCB9KSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgZmlsZVBhdGgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAgIFwiY29kZVwiIGluIGUgJiZcbiAgICAgICAgICAoZSBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRU5PRU5UXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHdyaXRlRmlsZXM6IChvcHRzKSA9PiB3cml0ZUZpbGVzKHsgc2FuZGJveCwgLi4ub3B0cyB9KSxcblxuICAgIHVwZGF0ZU5ldHdvcmtQb2xpY3k6ICgpID0+XG4gICAgICBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgIHJlYXNvbjogXCJ1cGRhdGVOZXR3b3JrUG9saWN5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBWZXJjZWwgc2FuZGJveGVzXCIsXG4gICAgICAgIH0pXG4gICAgICApLFxuXG4gICAgdGFnOiB7XG4gICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQudGFncz8uW2tleSBhcyBzdHJpbmddIGFzXG4gICAgICAgICAgfCBUVGFnc1t0eXBlb2Yga2V5XVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LmlkLFxuICAgICAgICAgIHRhZ3M6IHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCByZXN1bHQ6IFNhbmRib3g8VFRhZ3M+ICYge1xuICAgIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbiAgfSA9IHNhbmRib3g7XG5cbiAgaWYgKHNldHVwIHx8IG9uUmVzdGFydCkge1xuICAgIGxldCByZXNvbHZlU2V0dXBNZXRhITogKG1ldGE6IFNhbmRib3hTZXR1cE1ldGEpID0+IHZvaWQ7XG4gICAgcmVzdWx0Ll9zZXR1cE1ldGEgPSBuZXcgUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPigocikgPT4ge1xuICAgICAgcmVzb2x2ZVNldHVwTWV0YSA9IHI7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuX29uUmVhZHkgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IG5lZWRzU2V0dXBSdW4gPSAhIXNldHVwO1xuICAgICAgaWYgKHNldHVwKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5nZXQoc2V0dXAua2V5KTtcbiAgICAgICAgaWYgKCEoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikgJiYgZXhpc3RpbmcpIHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc2V0dXAgYWxyZWFkeSBjb21wbGV0ZSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHNraXBwaW5nYFxuICAgICAgICAgICk7XG4gICAgICAgICAgbmVlZHNTZXR1cFJ1biA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgc2V0dXAgbWV0YWRhdGEgYmVmb3JlIHJ1bm5pbmcgc2V0dXAgc28gdGhlIHdvcmtmbG93XG4gICAgICAvLyBjYW4gZW1pdCB0aGUgY29ycmVjdCBzdGF0dXMgaW5kaWNhdG9yIHdoaWxlIHNldHVwIHJ1bnMuXG4gICAgICByZXNvbHZlU2V0dXBNZXRhKHtcbiAgICAgICAgbmVlZHNTZXR1cFJ1bixcbiAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG5lZWRzU2V0dXBSdW4gJiYgc2V0dXApIHtcbiAgICAgICAgZGVidWcoYFtzYW5kYm94OnNldHVwXSBydW5uaW5nIHNldHVwLnJ1biAobG9jYWwsIGtleT1cIiR7c2V0dXAua2V5fVwiKWApO1xuICAgICAgICBhd2FpdCBzZXR1cC5ydW4oc2FuZGJveCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0dXAuc2V0KHtcbiAgICAgICAgICBrZXk6IHNldHVwLmtleSxcbiAgICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBsYXN0VXNlZEF0OiBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNldHVwIGNvbXBsZXRlLCBzdG9yZWQgcmVjb3JkIChrZXk9XCIke3NldHVwLmtleX1cIilgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAob25SZXN0YXJ0KSB7XG4gICAgICAgIGRlYnVnKFwiW3NhbmRib3g6c2V0dXBdIHJ1bm5pbmcgb25SZXN0YXJ0IChsb2NhbClcIik7XG4gICAgICAgIGF3YWl0IG9uUmVzdGFydChzYW5kYm94KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiZXhwb3J0IHsgU2FuZGJveCB9IGZyb20gXCJAdmVyY2VsL3NhbmRib3hcIjtcbiIsICJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBWZXJjZWxMaWZlY3ljbGVDb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHBvbGxJbnRlcnZhbE1zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHN0b3BBZnRlckluYWN0aXZlTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc25hcHNob3RCZWZvcmVUaW1lb3V0TXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc25hcHNob3RJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBhdXRvU3RhcnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgTmV0d29ya1BvbGljeVNjaGVtYSA9IHpcbiAgLnVuaW9uKFtcbiAgICB6LmxpdGVyYWwoXCJhbGxvdy1hbGxcIiksXG4gICAgei5saXRlcmFsKFwiZGVueS1hbGxcIiksXG4gICAgei5vYmplY3Qoe1xuICAgICAgYWxsb3c6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHN1Ym5ldHM6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgYWxsb3c6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgICBkZW55OiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pLFxuICBdKVxuICAub3B0aW9uYWwoKTtcblxuZXhwb3J0IHR5cGUgTmV0d29ya1BvbGljeSA9IHouaW5mZXI8dHlwZW9mIE5ldHdvcmtQb2xpY3lTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgU2FuZGJveENvbmZpZ1NjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgcmVzb3VyY2VzOiB6Lm9iamVjdCh7IHZjcHVzOiB6Lm51bWJlcigpIH0pLm9wdGlvbmFsKCksXG4gICAgcG9ydHM6IHouYXJyYXkoei5udW1iZXIoKSkub3B0aW9uYWwoKSxcbiAgICBsaWZlY3ljbGU6IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYS5vcHRpb25hbCgpLFxuICAgIG5ldHdvcmtQb2xpY3k6IE5ldHdvcmtQb2xpY3lTY2hlbWEsXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwibG9jYWxcIiksXG4gICAgcGF0aDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KSxcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcImN1c3RvbVwiKSxcbiAgICB1cmw6IHouc3RyaW5nKCksXG4gICAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgfSksXG5dKTtcblxuZXhwb3J0IHR5cGUgU2FuZGJveENvbmZpZyA9IHouaW5mZXI8dHlwZW9mIFNhbmRib3hDb25maWdTY2hlbWE+O1xuXG5jb25zdCBHZW5lcmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBtYXhTdGVwczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0ZW1wZXJhdHVyZTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB0b3BLOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcFA6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgZnJlcXVlbmN5UGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBwcmVzZW5jZVBlbmFsdHk6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgbWF4T3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNlc3Npb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHVwZGF0ZWRBdDogei5udW1iZXIoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbGFzdE1lc3NhZ2VJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgc3lzdGVtOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBza2lsbHNEaXI6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgaG9va1Rva2VuOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjdGl2ZVRvb2xzOiB6LmFycmF5KHouc3RyaW5nKCkpLm51bGxhYmxlKCksXG4gIGdlbmVyYXRpb246IEdlbmVyYXRpb25TY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGVwVXNhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0ZXBJbmRleDogei5udW1iZXIoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCksXG4gIGlucHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICBvdXRwdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIHRvdGFsVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVJlYWRUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlV3JpdGVUb2tlbnM6IHoubnVtYmVyKCksXG4gIHJlYXNvbmluZ1Rva2Vuczogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVXNhZ2VTdW1tYXJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxuICBzdGVwQ291bnQ6IHoubnVtYmVyKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IE1lc3NhZ2VVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcHM6IHouYXJyYXkoU3RlcFVzYWdlU2NoZW1hKSxcbiAgc3VtbWFyeTogVXNhZ2VTdW1tYXJ5U2NoZW1hLFxufSk7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VVc2FnZSA9IHouaW5mZXI8dHlwZW9mIE1lc3NhZ2VVc2FnZVNjaGVtYT47XG5leHBvcnQgdHlwZSBVc2FnZVN1bW1hcnkgPSB6LmluZmVyPHR5cGVvZiBVc2FnZVN1bW1hcnlTY2hlbWE+O1xuZXhwb3J0IHR5cGUgU3RlcFVzYWdlID0gei5pbmZlcjx0eXBlb2YgU3RlcFVzYWdlU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IEludGVycnVwdGVkTGFzdFBhcnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGluZGV4OiB6Lm51bWJlcigpLFxuICBwYXJ0OiB6LnVua25vd24oKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgcm9sZTogei5lbnVtKFtcInVzZXJcIiwgXCJhc3Npc3RhbnRcIiwgXCJzeXN0ZW1cIl0pLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBpbnRlcnJ1cHRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGludGVycnVwdGVkTGFzdFBhcnQ6IEludGVycnVwdGVkTGFzdFBhcnRTY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICB1c2FnZTogTWVzc2FnZVVzYWdlU2NoZW1hLm51bGxhYmxlKCksXG59KTtcblxuLyoqXG4gKiBUaGUgYHBhcnRgIGZpZWxkIGNvcnJlc3BvbmRzIHRvIGBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdYCBmcm9tIHRoZSBgYWlgIHBhY2thZ2UuXG4gKiBXZSB1c2UgYHoudW5rbm93bigpYCBiZWNhdXNlIHRoZSBleGFjdCBzaGFwZSB2YXJpZXMgYnkgcGFydCB0eXBlICh0ZXh0LCB0b29sLWNhbGwsXG4gKiB0b29sLXJlc3VsdCwgZXRjLikgYW5kIG1heSBldm9sdmUgd2l0aCB0aGUgQUkgU0RLLiBUaGUgUlBDIGxheWVyIGp1c3QgcGFzc2VzIGl0IHRocm91Z2guXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0U2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGluZGV4OiB6Lm51bWJlcigpLFxuICBwYXJ0OiB6LnVua25vd24oKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3Rkb3V0OiB6LnN0cmluZygpLFxuICBzdGRlcnI6IHouc3RyaW5nKCksXG4gIGV4aXRDb2RlOiB6Lm51bWJlcigpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2FuZGJveFJlY29yZFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNvbmZpZzogU2FuZGJveENvbmZpZ1NjaGVtYSxcbiAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm51bGxhYmxlKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBsYXN0QWN0aXZpdHlBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0F0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIHByb3ZpZGVyTWV0YWRhdGE6IHpcbiAgICAuZGlzY3JpbWluYXRlZFVuaW9uKFwicHJvdmlkZXJcIiwgW1xuICAgICAgei5vYmplY3Qoe1xuICAgICAgICBwcm92aWRlcjogei5saXRlcmFsKFwidmVyY2VsXCIpLFxuICAgICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgc25hcHNob3RJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgfSksXG4gICAgXSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBTZXNzaW9uVXBkYXRlU2NoZW1hID0gU2Vzc2lvblNjaGVtYS5vbWl0KHtcbiAgaWQ6IHRydWUsXG4gIGdlbmVyYXRpb246IHRydWUsXG59KVxuICAucGFydGlhbCgpXG4gIC5leHRlbmQoe1xuICAgIGlkOiBTZXNzaW9uU2NoZW1hLnNoYXBlLmlkLFxuICAgIGdlbmVyYXRpb246IEdlbmVyYXRpb25TY2hlbWEubnVsbGFibGUoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFNhbmRib3hVcGRhdGVTY2hlbWEgPSBTYW5kYm94UmVjb3JkU2NoZW1hLm9taXQoeyBpZDogdHJ1ZSB9KVxuICAucGFydGlhbCgpXG4gIC5leHRlbmQoe1xuICAgIGlkOiBTYW5kYm94UmVjb3JkU2NoZW1hLnNoYXBlLmlkLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IENvbW1hbmRCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICBjb21tYW5kOiB6LnN0cmluZygpLFxuICBhcmdzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3RhdHVzXCIsIFtcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHsgc3RhdHVzOiB6LmxpdGVyYWwoXCJydW5uaW5nXCIpIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJraWxsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiZmFpbGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG5dKTtcblxuZnVuY3Rpb24gTGlzdFJlc3VsdFNjaGVtYTxUIGV4dGVuZHMgei5ab2RUeXBlQW55PihpdGVtU2NoZW1hOiBUKSB7XG4gIHJldHVybiB6Lm9iamVjdCh7XG4gICAgaXRlbXM6IHouYXJyYXkoaXRlbVNjaGVtYSksXG4gICAgbmV4dEN1cnNvcjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IFNldHVwU25hcHNob3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgc25hcHNob3RJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIGxhc3RVc2VkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0lkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxufSk7XG5cbmNvbnN0IG1ldGhvZHMgPSB7XG4gIFwic2Vzc2lvbi5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXNzaW9uLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXNzaW9uU2NoZW1hLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJzZXNzaW9uLnVwZGF0ZVwiOiB7XG4gICAgcGFyYW1zOiBTZXNzaW9uVXBkYXRlU2NoZW1hLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJzZXNzaW9uLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNlc3Npb25TY2hlbWEpLFxuICB9LFxuICBcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5kZWxldGVcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNlc3Npb24udGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcIm1lc3NhZ2UuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBNZXNzYWdlU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwibWVzc2FnZS5zZXRcIjoge1xuICAgIHBhcmFtczogTWVzc2FnZVNjaGVtYSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoTWVzc2FnZVNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5saXN0QnlNZXNzYWdlXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2VJZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoUGFydFNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoUGFydFNjaGVtYSksXG4gIH0sXG4gIFwicGFydC5zZXRcIjoge1xuICAgIHBhcmFtczogUGFydFNjaGVtYSxcbiAgICByZXN1bHQ6IFBhcnRTY2hlbWEsXG4gIH0sXG4gIFwicGFydC5kZWxldGVcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guZ2V0QnlTZXNzaW9uXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgc2Vzc2lvbklkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNhbmRib3guc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgcmVzdWx0OiB6LnZvaWQoKSxcbiAgfSxcbiAgXCJzYW5kYm94LnVwZGF0ZVwiOiB7XG4gICAgcGFyYW1zOiBTYW5kYm94VXBkYXRlU2NoZW1hLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgfSxcbiAgXCJzYW5kYm94Lmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwibGFzdEFjdGl2aXR5QXRfYXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTYW5kYm94UmVjb3JkU2NoZW1hKSxcbiAgfSxcbiAgXCJzYW5kYm94LnRhZy5zZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2FuZGJveElkOiB6LnN0cmluZygpLFxuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgfSxcbiAgXCJjb21tYW5kLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogQ29tbWFuZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcImNvbW1hbmQuc2V0XCI6IHtcbiAgICBwYXJhbXM6IENvbW1hbmRTY2hlbWEsXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gICAgICBpbmNsdWRlRmluaXNoZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKENvbW1hbmRTY2hlbWEpLFxuICB9LFxuICBcInNldHVwLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGtleTogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXR1cC5zZXRcIjoge1xuICAgIHBhcmFtczogU2V0dXBTbmFwc2hvdFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNldHVwLmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIGtleTogei5zdHJpbmcoKSxcbiAgICAgIGxvY2tJZDogei5zdHJpbmcoKSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTZXR1cFNuYXBzaG90U2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5hY3F1aXJlTG9ja1wiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICByZWNvcmQ6IFNhbmRib3hSZWNvcmRTY2hlbWEsXG4gICAgICBsb2NrVGltZW91dE1zOiB6Lm51bWJlcigpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogU2FuZGJveFJlY29yZFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHsgbWV0aG9kcyB9O1xuZXhwb3J0IHR5cGUgU3RvcmFnZU1ldGhvZHMgPSB0eXBlb2YgbWV0aG9kcztcbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWUgPSBrZXlvZiBTdG9yYWdlTWV0aG9kcztcbmV4cG9ydCBjb25zdCBTVE9SQUdFX1JQQ19NRVRIT0RTID0gT2JqZWN0LmtleXMobWV0aG9kcykgYXMgTWV0aG9kTmFtZVtdO1xuIiwgImltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFN0b3JhZ2VDb25mbGljdEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgdHlwZSBNZXRob2ROYW1lLCBtZXRob2RzLCB0eXBlIFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5cbmV4cG9ydCB0eXBlIEhhbmRsZXJzID0ge1xuICBbSyBpbiBNZXRob2ROYW1lXTogKFxuICAgIHBhcmFtczogei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInBhcmFtc1wiXT5cbiAgKSA9PiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1JlcXVlc3QgPSB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBScGNTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+ID0ge1xuICByZXN1bHQ6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBScGNFcnJvclJlc3BvbnNlID0ge1xuICBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVzcG9uc2U8VCA9IHVua25vd24+ID0gUnBjU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgUnBjRXJyb3JSZXNwb25zZTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN0b3JhZ2VScGMoXG4gIGJvZHk6IFJwY1JlcXVlc3QsXG4gIGhhbmRsZXJzOiBIYW5kbGVyc1xuKTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zIH0gPSBib2R5O1xuXG4gIGlmICghKG1ldGhvZCBpbiBtZXRob2RzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBjb2RlOiBcIk1FVEhPRF9OT1RfRk9VTkRcIiwgbWVzc2FnZTogYFVua25vd24gbWV0aG9kOiAke21ldGhvZH1gIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2QgYXMgTWV0aG9kTmFtZTtcbiAgY29uc3Qgc2NoZW1hID0gbWV0aG9kc1ttZXRob2ROYW1lXS5wYXJhbXM7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcblxuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9QQVJBTVNcIixcbiAgICAgICAgbWVzc2FnZTogcGFyc2VkLmVycm9yLmlzc3Vlc1xuICAgICAgICAgIC5tYXAoKGkpID0+IGAke2kucGF0aC5qb2luKFwiLlwiKX06ICR7aS5tZXNzYWdlfWApXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW21ldGhvZE5hbWVdIGFzIChcbiAgICAgIHBhcmFtczogdW5rbm93blxuICAgICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHBhcnNlZC5kYXRhKTtcbiAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGlzQ29uZmxpY3QgPVxuICAgICAgZSBpbnN0YW5jZW9mIFN0b3JhZ2VDb25mbGljdEVycm9yIHx8XG4gICAgICAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubmFtZSA9PT0gXCJTdG9yYWdlQ29uZmxpY3RFcnJvclwiKTtcblxuICAgIGlmIChpc0NvbmZsaWN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIGNvZGU6IFwiQ09ORkxJQ1RcIixcbiAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlRFUk5BTF9FUlJPUlwiLFxuICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsICJleHBvcnQge1xuICBERUZBVUxUX05BTUVTUEFDRSxcbiAgZ2V0U3RvcmFnZSxcbiAgTE9DQUxfU1RPUkFHRV9WRVJTSU9OLFxuICB0eXBlIFJwY0ZuLFxufSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB7XG4gIHR5cGUgSGFuZGxlcnMsXG4gIGhhbmRsZVN0b3JhZ2VScGMsXG4gIHR5cGUgUnBjRXJyb3JSZXNwb25zZSxcbiAgdHlwZSBScGNSZXF1ZXN0LFxuICB0eXBlIFJwY1Jlc3BvbnNlLFxuICB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZSxcbn0gZnJvbSBcIi4vaGFuZGxlclwiO1xuZXhwb3J0IHtcbiAgdHlwZSBNZXNzYWdlVXNhZ2UsXG4gIHR5cGUgTWV0aG9kTmFtZSxcbiAgdHlwZSBTYW5kYm94Q29uZmlnLFxuICBTVE9SQUdFX1JQQ19NRVRIT0RTLFxuICB0eXBlIFN0ZXBVc2FnZSxcbiAgdHlwZSBTdG9yYWdlTWV0aG9kcyxcbiAgdHlwZSBVc2FnZVN1bW1hcnksXG59IGZyb20gXCIuL3JwY1wiO1xuZXhwb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBNZXNzYWdlLFxuICBQYXJ0LFxuICBSZXNvbHZlZFN0b3JhZ2UsXG4gIFNhbmRib3hSZWNvcmQsXG4gIFNlc3Npb24sXG4gIFNldHVwU25hcHNob3QsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG4gIFR5cGVkU2Vzc2lvbixcbiAgVHlwZWRTdG9yYWdlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyA9IDIgKiA2MCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX0lETEVfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5jb25zdCBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUyA9IDEwICogNjAgKiAxMDAwO1xuXG5jb25zdCBnZXRUZXN0Q3JlZGVudGlhbHMgPSAoKSA9PlxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCJcbiAgICA/IHtcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RPS0VOLFxuICAgICAgICB0ZWFtSWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RFQU1fSUQsXG4gICAgICAgIHByb2plY3RJZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfUFJPSkVDVF9JRCxcbiAgICAgIH1cbiAgICA6IHt9O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVTdGVwUmVzdWx0ID1cbiAgfCB7IGFjdGlvbjogXCJjb250aW51ZVwiOyBuZXh0UG9sbE1zOiBudW1iZXIgfVxuICB8IHtcbiAgICAgIGFjdGlvbjogXCJleGl0XCI7XG4gICAgICByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB8IFwiaWRsZVwiIHwgXCJ0aW1lb3V0XCIgfCBcIm5vdF9mb3VuZFwiO1xuICAgIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFNuYXBzaG90U3RlcChcbiAgaW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dFxuKTogUHJvbWlzZTxFcnJvciB8IExpZmVjeWNsZVN0ZXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHsgU2FuZGJveDogVmVyY2VsU2FuZGJveFNESyB9ID0gYXdhaXQgaW1wb3J0KFwiLi92ZXJjZWwtc2RrXCIpO1xuICBjb25zdCB7IGdldFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL3N0b3JhZ2VcIik7XG4gIGlmICghaW5wdXQucnBjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUlBDIG5vdCBmb3VuZFwiKTtcbiAgfVxuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZSh7XG4gICAgY29uZmlnOiBpbnB1dC5zdG9yYWdlQ29uZmlnLFxuICAgIHJwYzogaW5wdXQucnBjLFxuICB9KTtcbiAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpbnB1dC5pZCk7XG4gIGlmIChyZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgY3VycmVudFNhbmRib3hJZCA9XG4gICAgcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgOiBudWxsO1xuXG4gIGlmIChjdXJyZW50U2FuZGJveElkICE9PSBpbnB1dC52ZXJjZWxTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwic2FuZGJveElkX2NoYW5nZWRcIiB9O1xuICB9XG5cbiAgaWYgKCFjdXJyZW50U2FuZGJveElkKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjb25maWcgPSByZWNvcmQuY29uZmlnO1xuICBpZiAoY29uZmlnLnR5cGUgIT09IFwidmVyY2VsXCIpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnN0b3BBZnRlckluYWN0aXZlTXMgPz8gREVGQVVMVF9JRExFX1RJTUVPVVRfTVM7XG4gIGNvbnN0IHNuYXBzaG90QmVmb3JlVGltZW91dE1zID1cbiAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdEJlZm9yZVRpbWVvdXRNcyA/PyBTTkFQU0hPVF9CRUZPUkVfVElNRU9VVF9NUztcblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBsYXN0QWN0aXZpdHkgPSByZWNvcmQubGFzdEFjdGl2aXR5QXQgPz8gcmVjb3JkLmNyZWF0ZWRBdCA/PyBub3c7XG4gIGNvbnN0IGlkbGVEdXJhdGlvbiA9IG5vdyAtIGxhc3RBY3Rpdml0eTtcbiAgY29uc3Qgc2hvdWxkU25hcHNob3REdWVUb0lkbGUgPSBpZGxlRHVyYXRpb24gPiBpZGxlVGltZW91dE1zO1xuXG4gIGxldCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgICBpZiAoc2FuZGJveC50aW1lb3V0IDwgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMpIHtcbiAgICAgIHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgaWYgKHNob3VsZFNuYXBzaG90RHVlVG9JZGxlIHx8IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc2FuZGJveC5zbmFwc2hvdCgpO1xuICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnVwZGF0ZSh7XG4gICAgICAgIGlkOiByZWNvcmQuaWQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IG5ldyBFcnJvcihTdHJpbmcoZSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIixcbiAgICAgIHJlYXNvbjogc2hvdWxkU25hcHNob3REdWVUb0lkbGUgPyBcImlkbGVcIiA6IFwidGltZW91dFwiLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBhY3Rpb246IFwiY29udGludWVcIiwgbmV4dFBvbGxNczogcG9sbEludGVydmFsTXMgfTtcbn1cbiIsICJpbXBvcnQgeyBzbGVlcCB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGNoZWNrQW5kU25hcHNob3RTdGVwIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzXCI7XG5cbmV4cG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH07XG5cbmNvbnN0IERFRkFVTFRfUE9MTF9NUyA9IDIgKiA2MCAqIDEwMDA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3coe1xuICBpbnB1dCxcbn06IHtcbiAgaW5wdXQ6IFNhbmRib3hMaWZlY3ljbGVJbnB1dDtcbn0pIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICBsZXQgbmV4dFBvbGxNcyA9IERFRkFVTFRfUE9MTF9NUztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGF3YWl0IHNsZWVwKG5leHRQb2xsTXMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tBbmRTbmFwc2hvdFN0ZXAoaW5wdXQpO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yIHx8IHJlc3VsdC5hY3Rpb24gPT09IFwiZXhpdFwiKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXh0UG9sbE1zID0gcmVzdWx0Lm5leHRQb2xsTXM7XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFNhbmRib3ggYXMgVmVyY2VsU2FuZGJveFNESyB9IGZyb20gXCJAdmVyY2VsL3NhbmRib3hcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyBzdGFydCB9IGZyb20gXCJ3b3JrZmxvdy9hcGlcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciwgU2FuZGJveE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFRhZ3NTY2hlbWEgfSBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcbmltcG9ydCB0eXBlIHtcbiAgUnBjRm4sXG4gIFNhbmRib3hSZWNvcmQsXG4gIFN0b3JhZ2UsXG4gIFN0b3JhZ2VDb25maWcsXG59IGZyb20gXCIuLi8uLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuLi8uLi91dGlscy9kZWJ1Z1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94U2V0dXBNZXRhIH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBMb2dFbnRyeSxcbiAgT25SZXN0YXJ0LFxuICBTYW5kYm94LFxuICBTYW5kYm94TGlmZWN5Y2xlLFxuICBTYW5kYm94TGlmZWN5Y2xlSW5wdXQsXG4gIFNhbmRib3hTZXR1cCxcbiAgU2FuZGJveFN0YXR1cyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3cgfSBmcm9tIFwiLi9saWZlY3ljbGUtd29ya2Zsb3dcIjtcblxuZXhwb3J0IHR5cGUgVmVyY2VsU2FuZGJveENyZWF0ZU9wdGlvbnMgPSBFeHRyYWN0PFxuICBQYXJhbWV0ZXJzPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZT5bMF0sXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogLlxuICB7fVxuPjtcblxuZXhwb3J0IGNvbnN0IFZFUkNFTF9NQVhfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDYwICogMTAwMDsgLy8gNSBob3Vyc1xuY29uc3QgTE9DS19USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDsgLy8gNSBtaW51dGVzIC0gaWYgbG9jayBvbGRlciB0aGFuIHRoaXMsIGNvbnNpZGVyIGl0IHN0YWxlXG5jb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAyMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbi8qKlxuICogTW9kdWxlLWxldmVsIGNhY2hlIGZvciBpbi1mbGlnaHQgc2FuZGJveCBjcmVhdGlvbiBwcm9taXNlcy5cbiAqIFByZXZlbnRzIHBhcmFsbGVsIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzIGZyb20gY3JlYXRpbmcgZHVwbGljYXRlIHNhbmRib3hlcy5cbiAqL1xuY29uc3QgY3JlYXRlUHJvbWlzZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+PigpO1xuXG5jb25zdCBBQ1RJVklUWV9USFJPVFRMRV9NUyA9IDEwXzAwMDtcbmNvbnN0IGxhc3RBY3Rpdml0eVNlbnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG5jb25zdCBERUZBVUxUX1ZDUFVTID0gMjtcblxuZnVuY3Rpb24gaXNTYW5kYm94R29uZUVycm9yKGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCEoZSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVycm9yV2l0aFJlc3BvbnNlID0gZSBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9O1xuICBjb25zdCBlcnJvcldpdGhDYXVzZSA9IGUgYXMgeyBjYXVzZT86IHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0gfTtcblxuICBjb25zdCBzdGF0dXMgPVxuICAgIGVycm9yV2l0aFJlc3BvbnNlLnJlc3BvbnNlPy5zdGF0dXMgPz9cbiAgICBlcnJvcldpdGhDYXVzZS5jYXVzZT8ucmVzcG9uc2U/LnN0YXR1cztcblxuICBpZiAoc3RhdHVzID09PSA0MTAgfHwgc3RhdHVzID09PSA0MjIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlLm1lc3NhZ2UgfHwgU3RyaW5nKGUpO1xuICBpZiAoXG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIkV4cGVjdGVkIGEgc3RyZWFtIG9mIGNvbW1hbmQgZGF0YVwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJFeHBlY3RlZCBhIHN0cmVhbSBvZiBsb2dzXCIpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3QgdmVyY2VsU2FuZGJveCA9IDxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPih7XG4gIHNhbmRib3hSZWNvcmQsXG4gIHN0b3JhZ2VDb25maWcsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93LFxuICBzdG9yYWdlLFxuICBycGMsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQgJiB7IGNvbmZpZzogeyB0eXBlOiBcInZlcmNlbFwiIH0gfTtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHJwYzogUnBjRm47XG4gIHNldHVwPzogU2FuZGJveFNldHVwO1xuICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG59KTogU2FuZGJveDxUVGFncz4gJiB7XG4gIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgX3NldHVwTWV0YT86IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT47XG59ID0+IHtcbiAgY29uc3QgeyBpZCwgY29uZmlnIH0gPSBzYW5kYm94UmVjb3JkO1xuICBjb25zdCB2Y3B1cyA9IGNvbmZpZy5yZXNvdXJjZXM/LnZjcHVzID8/IERFRkFVTFRfVkNQVVM7XG4gIGNvbnN0IHBvcnRzID0gY29uZmlnLnBvcnRzO1xuICBjb25zdCBuZXR3b3JrUG9saWN5ID0gY29uZmlnLm5ldHdvcmtQb2xpY3k7XG4gIGNvbnN0IGluaXRpYWxWZXJjZWwgPVxuICAgIHNhbmRib3hSZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gc2FuZGJveFJlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICA6IG51bGw7XG5cbiAgdHlwZSBTYW5kYm94SW5zdGFuY2UgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIFZlcmNlbFNhbmRib3hTREsuZ2V0Pj47XG4gIGxldCBzYW5kYm94UHJvbWlzZTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBTYW5kYm94SW5zdGFuY2U+IHwgbnVsbCA9IG51bGw7XG4gIGxldCByZWNvdmVyZWRGcm9tU3RhbGUgPSBmYWxzZTtcbiAgbGV0IGNyZWF0ZWRGcm9tU25hcHNob3QgPSBmYWxzZTtcbiAgbGV0IG5lZWRzU2V0dXBSdW4gPSBmYWxzZTtcbiAgY29uc3QgSE9NRV9ESVIgPSBcIi9ob21lL3ZlcmNlbC1zYW5kYm94XCI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcG9sbEZvclNhbmRib3hJZCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIExPQ0tfVElNRU9VVF9NUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBMT0NLX1BPTExfSU5URVJWQUxfTVMpKTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiByZWNvcmQubWVzc2FnZSwgY2F1c2U6IHJlY29yZCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZlcmNlbFNhbmRib3hJZCA9XG4gICAgICAgIHJlY29yZD8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgICA/IHJlY29yZC5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGlmICh2ZXJjZWxTYW5kYm94SWQpIHtcbiAgICAgICAgcmV0dXJuIHZlcmNlbFNhbmRib3hJZDtcbiAgICAgIH1cbiAgICAgIGlmICghcmVjb3JkPy5hY3F1aXJpbmdMb2NrQXQpIHtcbiAgICAgICAgY29uc3QgZmluYWxDaGVjayA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoZmluYWxDaGVjayBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgICAgICAgcmVhc29uOiBmaW5hbENoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZTogZmluYWxDaGVjayxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5hbFZlcmNlbFNhbmRib3hJZCA9XG4gICAgICAgICAgZmluYWxDaGVjaz8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgICAgID8gZmluYWxDaGVjay5wcm92aWRlck1ldGFkYXRhLnNhbmRib3hJZFxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAoZmluYWxWZXJjZWxTYW5kYm94SWQpIHtcbiAgICAgICAgICByZXR1cm4gZmluYWxWZXJjZWxTYW5kYm94SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgcmVhc29uOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBzYW5kYm94IGNyZWF0aW9uIGJ5IGFub3RoZXIgcHJvY2Vzc1wiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnRMaWZlY3ljbGVXb3JrZmxvdyhcbiAgICB2ZXJjZWxTYW5kYm94SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWVuYWJsZUxpZmVjeWNsZVdvcmtmbG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxpZmVjeWNsZUlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgPSB7XG4gICAgICBpZCxcbiAgICAgIHZlcmNlbFNhbmRib3hJZCxcbiAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICBycGMsXG4gICAgfTtcbiAgICBhd2FpdCBzdGFydChzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3csIFt7IGlucHV0OiBsaWZlY3ljbGVJbnB1dCB9XSkuY2F0Y2goXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlCbG9ja1N0YXRlbWVudHM6IGludGVudGlvbmFsbHkgaWdub3JlZCAtIHdvcmtmbG93IHN0YXJ0IGlzIGZpcmUtYW5kLWZvcmdldFxuICAgICAgKCkgPT4ge31cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChcbiAgICBzbmFwc2hvdElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICAgIHNvdXJjZTogeyB0eXBlOiBcInNuYXBzaG90XCIsIHNuYXBzaG90SWQgfSxcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJlc2hTYW5kYm94KCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgICB0aW1lb3V0OiBWRVJDRUxfTUFYX1RJTUVPVVRfTVMsXG4gICAgICAgICAgcG9ydHMsXG4gICAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHN0YXJ0TGlmZWN5Y2xlV29ya2Zsb3coc2FuZGJveC5zYW5kYm94SWQpO1xuICAgICAgICByZXR1cm4gc2FuZGJveC5zYW5kYm94SWQ7XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgZXhlYyBsb2dpYyBhZ2FpbnN0IGEgcmF3IFZlcmNlbCBTREsgaW5zdGFuY2UuXG4gICAqIFNoYXJlZCBiZXR3ZWVuIHRoZSBtYWluIHNhbmRib3ggd3JhcHBlciBhbmQgdGVtcG9yYXJ5IHNldHVwIHNhbmRib3hlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWNPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAge1xuICAgICAgY29tbWFuZCxcbiAgICAgIGFyZ3MsXG4gICAgICBzaWduYWwsXG4gICAgfTogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M/OiBzdHJpbmdbXTsgc2lnbmFsPzogQWJvcnRTaWduYWwgfVxuICApOiBQcm9taXNlPFxuICAgIHwgU2FuZGJveEVycm9yXG4gICAgfCB7XG4gICAgICAgIGNvbW1hbmRJZDogc3RyaW5nO1xuICAgICAgICBsb2dzOiAoKSA9PiBBc3luY0l0ZXJhYmxlPExvZ0VudHJ5PjtcbiAgICAgICAgcmVzdWx0OiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nOyBleGl0Q29kZTogbnVtYmVyIH0+O1xuICAgICAgfVxuICA+IHtcbiAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBpbnN0YW5jZS5ydW5Db21tYW5kKHtcbiAgICAgICAgICBjd2Q6IEhPTUVfRElSLFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgY21kOiBjb21tYW5kLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICBjb25zdCBsb2dCdWZmZXI6IExvZ0VudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgcmVzb2x2ZTogbnVsbCBhcyAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICAgICAgIGNvbnN1bWVkOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb25zdW1lTG9ncyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbG9nIG9mIG91dHB1dC5sb2dzKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID1cbiAgICAgICAgICAgICAgICBsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiXG4gICAgICAgICAgICAgICAgICA/IHsgc3RyZWFtOiBcInN0ZG91dFwiLCBkYXRhOiBsb2cuZGF0YSB9XG4gICAgICAgICAgICAgICAgICA6IHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBsb2cuZGF0YSB9O1xuXG4gICAgICAgICAgICAgIGlmIChsb2cuc3RyZWFtID09PSBcInN0ZG91dFwiKSB7XG4gICAgICAgICAgICAgICAgc3Rkb3V0ICs9IGxvZy5kYXRhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsb2cuZGF0YTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxvZ0J1ZmZlci5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBTYW5kYm94IG1heSBoYXZlIGJlZW4gc3RvcHBlZCAtIGxvZ3MgZW5kcG9pbnQgcmV0dXJucyA0MjJcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICghc3RhdGUuY29uc3VtZWQgfHwgaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHlpZWxkIGxvZ0J1ZmZlcltpbmRleCsrXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb25zdW1lTG9ncy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWQgPSBhd2FpdCBvdXRwdXQud2FpdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgIGV4aXRDb2RlOiBmaW5pc2hlZC5leGl0Q29kZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGlzU2FuZGJveEdvbmVFcnJvcihlKSkge1xuICAgICAgICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IDEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBjb21tYW5kSWQ6IG91dHB1dC5jbWRJZCwgbG9ncywgcmVzdWx0IH07XG4gICAgICB9LFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEZpbGVPbkluc3RhbmNlKFxuICAgIGluc3RhbmNlOiBTYW5kYm94SW5zdGFuY2UsXG4gICAgeyBwYXRoIH06IHsgcGF0aDogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBCdWZmZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICB0cnk6ICgpID0+IGluc3RhbmNlLnJlYWRGaWxlVG9CdWZmZXIoeyBwYXRoLCBjd2Q6IEhPTUVfRElSIH0pLFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlc09uSW5zdGFuY2UoXG4gICAgaW5zdGFuY2U6IFNhbmRib3hJbnN0YW5jZSxcbiAgICBvcHRzOiB7XG4gICAgICBmaWxlczogeyBwYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlciB9W107XG4gICAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmaWxlcywgZGVzdFBhdGggfSA9IG9wdHM7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdGl2ZUZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucG9zaXguam9pbihkZXN0UGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgICAgPyBmaWxlUGF0aFxuICAgICAgICA6IHBhdGgucG9zaXguam9pbihIT01FX0RJUiwgZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIHR5cGVvZiBmaWxlLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gQnVmZmVyLmZyb20oZmlsZS5jb250ZW50KVxuICAgICAgICAgICAgOiBmaWxlLmNvbnRlbnQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgaW5zdGFuY2Uud3JpdGVGaWxlcyhuYXRpdmVGaWxlcyk7XG5cbiAgICBjb25zdCBzaGVsbFNjcmlwdHMgPSBuYXRpdmVGaWxlcy5maWx0ZXIoKGYpID0+IGYucGF0aC5lbmRzV2l0aChcIi5zaFwiKSk7XG4gICAgaWYgKHNoZWxsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaG1vZFJlc3VsdCA9IGF3YWl0IGV4ZWNPbkluc3RhbmNlKGluc3RhbmNlLCB7XG4gICAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzLm1hcCgoZikgPT4gZi5wYXRoKV0sXG4gICAgICB9KTtcbiAgICAgIGlmIChjaG1vZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGNobW9kUmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgY2htb2RSZXN1bHQucmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbWluaW1hbCBTYW5kYm94IHdyYXBwZXIgYXJvdW5kIGEgcmF3IFZlcmNlbCBTREsgaW5zdGFuY2UuXG4gICAqIFVzZWQgZm9yIHJ1bm5pbmcgc2V0dXAucnVuKCkgb24gYSB0ZW1wb3Jhcnkgc2FuZGJveCBmb3Igc25hcHNob3QgY3JlYXRpb24uXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVUZW1wU2FuZGJveChpbnN0YW5jZTogU2FuZGJveEluc3RhbmNlKTogU2FuZGJveCB7XG4gICAgY29uc3QgdGVtcFNhbmRib3g6IFNhbmRib3ggPSB7XG4gICAgICBpZDogYF9fc2V0dXBfdGVtcF8ke0RhdGUubm93KCl9YCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGV4ZWM6IChvcHRzKSA9PiBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICByZWFkRmlsZTogKG9wdHMpID0+IHJlYWRGaWxlT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICBnZXREb21haW46ICgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIm5vdCBhdmFpbGFibGUgZHVyaW5nIHNldHVwXCIgfSlcbiAgICAgICAgKSxcbiAgICAgIGtpbGw6ICgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBcIm5vdCBhdmFpbGFibGUgZHVyaW5nIHNldHVwXCIgfSlcbiAgICAgICAgKSxcbiAgICAgIHdyaXRlRmlsZXM6IChvcHRzKSA9PiB3cml0ZUZpbGVzT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyksXG4gICAgICB1cGRhdGVOZXR3b3JrUG9saWN5OiAocG9saWN5KSA9PlxuICAgICAgICBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICAgIHRyeTogKCkgPT4gaW5zdGFuY2UudXBkYXRlTmV0d29ya1BvbGljeShwb2xpY3kpLFxuICAgICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgICAgfSksXG4gICAgICB0YWc6IHtcbiAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4gKHt9KSBhcyBUVGFncyxcbiAgICAgICAgZ2V0OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIHNldDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBzZXRNYW55OiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRlbXBTYW5kYm94O1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIGZvciBhIHNldHVwIHNuYXBzaG90IHRvIGJlY29tZSBhdmFpbGFibGUuIFJldHVybnMgdGhlIHNuYXBzaG90SWRcbiAgICogaWYgb25lIGFwcGVhcnMgYmVmb3JlIHRoZSBsb2NrIHRpbWVzIG91dCwgb3IgbnVsbCBpZiBpdCBkb2Vzbid0LlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gcG9sbEZvclNldHVwU25hcHNob3Qoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBMT0NLX1RJTUVPVVRfTVM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgTE9DS19QT0xMX0lOVEVSVkFMX01TKSk7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChrZXkpO1xuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHJlY29yZD8uc25hcHNob3RJZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnNuYXBzaG90SWQ7XG4gICAgICB9XG4gICAgICAvLyBMb2NrIHJlbGVhc2VkIGJ1dCBubyBzbmFwc2hvdCBcdTIwMTQgY3JlYXRpb24gZmFpbGVkXG4gICAgICBpZiAoIXJlY29yZD8uYWNxdWlyaW5nTG9ja0lkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYmFja2dyb3VuZCBzYW5kYm94LCBydW5zIHNldHVwLCBzbmFwc2hvdHMgaXQsIGFuZCBzdG9yZXMgdGhlXG4gICAqIHNuYXBzaG90IElELiBVc2VzIGF0b21pYyBsb2NraW5nIHRvIGVuc3VyZSBvbmx5IG9uZSBwcm9jZXNzIGNyZWF0ZXMgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZSAtIFNraXAgdGhlIFwic25hcHNob3QgYWxyZWFkeSBleGlzdHNcIiBlYXJseSBleGl0LiBVc2VkIHdoZW5cbiAgICogICB0aGUgY2FsbGVyIGtub3dzIHRoZSBleGlzdGluZyBzbmFwc2hvdCBpcyBzdGFsZS9leHBpcmVkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2V0dXBTbmFwc2hvdChvcHRzPzoge1xuICAgIGZvcmNlPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2V0dXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2V0dXBLZXkgPSBzZXR1cC5rZXk7XG5cbiAgICAvLyBDaGVjayBpZiBzbmFwc2hvdCBhbHJlYWR5IGV4aXN0cyAoZmFzdCBwYXRoIFx1MjAxNCBhdm9pZHMgbG9jayBhdHRlbXB0KVxuICAgIGlmICghb3B0cz8uZm9yY2UpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zZXR1cC5nZXQoc2V0dXBLZXkpO1xuICAgICAgaWYgKCEoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikgJiYgZXhpc3Rpbmc/LnNuYXBzaG90SWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF0b21pY2FsbHkgYWNxdWlyZSBsb2NrIChoYW5kbGVzIGFjdGl2ZS1sb2NrIGRldGVjdGlvbiBpbnRlcm5hbGx5KVxuICAgIGRlYnVnKGBbc2FuZGJveDpzZXR1cF0gYWNxdWlyaW5nIGxvY2sgZm9yIHNldHVwIGtleSBcIiR7c2V0dXBLZXl9XCJgKTtcbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IGxvY2tlZCA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuYWNxdWlyZUxvY2soXG4gICAgICBzZXR1cEtleSxcbiAgICAgIGxvY2tJZCxcbiAgICAgIExPQ0tfVElNRU9VVF9NU1xuICAgICk7XG4gICAgaWYgKGxvY2tlZCBpbnN0YW5jZW9mIEVycm9yIHx8ICFsb2NrZWQpIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIGxvY2sgbm90IGFjcXVpcmVkIGZvciBrZXkgXCIke3NldHVwS2V5fVwiIChhbm90aGVyIHByb2Nlc3MgaG9sZHMgaXQpYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZS1jaGVjazogYW5vdGhlciB3b3JrZXIgbWF5IGhhdmUgY3JlYXRlZCB0aGUgc25hcHNob3QgYmV0d2VlbiBvdXJcbiAgICAvLyBwcmUtY2hlY2sgYW5kIGxvY2sgYWNxdWlzaXRpb24uIElmIHNvLCBza2lwIHVubGVzcyBmb3JjZSAoc3RhbGUgc25hcHNob3QpLlxuICAgIGlmICghb3B0cz8uZm9yY2UgJiYgbG9ja2VkLnNuYXBzaG90SWQpIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIGFmdGVyIGxvY2sgZm9yIGtleSBcIiR7c2V0dXBLZXl9XCIsIHNraXBwaW5nYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGVtcEluc3RhbmNlOiBBd2FpdGVkPFxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESy5jcmVhdGU+XG4gICAgPiB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3Jhcnkgc2FuZGJveCBmb3Igc25hcHNob3R0aW5nLlxuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gY3JlYXRpbmcgdGVtcCBzYW5kYm94IGZvciBzbmFwc2hvdCAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuICAgICAgdGVtcEluc3RhbmNlID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICByZXNvdXJjZXM6IHsgdmNwdXMgfSxcbiAgICAgICAgdGltZW91dDogVkVSQ0VMX01BWF9USU1FT1VUX01TLFxuICAgICAgICBwb3J0cyxcbiAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcFNhbmRib3ggPSBjcmVhdGVUZW1wU2FuZGJveChcbiAgICAgICAgdGVtcEluc3RhbmNlIGFzIHVua25vd24gYXMgU2FuZGJveEluc3RhbmNlXG4gICAgICApO1xuICAgICAgYXdhaXQgc2V0dXAucnVuKHRlbXBTYW5kYm94KTtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNldHVwLnJ1biBjb21wbGV0ZSwgc25hcHNob3R0aW5nIChrZXk9XCIke3NldHVwS2V5fVwiKWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRlbXBJbnN0YW5jZS5zbmFwc2hvdCgpO1xuXG4gICAgICBhd2FpdCBzdG9yYWdlLnNldHVwLnNldCh7XG4gICAgICAgIGtleTogc2V0dXBLZXksXG4gICAgICAgIHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQsXG4gICAgICAgIGNyZWF0ZWRBdDogbG9ja2VkLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgW3NhbmRib3g6c2V0dXBdIHNuYXBzaG90IHN0b3JlZDogJHtzbmFwc2hvdC5zbmFwc2hvdElkfSAoa2V5PVwiJHtzZXR1cEtleX1cIilgXG4gICAgICApO1xuXG4gICAgICAvLyBTdG9wIHRoZSB0ZW1wIHNhbmRib3ggXHUyMDE0IG5vIGxvbmdlciBuZWVkZWQgYWZ0ZXIgc25hcHNob3R0aW5nXG4gICAgICBhd2FpdCB0ZW1wSW5zdGFuY2Uuc3RvcCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtzYW5kYm94OnNldHVwXSBmYWlsZWQgdG8gY3JlYXRlIHNldHVwIHNuYXBzaG90IChrZXk9XCIke3NldHVwS2V5fVwiKTpgLFxuICAgICAgICBlXG4gICAgICApO1xuICAgICAgLy8gU3RvcCB0aGUgdGVtcCBzYW5kYm94IG9uIGZhaWx1cmVcbiAgICAgIGlmICh0ZW1wSW5zdGFuY2UpIHtcbiAgICAgICAgYXdhaXQgdGVtcEluc3RhbmNlLnN0b3AoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gdXAgbG9jayBvbiBmYWlsdXJlXG4gICAgICBhd2FpdCBzdG9yYWdlLnNldHVwXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGtleTogc2V0dXBLZXksXG4gICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGxvY2tlZC5jcmVhdGVkQXQsXG4gICAgICAgICAgbGFzdFVzZWRBdDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgaWYgKGluaXRpYWxWZXJjZWw/LnNhbmRib3hJZCAmJiAhcmVjb3ZlcmVkRnJvbVN0YWxlKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgLy8gU2FuZGJveCBkb2Vzbid0IGV4aXN0IHlldCwgY29udGludWUgd2l0aCBjcmVhdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGV4aXN0aW5nLm1lc3NhZ2UsIGNhdXNlOiBleGlzdGluZyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9XG4gICAgICBleGlzdGluZyBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yID8gbnVsbCA6IGV4aXN0aW5nO1xuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nUmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nUmVjb3JkLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGV4aXN0aW5nVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ1ZlcmNlbC5zYW5kYm94SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQWN0aXZlTG9jayA9XG4gICAgICBleGlzdGluZ1JlY29yZD8uYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgIERhdGUubm93KCkgLSBleGlzdGluZ1JlY29yZC5hY3F1aXJpbmdMb2NrQXQgPCBMT0NLX1RJTUVPVVRfTVM7XG5cbiAgICBpZiAoaGFzQWN0aXZlTG9jaykge1xuICAgICAgcmV0dXJuIHBvbGxGb3JTYW5kYm94SWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NrSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbG9ja2VkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmFjcXVpcmVMb2NrKFxuICAgICAge1xuICAgICAgICBpZCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB0YWdzOiBleGlzdGluZ1JlY29yZD8udGFncyA/PyBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgIGNyZWF0ZWRBdDogZXhpc3RpbmdSZWNvcmQ/LmNyZWF0ZWRBdCA/PyBzYW5kYm94UmVjb3JkLmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdEFjdGl2aXR5QXQ6XG4gICAgICAgICAgZXhpc3RpbmdSZWNvcmQ/Lmxhc3RBY3Rpdml0eUF0ID8/IHNhbmRib3hSZWNvcmQubGFzdEFjdGl2aXR5QXQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbG9ja0lkLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG5vdyxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOlxuICAgICAgICAgICAgZXhpc3RpbmdWZXJjZWw/LnNuYXBzaG90SWQgPz8gaW5pdGlhbFZlcmNlbD8uc25hcHNob3RJZCA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIExPQ0tfVElNRU9VVF9NU1xuICAgICk7XG5cbiAgICBpZiAobG9ja2VkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBsb2NrZWQubWVzc2FnZSwgY2F1c2U6IGxvY2tlZCB9KTtcbiAgICB9XG4gICAgaWYgKCFsb2NrZWQpIHtcbiAgICAgIHJldHVybiBwb2xsRm9yU2FuZGJveElkKCk7XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSB0aGUgbG9ja2VkIHJlY29yZCBmb3IgdXNlIGluIHRoZSByZWxlYXNlIGhlbHBlci5cbiAgICAvLyBUUyBjYW4ndCBuYXJyb3cgYGxvY2tlZGAgaW5zaWRlIG5lc3RlZCBmdW5jdGlvbnMsIHNvIHdlIGJpbmQgaXQgaGVyZS5cbiAgICBjb25zdCBsb2NrZWRSZWNvcmQgPSBsb2NrZWQ7XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBzYW5kYm94IGxvY2sgc28gb3RoZXIgd29ya2VycyBjYW4gcmV0cnkgcXVpY2tseVxuICAgIC8vIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgbG9jayB0aW1lb3V0LlxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VTYW5kYm94TG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveFxuICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICBpZDogbG9ja2VkUmVjb3JkLmlkLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIFJlLWNoZWNrIGFmdGVyIGxvY2s6IGFub3RoZXIgd29ya2VyIG1heSBoYXZlIGNyZWF0ZWQgdGhlIHNhbmRib3hcbiAgICAvLyBiZXR3ZWVuIG91ciBpbml0aWFsIGNoZWNrIGFuZCBsb2NrIGFjcXVpc2l0aW9uLlxuICAgIGNvbnN0IGxvY2tlZFZlcmNlbCA9XG4gICAgICBsb2NrZWRSZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgPyBsb2NrZWRSZWNvcmQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKGxvY2tlZFZlcmNlbD8uc2FuZGJveElkKSB7XG4gICAgICBhd2FpdCByZWxlYXNlU2FuZGJveExvY2soKTtcbiAgICAgIHJldHVybiBsb2NrZWRWZXJjZWwuc2FuZGJveElkO1xuICAgIH1cblxuICAgIGNvbnN0IHNuYXBzaG90SWQgPVxuICAgICAgbG9ja2VkVmVyY2VsPy5zbmFwc2hvdElkID8/XG4gICAgICBpbml0aWFsVmVyY2VsPy5zbmFwc2hvdElkID8/XG4gICAgICBjb25maWcubGlmZWN5Y2xlPy5zbmFwc2hvdElkO1xuICAgIGlmIChzbmFwc2hvdElkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KHNuYXBzaG90SWQpO1xuICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIGNyZWF0ZWRGcm9tU25hcHNob3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBzZXR1cCBzbmFwc2hvdFxuICAgIGlmIChzZXR1cCkge1xuICAgICAgbGV0IGZvcmNlUmVjcmVhdGVTbmFwc2hvdCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dXBSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNldHVwLmdldChzZXR1cC5rZXkpO1xuICAgICAgaWYgKCEoc2V0dXBSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikgJiYgc2V0dXBSZWNvcmQpIHtcbiAgICAgICAgaWYgKHNldHVwUmVjb3JkLnNuYXBzaG90SWQpIHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gZm91bmQgc2V0dXAgc25hcHNob3QgJHtzZXR1cFJlY29yZC5zbmFwc2hvdElkfSBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KFxuICAgICAgICAgICAgc2V0dXBSZWNvcmQuc25hcHNob3RJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICBjcmVhdGVkRnJvbVNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXN0VXNlZEF0IChmaXJlLWFuZC1mb3JnZXQpXG4gICAgICAgICAgICBzdG9yYWdlLnNldHVwXG4gICAgICAgICAgICAgIC5zZXQoe1xuICAgICAgICAgICAgICAgIC4uLnNldHVwUmVjb3JkLFxuICAgICAgICAgICAgICAgIGxhc3RVc2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU25hcHNob3QgaXMgc3RhbGUvZXhwaXJlZCBcdTIwMTQgZm9yY2UgYmFja2dyb3VuZCB0byBvdmVyd3JpdGUgaXRcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc25hcHNob3QgJHtzZXR1cFJlY29yZC5zbmFwc2hvdElkfSBmYWlsZWQgKGV4cGlyZWQ/KSwgd2lsbCByZWNyZWF0ZWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcmNlUmVjcmVhdGVTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICAgICAgc2V0dXBSZWNvcmQuYWNxdWlyaW5nTG9ja0F0ICYmXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIHNldHVwUmVjb3JkLmFjcXVpcmluZ0xvY2tBdCA8IExPQ0tfVElNRU9VVF9NU1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBBbm90aGVyIHByb2Nlc3MgaXMgY3JlYXRpbmcgdGhlIHNldHVwIHNuYXBzaG90IFx1MjAxNCB3YWl0IGZvciBpdFxuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBzbmFwc2hvdCBpbiBwcm9ncmVzcyBmb3Iga2V5IFwiJHtzZXR1cC5rZXl9XCIsIHdhaXRpbmcuLi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzbmFwc2hvdElkID0gYXdhaXQgcG9sbEZvclNldHVwU25hcHNob3Qoc2V0dXAua2V5KTtcbiAgICAgICAgICBpZiAoc25hcHNob3RJZCkge1xuICAgICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICAgIGBbc2FuZGJveDpzZXR1cF0gc25hcHNob3QgcmVhZHk6ICR7c25hcHNob3RJZH0gZm9yIGtleSBcIiR7c2V0dXAua2V5fVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hGcm9tU25hcHNob3Qoc25hcHNob3RJZCk7XG4gICAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZEZyb21TbmFwc2hvdCA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFBvbGwgZmFpbGVkIG9yIHNuYXBzaG90IGNyZWF0aW9uIGZhaWxlZCBcdTIwMTQgZmFsbCB0aHJvdWdoIHRvIGNvbGQgcGF0aFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBObyBzZXR1cCBzbmFwc2hvdCBhdmFpbGFibGUgXHUyMDE0IGNyZWF0ZSBmcmVzaCBhbmQgcnVuIHNldHVwIGxhdGVyLlxuICAgICAgLy8gS2ljayBvZmYgYmFja2dyb3VuZCBzbmFwc2hvdCBpbW1lZGlhdGVseSBzbyBpdCBydW5zIGluIHBhcmFsbGVsXG4gICAgICAvLyB3aXRoIHNldHVwLnJ1biBvbiB0aGUgc2Vzc2lvbiBzYW5kYm94LlxuICAgICAgZGVidWcoXG4gICAgICAgIGBbc2FuZGJveDpzZXR1cF0gbm8gc25hcHNob3QgZm9yIGtleSBcIiR7c2V0dXAua2V5fVwiLCB3aWxsIHJ1biBzZXR1cCBvbiB0aGlzIHNhbmRib3hgXG4gICAgICApO1xuICAgICAgbmVlZHNTZXR1cFJ1biA9IHRydWU7XG4gICAgICBjcmVhdGVTZXR1cFNuYXBzaG90KHsgZm9yY2U6IGZvcmNlUmVjcmVhdGVTbmFwc2hvdCB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiW3NhbmRib3g6c2V0dXBdIGZhaWxlZCB0byBjcmVhdGUgYmFja2dyb3VuZCBzbmFwc2hvdDpcIixcbiAgICAgICAgICBlXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmcmVzaFJlc3VsdCA9IGF3YWl0IGNyZWF0ZUZyZXNoU2FuZGJveCgpO1xuICAgIGlmIChmcmVzaFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhd2FpdCByZWxlYXNlU2FuZGJveExvY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyZXNoUmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVTYW5kYm94SWQoKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjcmVhdGVQcm9taXNlcy5nZXQoaWQpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IGRvR2V0T3JDcmVhdGVTYW5kYm94SWQoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGNyZWF0ZVByb21pc2VzLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gICAgY3JlYXRlUHJvbWlzZXMuc2V0KGlkLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvR2V0U2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4ge1xuICAgIGNvbnN0IHZlcmNlbFNhbmRib3hJZCA9IGF3YWl0IGdldE9yQ3JlYXRlU2FuZGJveElkKCk7XG4gICAgaWYgKHZlcmNlbFNhbmRib3hJZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gdmVyY2VsU2FuZGJveElkO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiAoKSA9PlxuICAgICAgICBWZXJjZWxTYW5kYm94U0RLLmdldCh7XG4gICAgICAgICAgc2FuZGJveElkOiB2ZXJjZWxTYW5kYm94SWQsXG4gICAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICAgIH0pLFxuICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2FuZGJveCgpOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IFNhbmRib3hJbnN0YW5jZT4ge1xuICAgIGlmICghc2FuZGJveFByb21pc2UpIHtcbiAgICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG4gICAgfVxuICAgIHJldHVybiBzYW5kYm94UHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJGcm9tU3RhbGVTYW5kYm94KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHNhbmRib3hQcm9taXNlID0gbnVsbDtcbiAgICByZWNvdmVyZWRGcm9tU3RhbGUgPSB0cnVlO1xuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciB8fCAhZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1ZlcmNlbCA9XG4gICAgICBleGlzdGluZy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICA/IGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGV4aXN0aW5nVmVyY2VsPy5zYW5kYm94SWQpIHtcbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoe1xuICAgICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgIHNuYXBzaG90SWQ6IGV4aXN0aW5nVmVyY2VsLnNuYXBzaG90SWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVMYXN0QWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VudCA9IGxhc3RBY3Rpdml0eVNlbnQuZ2V0KGlkKTtcbiAgICBpZiAobGFzdFNlbnQgJiYgbm93IC0gbGFzdFNlbnQgPCBBQ1RJVklUWV9USFJPVFRMRV9NUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QWN0aXZpdHlTZW50LnNldChpZCwgbm93KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnVwZGF0ZSh7XG4gICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICBsYXN0QWN0aXZpdHlBdDogbm93LFxuICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YTogZXhpc3RpbmdWZXJjZWwgPz8ge1xuICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICBzbmFwc2hvdElkOiBudWxsLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGxpZmVjeWNsZTogU2FuZGJveExpZmVjeWNsZSA9IHtcbiAgICBzdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICBhd2FpdCB1cGRhdGVMYXN0QWN0aXZpdHkoKTtcbiAgICAgIHJldHVybiBzYW5kYm94LnN0YXR1cyBhcyBTYW5kYm94U3RhdHVzO1xuICAgIH0sXG5cbiAgICBzbmFwc2hvdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHNhbmRib3guc25hcHNob3QoKTtcbiAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3gudXBkYXRlKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkIH07XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBzdG9wOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHNhbmRib3guc3RvcCgpO1xuICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRTdGF0dXM6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3guc3RhdHVzIGFzIFNhbmRib3hTdGF0dXM7XG4gICAgfSxcblxuICAgIGdldENyZWF0ZWRBdDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC5jcmVhdGVkQXQ7XG4gICAgfSxcblxuICAgIGdldFJlbWFpbmluZ1RpbWVvdXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNhbmRib3gudGltZW91dDtcbiAgICB9LFxuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRvRXhlYyhvcHRzOiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlUHJvbWlzZSA9IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgYXdhaXQgdXBkYXRlUHJvbWlzZTtcbiAgICByZXR1cm4gZXhlY1Jlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ICYge1xuICAgIF9vblJlYWR5PzogUHJvbWlzZTx2b2lkPjtcbiAgICBfc2V0dXBNZXRhPzogUHJvbWlzZTxTYW5kYm94U2V0dXBNZXRhPjtcbiAgfSA9IHtcbiAgICBpZCxcbiAgICBjb25maWcsXG4gICAgZXhlYzogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvRXhlYyhvcHRzKTtcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFNhbmRib3hFcnJvciAmJiBpc1NhbmRib3hHb25lRXJyb3IocmVzdWx0LmNhdXNlKSkge1xuICAgICAgICBhd2FpdCByZWNvdmVyRnJvbVN0YWxlU2FuZGJveCgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZG9FeGVjKG9wdHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IGFzeW5jIChwb3J0KSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guZG9tYWluKHBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlOiBjbWRTdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbWQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGNtZC5tZXNzYWdlLCBjYXVzZTogY21kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNtZCAmJiBjbWQuc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuc2V0KHtcbiAgICAgICAgICAuLi5jbWQsXG4gICAgICAgICAgc3RhdHVzOiBcImtpbGxlZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlc3VsdC5tZXNzYWdlLCBjYXVzZTogcmVzdWx0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZWFkRmlsZTogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlYWRGaWxlT25JbnN0YW5jZShpbnN0YW5jZSwgb3B0cyk7XG4gICAgfSxcblxuICAgIHdyaXRlRmlsZXM6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlRmlsZXNPbkluc3RhbmNlKGluc3RhbmNlLCBvcHRzKTtcbiAgICB9LFxuXG4gICAgbGlmZWN5Y2xlLFxuXG4gICAgdXBkYXRlTmV0d29ya1BvbGljeTogYXN5bmMgKHBvbGljeSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiAoKSA9PiBpbnN0YW5jZS51cGRhdGVOZXR3b3JrUG9saWN5KHBvbGljeSksXG4gICAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkLnRhZ3M/LltrZXkgYXMgc3RyaW5nXSBhc1xuICAgICAgICAgIHwgVFRhZ3NbdHlwZW9mIGtleV1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBsZXQgb25SZWFkeVByb21pc2U6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgbGV0IHNldHVwTWV0YVByb21pc2U6IFByb21pc2U8U2FuZGJveFNldHVwTWV0YT4gPSBQcm9taXNlLnJlc29sdmUoe1xuICAgIG5lZWRzU2V0dXBSdW46IGZhbHNlLFxuICAgIGNyZWF0ZWRGcm9tU25hcHNob3Q6IGZhbHNlLFxuICB9KTtcblxuICBpZiAoY29uZmlnLmxpZmVjeWNsZT8uYXV0b1N0YXJ0ICE9PSBmYWxzZSkge1xuICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG5cbiAgICAvLyBSZXNvbHZlIHNldHVwIG1ldGFkYXRhIGFzIHNvb24gYXMgdGhlIHNhbmRib3ggaW5zdGFuY2UgaXMgcmVhZHlcbiAgICAvLyAoYmVmb3JlIF9vblJlYWR5IHJ1bnMgc2V0dXApLiBUaGUgd29ya2Zsb3cgcmVhZHMgdGhpcyB0byBjaG9vc2UgdGhlIHN0YXR1cyBpbmRpY2F0b3IuXG4gICAgc2V0dXBNZXRhUHJvbWlzZSA9IHNhbmRib3hQcm9taXNlLnRoZW4oKCkgPT4gKHtcbiAgICAgIG5lZWRzU2V0dXBSdW4sXG4gICAgICBjcmVhdGVkRnJvbVNuYXBzaG90LFxuICAgIH0pKTtcblxuICAgIC8vIEFmdGVyIHNhbmRib3ggaW5zdGFuY2UgaXMgcmVhZHksIHJ1biBzZXR1cCBhbmQvb3Igb25SZXN0YXJ0LlxuICAgIC8vIHNhbmRib3hQcm9taXNlIGlzIGFscmVhZHkgcmVzb2x2ZWQgYnkgdGhlIHRpbWUgLnRoZW4oKSBydW5zLFxuICAgIC8vIHNvIHNldHVwLnJ1biAvIG9uUmVzdGFydCBjYWxsaW5nIHNhbmRib3guZXhlYygpIHdvbid0IGRlYWRsb2NrLlxuICAgIG9uUmVhZHlQcm9taXNlID0gc2FuZGJveFByb21pc2UudGhlbihhc3luYyAoaW5zdGFuY2UpID0+IHtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5lZWRzU2V0dXBSdW4gJiYgc2V0dXApIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFtzYW5kYm94OnNldHVwXSBydW5uaW5nIHNldHVwLnJ1biBvbiBzZXNzaW9uIHNhbmRib3ggKGtleT1cIiR7c2V0dXAua2V5fVwiKWBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2V0dXAucnVuKHNhbmRib3gpO1xuICAgICAgICBkZWJ1ZyhcIltzYW5kYm94OnNldHVwXSBzZXR1cC5ydW4gY29tcGxldGUgb24gc2Vzc2lvbiBzYW5kYm94XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3JlYXRlZEZyb21TbmFwc2hvdCAmJiBvblJlc3RhcnQpIHtcbiAgICAgICAgZGVidWcoXCJbc2FuZGJveDpzZXR1cF0gcnVubmluZyBvblJlc3RhcnQgKGNyZWF0ZWQgZnJvbSBzbmFwc2hvdClcIik7XG4gICAgICAgIGF3YWl0IG9uUmVzdGFydChzYW5kYm94KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNhbmRib3guX29uUmVhZHkgPSBvblJlYWR5UHJvbWlzZTtcbiAgc2FuZGJveC5fc2V0dXBNZXRhID0gc2V0dXBNZXRhUHJvbWlzZTtcbiAgcmV0dXJuIHNhbmRib3g7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHR5cGUgeyBScGNGbiwgU2FuZGJveFJlY29yZCwgU3RvcmFnZSwgU3RvcmFnZUNvbmZpZyB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuLi91dGlscy9kZWJ1Z1wiO1xuaW1wb3J0IHsgbG9jYWxTYW5kYm94IH0gZnJvbSBcIi4vYmluZGluZ3MvbG9jYWxcIjtcbmltcG9ydCB7IHZlcmNlbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy92ZXJjZWxcIjtcbmltcG9ydCB0eXBlIHsgT25SZXN0YXJ0LCBTYW5kYm94LCBTYW5kYm94U2V0dXAgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IGhvdyB0aGUgc2FuZGJveCB3YXMgc2V0IHVwLlxuICogVXNlZCBieSB0aGUgd29ya2Zsb3cgdG8gZW1pdCB0aGUgY29ycmVjdCBzdGF0dXMgaW5kaWNhdG9yLlxuICogUmV0dXJuZWQgYXMgYSBwcm9taXNlIGJlY2F1c2UgdGhlIG1ldGFkYXRhIGlzIGRldGVybWluZWQgYXN5bmNocm9ub3VzbHlcbiAqIGR1cmluZyBzYW5kYm94IGNyZWF0aW9uLCBiZWZvcmUgX29uUmVhZHkgcnVucyBzZXR1cC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FuZGJveFNldHVwTWV0YSA9IHtcbiAgLyoqIFdoZXRoZXIgc2V0dXAucnVuKCkgbmVlZHMgdG8gZXhlY3V0ZSAoY29sZCBzdGFydCwgbm8gc25hcHNob3QpLiAqL1xuICBuZWVkc1NldHVwUnVuOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgc2FuZGJveCB3YXMgY3JlYXRlZCBmcm9tIGEgc25hcHNob3QuICovXG4gIGNyZWF0ZWRGcm9tU25hcHNob3Q6IGJvb2xlYW47XG59O1xuXG50eXBlIFNhbmRib3hXaXRoTWV0YTxUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hPiA9IFNhbmRib3g8VFRhZ3M+ICYge1xuICBfb25SZWFkeT86IFByb21pc2U8dm9pZD47XG4gIF9zZXR1cE1ldGE/OiBQcm9taXNlPFNhbmRib3hTZXR1cE1ldGE+O1xufTtcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgZm9yIHNhbmRib3ggaW5zdGFuY2VzIGtleWVkIGJ5IHNhbmRib3ggcmVjb3JkIElELlxuICpcbiAqIENhY2hlcyBhbGwgc2FuZGJveCBpbnN0YW5jZXMgc28gdGhhdCB0aGUgd29ya2Zsb3cgKHdoaWNoIGNhbGxzIGdldFNhbmRib3hcbiAqIHdpdGhvdXQgc2V0dXAvb25SZXN0YXJ0KSByZXVzZXMgdGhlIHNhbWUgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2Vzc2lvbigpLFxuICogaW5jbHVkaW5nIGl0cyBfb25SZWFkeSBwcm9taXNlIGFuZCBzZXR1cCBtZXRhZGF0YS5cbiAqL1xuY29uc3Qgc2FuZGJveENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFNhbmRib3hXaXRoTWV0YT4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNhbmRib3g8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxuICBzdG9yYWdlLFxuICBycGMsXG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93ID0gdHJ1ZSxcbiAgc2V0dXAsXG4gIG9uUmVzdGFydCxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgc3RvcmFnZTogU3RvcmFnZTtcbiAgcnBjOiBScGNGbjtcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c/OiBib29sZWFuO1xuICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xufSk6IFNhbmRib3hXaXRoTWV0YTxUVGFncz4ge1xuICBjb25zdCBjYWNoZWQgPSBzYW5kYm94Q2FjaGUuZ2V0KHNhbmRib3hSZWNvcmQuaWQpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgZGVidWcoXCJbZ2V0U2FuZGJveF0gY2FjaGUgaGl0IGZvclwiLCBzYW5kYm94UmVjb3JkLmlkKTtcbiAgICByZXR1cm4gY2FjaGVkIGFzIFNhbmRib3hXaXRoTWV0YTxUVGFncz47XG4gIH1cblxuICBjb25zdCBzYnggPSBjcmVhdGVTYW5kYm94PFRUYWdzPih7XG4gICAgc2FuZGJveFJlY29yZCxcbiAgICBzdG9yYWdlQ29uZmlnLFxuICAgIHN0b3JhZ2UsXG4gICAgcnBjLFxuICAgIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93LFxuICAgIHNldHVwLFxuICAgIG9uUmVzdGFydCxcbiAgfSk7XG5cbiAgc2FuZGJveENhY2hlLnNldChzYW5kYm94UmVjb3JkLmlkLCBzYnggYXMgU2FuZGJveFdpdGhNZXRhKTtcblxuICByZXR1cm4gc2J4O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYW5kYm94PFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgc3RvcmFnZSxcbiAgcnBjLFxuICBlbmFibGVMaWZlY3ljbGVXb3JrZmxvdyA9IHRydWUsXG4gIHNldHVwLFxuICBvblJlc3RhcnQsXG59OiB7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHJwYzogUnBjRm47XG4gIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93PzogYm9vbGVhbjtcbiAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbn0pOiBTYW5kYm94V2l0aE1ldGE8VFRhZ3M+IHtcbiAgbGV0IHNieDogU2FuZGJveFdpdGhNZXRhPFRUYWdzPjtcblxuICBzd2l0Y2ggKHNhbmRib3hSZWNvcmQuY29uZmlnLnR5cGUpIHtcbiAgICBjYXNlIFwibG9jYWxcIjpcbiAgICAgIHNieCA9IGxvY2FsU2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQgJiB7XG4gICAgICAgICAgY29uZmlnOiB7IHR5cGU6IFwibG9jYWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBzZXR1cCxcbiAgICAgICAgb25SZXN0YXJ0LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidmVyY2VsXCI6XG4gICAgICBzYnggPSB2ZXJjZWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJ2ZXJjZWxcIiB9O1xuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBycGMsXG4gICAgICAgIGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93LFxuICAgICAgICBzZXR1cCxcbiAgICAgICAgb25SZXN0YXJ0LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY3VzdG9tXCI6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDdXN0b20gc2FuZGJveGVzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzYW5kYm94UmVjb3JkLmNvbmZpZyBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHNhbmRib3ggdHlwZTogJHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IC5cbiAgICAgICAgICAoc2FuZGJveFJlY29yZC5jb25maWcgYXMgYW55KS50eXBlXG4gICAgICAgIH1gXG4gICAgICApO1xuICB9XG5cbiAgLy8gRG9uJ3QgYXdhaXQgX29uUmVhZHkgaGVyZSBcdTIwMTQgbGV0IHRoZSB3b3JrZmxvdyBhd2FpdCBpdCBzbyBpdCBjYW4gZW1pdFxuICAvLyBzdGF0dXMgaW5kaWNhdG9ycyBvdmVyIHRoZSBzdHJlYW0gd2hpbGUgc2V0dXAgcnVucy5cbiAgLy8gSW5zdGVhZCwgd3JhcCBzYW5kYm94IG1ldGhvZHMgc28gYW55IG9wZXJhdGlvbiBvbiB0aGUgc2FuZGJveCBpbXBsaWNpdGx5XG4gIC8vIHdhaXRzIGZvciBzZXR1cCB0byBjb21wbGV0ZS4gV2UgcmV0dXJuIGEgTkVXIG9iamVjdCBzbyB0aGF0IHNldHVwLnJ1bigpLFxuICAvLyB3aGljaCBob2xkcyB0aGUgb3JpZ2luYWwgYHNieGAgdmlhIGNsb3N1cmUsIGNhbGxzIHVud3JhcHBlZCBtZXRob2RzIGFuZFxuICAvLyBhdm9pZHMgYSBkZWFkbG9jay5cbiAgaWYgKCFzYnguX29uUmVhZHkpIHtcbiAgICByZXR1cm4gc2J4O1xuICB9XG5cbiAgY29uc3Qgb25SZWFkeSA9IHNieC5fb25SZWFkeTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zYngsXG4gICAgZXhlYzogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LmV4ZWMob3B0cyk7XG4gICAgfSxcbiAgICBnZXREb21haW46IGFzeW5jIChwb3J0KSA9PiB7XG4gICAgICBhd2FpdCBvblJlYWR5O1xuICAgICAgcmV0dXJuIHNieC5nZXREb21haW4ocG9ydCk7XG4gICAgfSxcbiAgICByZWFkRmlsZTogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LnJlYWRGaWxlKG9wdHMpO1xuICAgIH0sXG4gICAgd3JpdGVGaWxlczogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIGF3YWl0IG9uUmVhZHk7XG4gICAgICByZXR1cm4gc2J4LndyaXRlRmlsZXMob3B0cyk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSB7IFNhbmRib3hTZXR1cE1ldGEgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB0eXBlIHtcbiAgRXhlY1Jlc3VsdCxcbiAgTG9nRW50cnksXG4gIE9uUmVzdGFydCxcbiAgU2FuZGJveCxcbiAgU2FuZGJveExpZmVjeWNsZSxcbiAgU2FuZGJveExpZmVjeWNsZUlucHV0LFxuICBTYW5kYm94U2V0dXAsXG4gIFNhbmRib3hTdGF0dXMsXG4gIFRlcm1pbmFsLFxuICBUZXJtaW5hbE1ldGFkYXRhLFxuICBWZXJjZWxTYW5kYm94TGlmZWN5Y2xlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuIiwgImNvbnN0IFZFUkNFTF9TVE9SQUdFX1VSTCA9XG4gIHByb2Nlc3MuZW52LkFHRU5UX1ZFUkNFTF9TVE9SQUdFX1VSTCA/P1xuICBcImh0dHBzOi8vYWdlbnQtc2RrLXN0b3JhZ2UtbmluZS5sYWJzLnZlcmNlbC5kZXYvYXBpL3N0b3JhZ2VcIjtcblxuZXhwb3J0IHR5cGUgVmVyY2VsU3RvcmFnZUNvbmZpZyA9IHtcbiAgdXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VmVyY2VsU3RvcmFnZUNvbmZpZygpOiBQcm9taXNlPFZlcmNlbFN0b3JhZ2VDb25maWc+IHtcbiAgbGV0IHRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IHsgZ2V0VmVyY2VsT2lkY1Rva2VuIH0gPSBhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL29pZGNcIik7XG4gICAgdG9rZW4gPSBhd2FpdCBnZXRWZXJjZWxPaWRjVG9rZW4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gT0lEQyBub3QgYXZhaWxhYmxlIChsb2NhbCBkZXYsIG5vbi1WZXJjZWwgZW52aXJvbm1lbnQpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVybDogVkVSQ0VMX1NUT1JBR0VfVVJMLFxuICAgIGhlYWRlcnM6IHRva2VuID8geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9IDoge30sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXN0UmVzdWx0IH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfT4ob3B0czoge1xuICBpdGVtczogVFtdO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGxpbWl0PzogbnVtYmVyO1xufSk6IExpc3RSZXN1bHQ8VD4ge1xuICBjb25zdCB7IGl0ZW1zLCBjdXJzb3IsIGxpbWl0IH0gPSBvcHRzO1xuICBjb25zdCBzdGFydEluZGV4ID0gY3Vyc29yID8gaXRlbXMuZmluZEluZGV4KChtKSA9PiBtLmlkID09PSBjdXJzb3IpICsgMSA6IDA7XG4gIGNvbnN0IHNsaWNlZCA9XG4gICAgbGltaXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBpdGVtcy5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgbGltaXQpXG4gICAgICA6IGl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgpO1xuICBjb25zdCBuZXh0Q3Vyc29yID1cbiAgICBsaW1pdCAhPT0gdW5kZWZpbmVkICYmIHN0YXJ0SW5kZXggKyBsaW1pdCA8IGl0ZW1zLmxlbmd0aFxuICAgICAgPyAoc2xpY2VkLmF0KC0xKT8uaWQgPz8gbnVsbClcbiAgICAgIDogbnVsbDtcbiAgcmV0dXJuIHsgaXRlbXM6IHNsaWNlZCwgbmV4dEN1cnNvciB9O1xufVxuIiwgImltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkZGlyLFxuICByZWFkRmlsZSxcbiAgcm0sXG4gIHVubGluayxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ29uZmxpY3RFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB7IHBhZ2luYXRlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3BhZ2luYXRlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIEhhbmRsZXJzLFxuICBNZXNzYWdlLFxuICBQYXJ0LFxuICBTYW5kYm94UmVjb3JkLFxuICBTZXNzaW9uLFxuICBTZXR1cFNuYXBzaG90LFxufSBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyhiYXNlUGF0aDogc3RyaW5nKTogSGFuZGxlcnMge1xuICBjb25zdCByZXNvbHZlZEJhc2UgPSByZXNvbHZlKGJhc2VQYXRoKTtcbiAgY29uc3Qgc2Vzc2lvbkRpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcInNlc3Npb25cIik7XG4gIGNvbnN0IG1lc3NhZ2VEaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJtZXNzYWdlXCIpO1xuICBjb25zdCBwYXJ0RGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwicGFydFwiKTtcbiAgY29uc3Qgc2FuZGJveERpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcInNhbmRib3hcIik7XG4gIGNvbnN0IGNvbW1hbmREaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJjb21tYW5kXCIpO1xuICBjb25zdCBzZXR1cERpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcInNldHVwXCIpO1xuICBjb25zdCBsb2NrRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwiLmxvY2tzXCIpO1xuICBjb25zdCBMT0NLX1NUQUxFX01TID0gMzBfMDAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcihkaXI6IHN0cmluZykge1xuICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWFkSnNvbjxUPihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KSBhcyBUO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVKc29uRmlsZShmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiB1bmtub3duKSB7XG4gICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdpdGhSZWNvcmRMb2NrPFQ+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZuOiAoKSA9PiBQcm9taXNlPFQ+XG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGxvY2tOYW1lID0gQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICBjb25zdCBsb2NrUGF0aCA9IGpvaW4obG9ja0RpciwgYCR7bG9ja05hbWV9LmxvY2tgKTtcbiAgICBjb25zdCBtZXRhZGF0YVBhdGggPSBqb2luKGxvY2tQYXRoLCBcIm1ldGFkYXRhLmpzb25cIik7XG4gICAgYXdhaXQgZW5zdXJlRGlyKGxvY2tEaXIpO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGxvY2tQYXRoKTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShtZXRhZGF0YVBhdGgsIHtcbiAgICAgICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShlIGluc3RhbmNlb2YgRXJyb3IpIHx8XG4gICAgICAgICAgKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSBcIkVFWElTVFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCByZWFkSnNvbjx7IGNyZWF0ZWRBdD86IG51bWJlciB9PihtZXRhZGF0YVBhdGgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWV0YWRhdGE/LmNyZWF0ZWRBdCAmJlxuICAgICAgICAgIERhdGUubm93KCkgLSBtZXRhZGF0YS5jcmVhdGVkQXQgPiBMT0NLX1NUQUxFX01TXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHJtKGxvY2tQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2tQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgaW5wdXQ6IFRcbiAgKTogUGFydGlhbDxUPiB7XG4gICAgY29uc3QgcmVzdWx0OiBQYXJ0aWFsPFQ+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHRba2V5IGFzIGtleW9mIFRdID0gdmFsdWUgYXMgVFtrZXlvZiBUXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlYWRBbGxGcm9tRGlyPFQ+KGRpcjogc3RyaW5nKTogUHJvbWlzZTxUW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKGRpcik7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzXG4gICAgICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChcIi5qc29uXCIpKVxuICAgICAgICAgIC5tYXAoKGYpID0+IHJlYWRKc29uPFQ+KGpvaW4oZGlyLCBmKSkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChyKTogciBpcyBOb25OdWxsYWJsZTx0eXBlb2Ygcj4gPT4gciAhPT0gbnVsbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBcInNlc3Npb24uZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25QYXRoID0gam9pbihzZXNzaW9uRGlyLCBgJHtpZH0uanNvbmApO1xuICAgICAgcmV0dXJuIChhd2FpdCByZWFkSnNvbjxTZXNzaW9uPihzZXNzaW9uUGF0aCkpID8/IG51bGw7XG4gICAgfSxcblxuICAgIFwic2Vzc2lvbi5zZXRcIjogYXN5bmMgKHNlc3Npb24pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoUmVjb3JkTG9jayhgc2Vzc2lvbjoke3Nlc3Npb24uaWR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7c2Vzc2lvbi5pZH0uanNvbmApO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNlc3Npb24+KHNlc3Npb25QYXRoKTtcbiAgICAgICAgY29uc3QgbmV3U2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIHRhZ3M6IHNlc3Npb24udGFncyA/PyBleGlzdGluZz8udGFncyA/PyB7fSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nPy5jcmVhdGVkQXQgPz8gc2Vzc2lvbi5jcmVhdGVkQXQgPz8gbm93LFxuICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNlc3Npb25QYXRoLCBuZXdTZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIG5ld1Nlc3Npb247XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLnVwZGF0ZVwiOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhSZWNvcmRMb2NrKGBzZXNzaW9uOiR7b3B0cy5pZH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3Npb25QYXRoID0gam9pbihzZXNzaW9uRGlyLCBgJHtvcHRzLmlkfS5qc29uYCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXNzaW9uICR7b3B0cy5pZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXdQYXRjaCA9IHJlbW92ZVVuZGVmaW5lZCh7XG4gICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICBpZDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJhd1BhdGNoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihyYXdQYXRjaCwgXCJydW5JZFwiKSkge1xuICAgICAgICAgIGNvbnN0IG5leHRSdW5JZCA9IHJhd1BhdGNoLnJ1bklkIGFzIFNlc3Npb25bXCJydW5JZFwiXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoZXhpc3RpbmcucnVuSWQgIT09IG51bGwgJiYgbmV4dFJ1bklkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUNvbmZsaWN0RXJyb3Ioe1xuICAgICAgICAgICAgICByZWFzb246IFwicnVuSWQgY2Fubm90IGJlIGNsZWFyZWQgb25jZSBzZXRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXhpc3RpbmcucnVuSWQgIT09IG51bGwgJiYgbmV4dFJ1bklkICE9PSBleGlzdGluZy5ydW5JZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VDb25mbGljdEVycm9yKHtcbiAgICAgICAgICAgICAgcmVhc29uOiBgcnVuSWQgaXMgYWxyZWFkeSBzZXQgdG8gJHtleGlzdGluZy5ydW5JZH1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0Y2ggPSByYXdQYXRjaCBhcyBQYXJ0aWFsPE9taXQ8U2Vzc2lvbiwgXCJpZFwiPj47XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRBdCA9XG4gICAgICAgICAgcGF0Y2gudXBkYXRlZEF0ICE9PSB1bmRlZmluZWQgPyBwYXRjaC51cGRhdGVkQXQgOiBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB1cGRhdGVkU2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgICB1cGRhdGVkQXQsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoc2Vzc2lvblBhdGgsIHVwZGF0ZWRTZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWRTZXNzaW9uO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIFwic2Vzc2lvbi5kZWxldGVcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdW5saW5rKGpvaW4oc2Vzc2lvbkRpciwgYCR7aWR9Lmpzb25gKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgICAgfVxuICAgICAgY29uc3QgYWxsTWVzc2FnZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxNZXNzYWdlPihtZXNzYWdlRGlyKTtcbiAgICAgIGNvbnN0IHNlc3Npb25NZXNzYWdlcyA9IGFsbE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5zZXNzaW9uSWQgPT09IGlkKTtcbiAgICAgIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8UGFydD4ocGFydERpcik7XG4gICAgICBjb25zdCBzZXNzaW9uUGFydHMgPSBhbGxQYXJ0cy5maWx0ZXIoKHApID0+IHAuc2Vzc2lvbklkID09PSBpZCk7XG4gICAgICBjb25zdCBhbGxDb21tYW5kcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPENvbW1hbmQ+KGNvbW1hbmREaXIpO1xuICAgICAgY29uc3Qgc2Vzc2lvbkNvbW1hbmRzID0gYWxsQ29tbWFuZHMuZmlsdGVyKChjKSA9PiBjLnNlc3Npb25JZCA9PT0gaWQpO1xuICAgICAgY29uc3Qgbm9vcCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uc2Vzc2lvbk1lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICB1bmxpbmsoam9pbihtZXNzYWdlRGlyLCBgJHttLmlkfS5qc29uYCkpLmNhdGNoKG5vb3ApXG4gICAgICAgICksXG4gICAgICAgIC4uLnNlc3Npb25QYXJ0cy5tYXAoKHApID0+XG4gICAgICAgICAgdW5saW5rKGpvaW4ocGFydERpciwgYCR7cC5pZH0uanNvbmApKS5jYXRjaChub29wKVxuICAgICAgICApLFxuICAgICAgICAuLi5zZXNzaW9uQ29tbWFuZHMubWFwKChjKSA9PlxuICAgICAgICAgIHVubGluayhqb2luKGNvbW1hbmREaXIsIGAke2MuaWR9Lmpzb25gKSkuY2F0Y2gobm9vcClcbiAgICAgICAgKSxcbiAgICAgIF0pO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24ubGlzdFwiOiBhc3luYyAoeyB0YWdzLCBvcmRlciwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTZXNzaW9ucyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFNlc3Npb24+KHNlc3Npb25EaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsU2Vzc2lvbnM7XG4gICAgICBpZiAodGFncyAmJiBPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvblRhZ3MgPSBzLnRhZ3MgPz8ge307XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRhZ3MpLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBlcXVhbChzZXNzaW9uVGFnc1trZXldLCB2YWx1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVkT3JkZXIgPSBvcmRlciA/PyBcInVwZGF0ZWRBdF9kZXNjXCI7XG4gICAgICBjb25zdCBzb3J0RmllbGQgPSByZXNvbHZlZE9yZGVyLnN0YXJ0c1dpdGgoXCJ1cGRhdGVkQXRcIilcbiAgICAgICAgPyBcInVwZGF0ZWRBdFwiXG4gICAgICAgIDogXCJjcmVhdGVkQXRcIjtcbiAgICAgIGNvbnN0IHNvcnREaXIgPSByZXNvbHZlZE9yZGVyLmVuZHNXaXRoKFwiX2Rlc2NcIikgPyAtMSA6IDE7XG4gICAgICBmaWx0ZXJlZC5zb3J0KChhLCBiKSA9PiBzb3J0RGlyICogKGFbc29ydEZpZWxkXSAtIGJbc29ydEZpZWxkXSkpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiOiBhc3luYyAoe1xuICAgICAgc2FuZGJveElkLFxuICAgICAgdGFncyxcbiAgICAgIG9yZGVyLFxuICAgICAgY3Vyc29yLFxuICAgICAgbGltaXQsXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2Vzc2lvbnMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTZXNzaW9uPihzZXNzaW9uRGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNlc3Npb25zLmZpbHRlcigocykgPT4gcy5zYW5kYm94SWQgPT09IHNhbmRib3hJZCk7XG4gICAgICBpZiAodGFncyAmJiBPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvblRhZ3MgPSBzLnRhZ3MgPz8ge307XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRhZ3MpLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBlcXVhbChzZXNzaW9uVGFnc1trZXldLCB2YWx1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVkT3JkZXIgPSBvcmRlciA/PyBcInVwZGF0ZWRBdF9kZXNjXCI7XG4gICAgICBjb25zdCBzb3J0RmllbGQgPSByZXNvbHZlZE9yZGVyLnN0YXJ0c1dpdGgoXCJ1cGRhdGVkQXRcIilcbiAgICAgICAgPyBcInVwZGF0ZWRBdFwiXG4gICAgICAgIDogXCJjcmVhdGVkQXRcIjtcbiAgICAgIGNvbnN0IHNvcnREaXIgPSByZXNvbHZlZE9yZGVyLmVuZHNXaXRoKFwiX2Rlc2NcIikgPyAtMSA6IDE7XG4gICAgICBmaWx0ZXJlZC5zb3J0KChhLCBiKSA9PiBzb3J0RGlyICogKGFbc29ydEZpZWxkXSAtIGJbc29ydEZpZWxkXSkpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24udGFnLnNldFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhSZWNvcmRMb2NrKGBzZXNzaW9uOiR7c2Vzc2lvbklkfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvblBhdGggPSBqb2luKHNlc3Npb25EaXIsIGAke3Nlc3Npb25JZH0uanNvbmApO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNlc3Npb24+KHNlc3Npb25QYXRoKTtcbiAgICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2Vzc2lvbiAke3Nlc3Npb25JZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZXhpc3RpbmcudGFncywgLi4udGFncyB9O1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB1cGRhdGVkU2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICB0YWdzOiBtZXJnZWRUYWdzLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNlc3Npb25QYXRoLCB1cGRhdGVkU2Vzc2lvbik7XG4gICAgICAgIHJldHVybiB1cGRhdGVkU2Vzc2lvbjtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UuZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZWFkSnNvbjxNZXNzYWdlPihqb2luKG1lc3NhZ2VEaXIsIGAke2lkfS5qc29uYCkpO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2Uuc2V0XCI6IGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4obWVzc2FnZURpciwgYCR7bWVzc2FnZS5pZH0uanNvbmApLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UubGlzdFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsTWVzc2FnZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxNZXNzYWdlPihtZXNzYWdlRGlyKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gYWxsTWVzc2FnZXNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gbS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuY3JlYXRlZEF0IC0gYi5jcmVhdGVkQXQpO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInBhcnQubGlzdEJ5TWVzc2FnZVwiOiBhc3luYyAoeyBtZXNzYWdlSWQsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsUGFydHMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxQYXJ0PihwYXJ0RGlyKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gYWxsUGFydHNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5tZXNzYWdlSWQgPT09IG1lc3NhZ2VJZClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjogYXN5bmMgKHsgc2Vzc2lvbklkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8UGFydD4ocGFydERpcik7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbFBhcnRzXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgaWYgKGEubWVzc2FnZUlkICE9PSBiLm1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGEubWVzc2FnZUlkLmxvY2FsZUNvbXBhcmUoYi5tZXNzYWdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInBhcnQuc2V0XCI6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4ocGFydERpciwgYCR7cGFydC5pZH0uanNvbmApLCBwYXJ0KTtcbiAgICAgIHJldHVybiBwYXJ0O1xuICAgIH0sXG5cbiAgICBcInBhcnQuZGVsZXRlXCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHVubGluayhqb2luKHBhcnREaXIsIGAke2lkfS5qc29uYCkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBpZiBmaWxlIGRvZXNuJ3QgZXhpc3RcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldFwiOiBhc3luYyAoeyBrZXkgfSkgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgY29uc3Qgc2FuZGJveFBhdGggPSBqb2luKHNhbmRib3hEaXIsIGAke3NhZmVOYW1lfS5qc29uYCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oc2FuZGJveFBhdGgpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5zZXRcIjogYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgYXdhaXQgd2l0aFJlY29yZExvY2soYHNhbmRib3g6JHtyZWNvcmQuaWR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHJlY29yZC5pZCkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3UmVjb3JkOiBTYW5kYm94UmVjb3JkID0ge1xuICAgICAgICAgIC4uLnJlY29yZCxcbiAgICAgICAgICB0YWdzOiByZWNvcmQudGFncyA/PyBleGlzdGluZz8udGFncyA/PyBudWxsLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNhbmRib3hQYXRoLCBuZXdSZWNvcmQpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC51cGRhdGVcIjogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoUmVjb3JkTG9jayhgc2FuZGJveDoke29wdHMuaWR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKG9wdHMuaWQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgICBjb25zdCBzYW5kYm94UGF0aCA9IGpvaW4oc2FuZGJveERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihzYW5kYm94UGF0aCk7XG4gICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhbmRib3ggJHtvcHRzLmlkfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRjaCA9IHJlbW92ZVVuZGVmaW5lZCh7XG4gICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICBpZDogdW5kZWZpbmVkLFxuICAgICAgICB9KSBhcyBQYXJ0aWFsPE9taXQ8U2FuZGJveFJlY29yZCwgXCJpZFwiPj47XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTYW5kYm94OiBTYW5kYm94UmVjb3JkID0ge1xuICAgICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNhbmRib3hQYXRoLCB1cGRhdGVkU2FuZGJveCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVkU2FuZGJveDtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gubGlzdFwiOiBhc3luYyAoeyB0YWdzLCBvcmRlciwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTYW5kYm94ZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTYW5kYm94UmVjb3JkPihzYW5kYm94RGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNhbmRib3hlcztcbiAgICAgIGlmICh0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBzYW5kYm94VGFncyA9IHMudGFncyA/PyB7fTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGFncykuZXZlcnkoKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGVxdWFsKHNhbmRib3hUYWdzW2tleV0sIHZhbHVlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gb3JkZXI/LnN0YXJ0c1dpdGgoXCJsYXN0QWN0aXZpdHlBdFwiKVxuICAgICAgICA/IFwibGFzdEFjdGl2aXR5QXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gb3JkZXI/LmVuZHNXaXRoKFwiX2Rlc2NcIikgPyAtMSA6IDE7XG4gICAgICBmaWx0ZXJlZC5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gc29ydERpciAqICgoYVtzb3J0RmllbGRdID8/IDApIC0gKGJbc29ydEZpZWxkXSA/PyAwKSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC50YWcuc2V0XCI6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncyB9KSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFJlY29yZExvY2soYHNhbmRib3g6JHtzYW5kYm94SWR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHNhbmRib3hJZCkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hQYXRoKTtcbiAgICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2FuZGJveCAke3NhbmRib3hJZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZXhpc3RpbmcudGFncywgLi4udGFncyB9O1xuICAgICAgICBjb25zdCB1cGRhdGVkU2FuZGJveDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICB0YWdzOiBtZXJnZWRUYWdzLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNhbmRib3hQYXRoLCB1cGRhdGVkU2FuZGJveCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVkU2FuZGJveDtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guZ2V0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCB9KSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7c2Vzc2lvbklkfS5qc29uYCk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpO1xuICAgICAgaWYgKCFzZXNzaW9uPy5zYW5kYm94SWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20oc2Vzc2lvbi5zYW5kYm94SWQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KFxuICAgICAgICBqb2luKHNhbmRib3hEaXIsIGAke3NhZmVOYW1lfS5qc29uYClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIFwiY29tbWFuZC5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlYWRKc29uPENvbW1hbmQ+KGpvaW4oY29tbWFuZERpciwgYCR7aWR9Lmpzb25gKSk7XG4gICAgfSxcblxuICAgIFwiY29tbWFuZC5zZXRcIjogYXN5bmMgKGNvbW1hbmQpID0+IHtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoam9pbihjb21tYW5kRGlyLCBgJHtjb21tYW5kLmlkfS5qc29uYCksIGNvbW1hbmQpO1xuICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgfSxcblxuICAgIFwic2V0dXAuZ2V0XCI6IGFzeW5jICh7IGtleSB9KSA9PiB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICByZXR1cm4gYXdhaXQgcmVhZEpzb248U2V0dXBTbmFwc2hvdD4oam9pbihzZXR1cERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKSk7XG4gICAgfSxcblxuICAgIFwic2V0dXAuc2V0XCI6IGFzeW5jIChzbmFwc2hvdCkgPT4ge1xuICAgICAgYXdhaXQgd2l0aFJlY29yZExvY2soYHNldHVwOiR7c25hcHNob3Qua2V5fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShzbmFwc2hvdC5rZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4oc2V0dXBEaXIsIGAke3NhZmVOYW1lfS5qc29uYCksIHNuYXBzaG90KTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNldHVwLmFjcXVpcmVMb2NrXCI6IGFzeW5jICh7IGtleSwgbG9ja0lkLCBsb2NrVGltZW91dE1zIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoUmVjb3JkTG9jayhgc2V0dXA6JHtrZXl9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihzZXR1cERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTZXR1cFNuYXBzaG90PihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBleGlzdGluZz8uYWNxdWlyaW5nTG9ja0lkICYmXG4gICAgICAgICAgZXhpc3RpbmcuYWNxdWlyaW5nTG9ja0F0ICYmXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIGV4aXN0aW5nLmFjcXVpcmluZ0xvY2tBdCA8IGxvY2tUaW1lb3V0TXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgc25hcHNob3Q6IFNldHVwU25hcHNob3QgPSB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHNuYXBzaG90SWQ6IGV4aXN0aW5nPy5zbmFwc2hvdElkID8/IG51bGwsXG4gICAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZz8uY3JlYXRlZEF0ID8/IG5vdyxcbiAgICAgICAgICBsYXN0VXNlZEF0OiBleGlzdGluZz8ubGFzdFVzZWRBdCA/PyBudWxsLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbG9ja0lkLFxuICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbm93LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGZpbGVQYXRoLCBzbmFwc2hvdCk7XG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guYWNxdWlyZUxvY2tcIjogYXN5bmMgKHsgcmVjb3JkLCBsb2NrVGltZW91dE1zIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoUmVjb3JkTG9jayhgc2FuZGJveDoke3JlY29yZC5pZH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20ocmVjb3JkLmlkKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHNhbmRib3hEaXIsIGAke3NhZmVOYW1lfS5qc29uYCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oZmlsZVBhdGgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhpc3Rpbmc/LmFjcXVpcmluZ0xvY2tJZCAmJlxuICAgICAgICAgIGV4aXN0aW5nLmFjcXVpcmluZ0xvY2tBdCAmJlxuICAgICAgICAgIERhdGUubm93KCkgLSBleGlzdGluZy5hY3F1aXJpbmdMb2NrQXQgPCBsb2NrVGltZW91dE1zXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JlY29yZDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgICAuLi5yZWNvcmQsXG4gICAgICAgICAgdGFnczogcmVjb3JkLnRhZ3MgPz8gZXhpc3Rpbmc/LnRhZ3MgPz8gbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShmaWxlUGF0aCwgbmV3UmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIG5ld1JlY29yZDtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQubGlzdFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGluY2x1ZGVGaW5pc2hlZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxDb21tYW5kcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPENvbW1hbmQ+KGNvbW1hbmREaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsQ29tbWFuZHMuZmlsdGVyKChjKSA9PiBjLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICAgIGlmICghaW5jbHVkZUZpbmlzaGVkKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gYS5zdGFydGVkQXQgLSBiLnN0YXJ0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJleHBvcnQge1xuICB0eXBlIEFnZW50RGF0YVR5cGVzLFxuICB0eXBlIEFnZW50T3B0aW9ucyxcbiAgQWdlbnRTdGF0dXMsXG4gIHR5cGUgQWdlbnRTdHJlYW0sXG4gIGFnZW50LFxuICB0eXBlIEluZmVyVUlNZXNzYWdlLFxuICB0eXBlIFJwY1BheWxvYWQsXG4gIHR5cGUgUnBjUmVzdWx0LFxuICB0eXBlIFNlbmRJbnB1dCxcbiAgdHlwZSBTZXNzaW9uT3B0aW9ucyxcbiAgdHlwZSBUYWdzU2NoZW1hLFxufSBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCB7XG4gIE1lc3NhZ2VOb3RGb3VuZEVycm9yLFxuICBTYW5kYm94RXJyb3IsXG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbiAgU3RvcmFnZUNvbmZsaWN0RXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmVyYXRpb25PcHRpb25zIH0gZnJvbSBcIi4vZ2VuZXJhdGlvblwiO1xuZXhwb3J0IHR5cGUgeyBFeGVjUmVzdWx0LCBPblJlc3RhcnQsIFNhbmRib3gsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuL3NhbmRib3hcIjtcbmV4cG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5LCBVcGxvYWRhYmxlRmlsZSB9IGZyb20gXCIuL3NraWxscy90eXBlc1wiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICB0eXBlIE1lc3NhZ2UsXG4gIHR5cGUgTWVzc2FnZVVzYWdlLFxuICB0eXBlIFBhcnQsXG4gIHR5cGUgUmVzb2x2ZWRTdG9yYWdlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgU2FuZGJveENvbmZpZyxcbiAgdHlwZSBTYW5kYm94UmVjb3JkLFxuICB0eXBlIFNlc3Npb24sXG4gIHR5cGUgU3RlcFVzYWdlLFxuICB0eXBlIFN0b3JhZ2VDb25maWcsXG4gIHR5cGUgVXNhZ2VTdW1tYXJ5LFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQge1xuICB0eXBlIEJ1aWx0SW5Ub29sTmFtZSxcbiAgYnVpbHRpblRvb2xOYW1lcyxcbiAgdHlwZSBUb29sQ29udGV4dCxcbn0gZnJvbSBcIi4vdG9vbHNcIjtcbiIsICJpbXBvcnQgeyBnZXRWZXJjZWxPaWRjVG9rZW5TeW5jIH0gZnJvbSBcIkB2ZXJjZWwvb2lkY1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlVUlNZXNzYWdlU3RyZWFtLFxuICB0eXBlIEdhdGV3YXlNb2RlbElkLFxuICB0eXBlIEluZmVyVG9vbElucHV0LFxuICB0eXBlIEluZmVyVUlUb29scyxcbiAgdHlwZSBNb2RlbE1lc3NhZ2UsXG4gIHR5cGUgVG9vbFNldCxcbiAgdHlwZSBVSU1lc3NhZ2UsXG4gIHR5cGUgVUlNZXNzYWdlQ2h1bmssXG59IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgYWxsIH0gZnJvbSBcImJldHRlci1hbGxcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgeyBnZXRSdW4sIHN0YXJ0IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0ICogYXMgeiBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICB0eXBlIEFnZW50SW5wdXQsXG4gIHR5cGUgQWdlbnRNZXNzYWdlSW5wdXQsXG4gIGFnZW50TWVzc2FnZUhvb2ssXG4gIGFnZW50V29ya2Zsb3csXG4gIGFwcHJvdmFsSG9vayxcbn0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB7XG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIERpc3BhdGNoQ29udGV4dCxcbiAgZGlzcGF0Y2gsXG4gIHR5cGUgSG9va1N0YXR1c1BhcmFtcyxcbiAgdHlwZSBIb29rU3RhdHVzUmVzdWx0LFxuICB0eXBlIEhvb2tUb29sQWZ0ZXJQYXJhbXMsXG4gIHR5cGUgSG9va1Rvb2xBZnRlclJlc3VsdCxcbiAgdHlwZSBIb29rVG9vbEJlZm9yZVBhcmFtcyxcbiAgdHlwZSBIb29rVG9vbEJlZm9yZVJlc3VsdCxcbiAgdHlwZSBUb29sTWV0YWRhdGEsXG4gIHR5cGUgVG9vbHNFeGVjdXRlUGFyYW1zLFxuICB0eXBlIFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcyxcbiAgdHlwZSBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQsXG59IGZyb20gXCIuL3JwYy1kaXNwYXRjaFwiO1xuaW1wb3J0IHsgZ2V0U2FuZGJveCB9IGZyb20gXCIuL3NhbmRib3hcIjtcbmltcG9ydCB0eXBlIHsgT25SZXN0YXJ0LCBTYW5kYm94U2V0dXAgfSBmcm9tIFwiLi9zYW5kYm94L3R5cGVzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVTa2lsbHNEaXJzIH0gZnJvbSBcIi4vc2tpbGxzL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbHNEaXIgfSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RvcmFnZSBhcyBBZ2VudFN0b3JhZ2UsXG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgTWVzc2FnZSxcbiAgdHlwZSBQYXJ0LFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIHR5cGUgU3RvcmFnZUNvbmZpZyxcbiAgdHlwZSBIYW5kbGVycyBhcyBTdG9yYWdlSGFuZGxlcnMsXG4gIHR5cGUgU3RvcmFnZU1ldGhvZHMsXG4gIHR5cGUgVHlwZWRTdG9yYWdlLFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgYnVpbHRJblRvb2xzLCB0eXBlIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7IHRvTWVzc2FnZUFuZFBhcnRzIH0gZnJvbSBcIi4vdXRpbHMvbWVzc2FnZVwiO1xuaW1wb3J0IHsgYXNzZW1ibGVVSU1lc3NhZ2VzIH0gZnJvbSBcIi4vdXRpbHMvdWlcIjtcbmltcG9ydCB7IGNvbXB1dGVTZXNzaW9uVXNhZ2UsIHR5cGUgU2Vzc2lvblVzYWdlIH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcblxuZXhwb3J0IHR5cGUgU2VuZElucHV0ID1cbiAgfCBzdHJpbmdcbiAgfCB7IHJvbGU/OiBVSU1lc3NhZ2VbXCJyb2xlXCJdOyBwYXJ0czogVUlNZXNzYWdlW1wicGFydHNcIl07IGlkPzogc3RyaW5nIH07XG5cbi8qKlxuICogVHJhbnNpZW50IHN0YXR1cyBpbmRpY2F0b3JzIGVtaXR0ZWQgb3ZlciB0aGUgc3RyZWFtIGR1cmluZyBsb25nLXJ1bm5pbmcgcGhhc2VzLlxuICogRGVsaXZlcmVkIHRvIHRoZSBjbGllbnQgYXMgYGRhdGEtc3RhdHVzYCBjaHVua3Mgd2l0aCBgdHJhbnNpZW50OiB0cnVlYCBcdTIwMTQgbm90IHBlcnNpc3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFnZW50U3RhdHVzID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJzYW5kYm94LXNldHVwXCIpIH0pLFxuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInNhbmRib3gtc2V0dXAtY29sZFwiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJsb2FkaW5nLXNraWxsc1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJwcm9jZXNzaW5nLWFwcHJvdmFsc1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJuZWVkcy1hcHByb3ZhbFwiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJ0aGlua2luZ1wiKSB9KSxcbiAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoXCJjdXN0b21cIiksIHN0YXR1czogei5zdHJpbmcoKSB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBBZ2VudFN0YXR1cyA9IHouaW5mZXI8dHlwZW9mIEFnZW50U3RhdHVzPjtcblxuLyoqXG4gKiBBdWdtZW50ZWQgYFJlYWRhYmxlU3RyZWFtYCByZXR1cm5lZCBieSBgc2Vzc2lvbi5zdHJlYW0oKWAuXG4gKiBQYXNzZXMgYGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1gIGFuZCB3b3JrcyB3aXRoIGBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7IHN0cmVhbSB9KWAuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50U3RyZWFtID0gUmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+ICYge1xuICAvKiogV3JpdGUgYSB0eXBlZCBzdGF0dXMgdXBkYXRlIHRvIHRoZSBzdHJlYW0gKHRyYW5zaWVudCwgbm90IHBlcnNpc3RlZCkuICovXG4gIHdyaXRlU3RhdHVzOiAoc3RhdHVzOiBBZ2VudFN0YXR1cykgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogRGF0YSBwYXJ0IHR5cGVzIGVtaXR0ZWQgYnkgZXZlcnkgYWdlbnQgb3ZlciB0aGUgc3RyZWFtLlxuICogVXNlZCBhcyB0aGUgYERBVEFfUEFSVFNgIGdlbmVyaWMgZm9yIGBVSU1lc3NhZ2VgLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudERhdGFUeXBlcyA9IHsgc3RhdHVzOiBBZ2VudFN0YXR1cyB9O1xuXG4vKipcbiAqIEluZmVyIGEgdHlwZWQgVUlNZXNzYWdlIGZyb20gYW4gYWdlbnQgaW5zdGFuY2UuXG4gKiBUb29sIHBhcnRzIGFyZSBkaXNjcmltaW5hdGVkIGJ5IGB0eXBlOiBcInRvb2wtJHtuYW1lfVwiYCB3aXRoIHR5cGVkIGlucHV0L291dHB1dC5cbiAqIERhdGEgcGFydHMgaW5jbHVkZSBgZGF0YS1zdGF0dXNgIHdpdGggdHlwZWQgYEFnZW50U3RhdHVzYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG15QWdlbnQgPSBhZ2VudCh7IHRvb2xzOiB7IG15VG9vbDogdG9vbCh7Li4ufSkgfSB9KTtcbiAqIHR5cGUgTXlNZXNzYWdlID0gdHlwZW9mIG15QWdlbnQuJFVJTWVzc2FnZTtcbiAqIC8vIE15TWVzc2FnZS5wYXJ0cyBpbmNsdWRlcyB7IHR5cGU6IFwidG9vbC1teVRvb2xcIjsgaW5wdXQ6IE15SW5wdXQ7IG91dHB1dDogTXlPdXRwdXQ7IC4uLiB9XG4gKiAvLyBvbkRhdGEgY2FsbGJhY2sgcmVjZWl2ZXMgeyB0eXBlOiBcImRhdGEtc3RhdHVzXCI7IGRhdGE6IEFnZW50U3RhdHVzIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBJbmZlclVJTWVzc2FnZTxBPiA9IEEgZXh0ZW5kcyB7IHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldCB9XG4gID8gVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gIDogVUlNZXNzYWdlPHVua25vd24sIEFnZW50RGF0YVR5cGVzPjtcblxudHlwZSBUb29sTmFtZTxUb29scz4gPSBFeHRyYWN0PGtleW9mIFRvb2xzLCBzdHJpbmc+IHwgQnVpbHRJblRvb2xOYW1lO1xuXG50eXBlIFRvb2xJbnB1dDxUb29scywgSz4gPSBLIGV4dGVuZHMgQnVpbHRJblRvb2xOYW1lXG4gID8gSW5mZXJUb29sSW5wdXQ8KHR5cGVvZiBidWlsdEluVG9vbHMpW0tdPlxuICA6IEsgZXh0ZW5kcyBrZXlvZiBUb29sc1xuICAgID8gVG9vbHNbS10gZXh0ZW5kcyBpbXBvcnQoXCJhaVwiKS5Ub29sXG4gICAgICA/IEluZmVyVG9vbElucHV0PFRvb2xzW0tdPlxuICAgICAgOiB1bmtub3duXG4gICAgOiB1bmtub3duO1xuXG5leHBvcnQgdHlwZSBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPiA9IHtcbiAgW0sgaW4gVG9vbE5hbWU8VG9vbHM+XT86XG4gICAgfCBib29sZWFuXG4gICAgfCAoKFxuICAgICAgICBpbnB1dDogVG9vbElucHV0PFRvb2xzLCBLPixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICAgICAgICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVua25vd247XG4gICAgICAgIH1cbiAgICAgICkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pO1xufTtcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2FuIGJlIHNldCBwZXItc2Vzc2lvbiwgb3ZlcnJpZGluZyBhZ2VudC1sZXZlbCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IHR5cGUgU2Vzc2lvbk9wdGlvbnM8XG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4gPSB7XG4gIC8qKiBUaGUgQUkgbW9kZWwgdG8gdXNlLiAqL1xuICBtb2RlbD86IEdhdGV3YXlNb2RlbElkO1xuICAvKiogU3lzdGVtIHByb21wdCBmb3IgdGhlIEFJIG1vZGVsLiAqL1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIC8qKiBTYW5kYm94IGNvbmZpZ3VyYXRpb24gb3IgSUQuIElmIHN0cmluZywgdXNlcyBhcyBzYW5kYm94IElEIHdpdGggaXRzIGNvbmZpZy4gKi9cbiAgc2FuZGJveD86XG4gICAgfCAoU2FuZGJveENvbmZpZyAmIHsgc2V0dXA/OiBTYW5kYm94U2V0dXA7IG9uUmVzdGFydD86IE9uUmVzdGFydCB9KVxuICAgIHwgc3RyaW5nO1xuICAvKiogS2V5LXZhbHVlIG1ldGFkYXRhIHRhZ3MgZm9yIHRoZSBzZXNzaW9uLiAqL1xuICB0YWdzPzogVFRhZ3M7XG4gIC8qKiBEaXJlY3RvcnkgY29udGFpbmluZyBza2lsbCBkZWZpbml0aW9ucyBmb3IgdGhlIGFnZW50LiAqL1xuICBza2lsbHNEaXI/OiBTa2lsbHNEaXI7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiB0b29scyB0byBhY3RpdmF0ZSBmb3IgdGhpcyBzZXNzaW9uLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWdlbnQtbGV2ZWwgdG9vbHMgYXJlIGFjdGl2ZS5cbiAgICogVXNlIHRoaXMgdG8gcmVzdHJpY3Qgd2hpY2ggdG9vbHMgYXJlIGF2YWlsYWJsZSBwZXItc2Vzc2lvbi5cbiAgICovXG4gIGFjdGl2ZVRvb2xzPzogKEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWUpW107XG4gIC8qKiBHZW5lcmF0aW9uIG9wdGlvbnMgKHRlbXBlcmF0dXJlLCBtYXhTdGVwcywgZXRjLikuIE92ZXJyaWRlcyBhZ2VudC1sZXZlbCBkZWZhdWx0cy4gKi9cbiAgZ2VuZXJhdGlvbj86IEdlbmVyYXRpb25PcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgU2Vzc2lvblVwZGF0ZU9wdGlvbnM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9IFBpY2s8XG4gIFNlc3Npb25PcHRpb25zPFRvb2xzPixcbiAgXCJtb2RlbFwiIHwgXCJzeXN0ZW1cIiB8IFwic2tpbGxzRGlyXCIgfCBcImFjdGl2ZVRvb2xzXCIgfCBcImdlbmVyYXRpb25cIlxuPjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGFnZW50IGluc3RhbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgbXlBZ2VudCA9IGFnZW50KHtcbiAqICAgbW9kZWw6IFwiYW50aHJvcGljL2NsYXVkZS1vcHVzLTQuNVwiLFxuICogICBzeXN0ZW06IFwiWW91IGFyZSBhIGhlbHBmdWwgYXNzaXN0YW50Li4uXCIsXG4gKiAgIHRhZ3NTY2hlbWE6IHoub2JqZWN0KHsgdXNlcklkOiB6LnN0cmluZygpIH0pLFxuICogICBjb250ZXh0U2NoZW1hOiB6Lm9iamVjdCh7IGF1dGhUb2tlbjogei5zdHJpbmcoKSB9KSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50T3B0aW9uczxcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0LFxuICBUVGFncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuICBUQ29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPiA9IHtcbiAgLyoqXG4gICAqIEFnZW50IG5hbWUuIFVzZWQgdG8gaXNvbGF0ZSBzdG9yYWdlIGRhdGEgLSBkaWZmZXJlbnQgbmFtZXMgaGF2ZSBzZXBhcmF0ZSBkYXRhLlxuICAgKiBAZGVmYXVsdCBcImRlZmF1bHRcIlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JhZ2UgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiAtIGB7IHR5cGU6IFwibG9jYWxcIiB9YCAtIGZpbGVzeXN0ZW0gc3RvcmFnZSAoZGV2KVxuICAgKiAtIGB7IHR5cGU6IFwidmVyY2VsXCIgfWAgLSBWZXJjZWwgbWFuYWdlZCBzdG9yYWdlIChwcm9kKVxuICAgKiAtIGB7IHR5cGU6IFwiY3VzdG9tXCIsIHVybDogXCIuLi5cIiB9YCAtIGN1c3RvbSBIVFRQIGJhY2tlbmRcbiAgICogQGRlZmF1bHQgSW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudDogYHsgdHlwZTogXCJ2ZXJjZWxcIiB9YCB3aGVuIGBWRVJDRUxfT0lEQ19UT0tFTmAgaXMgc2V0LCBgeyB0eXBlOiBcImxvY2FsXCIgfWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RvcmFnZT86IFN0b3JhZ2VDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gdG9vbHMgYXZhaWxhYmxlIHRvIHRoZSBhZ2VudC5cbiAgICogVGhlc2UgYXJlIGV4cG9zZWQgdmlhIHRoZSBSUEMgaGFuZGxlciBhbmQgY2FsbGVkIG92ZXIgSFRUUC5cbiAgICovXG4gIHRvb2xzPzogVG9vbHM7XG4gIC8qKlxuICAgKiBIb29rcyBmb3IgaW50ZXJjZXB0aW5nIGFnZW50IG9wZXJhdGlvbnMuXG4gICAqL1xuICBob29rcz86IEFnZW50SG9va3M7XG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHNlc3Npb24gdGFncy4gQWxsIHNlc3Npb25zIHNoYXJlIHRoaXMgc2NoZW1hLlxuICAgKiBUYWdzIGFyZSBwZXJzaXN0ZWQgaW4gc3RvcmFnZSBhbmQgc3Vydml2ZSBhY3Jvc3MgcmVxdWVzdHMuXG4gICAqL1xuICB0YWdzU2NoZW1hPzogei5ab2RUeXBlPFRUYWdzPjtcbiAgLyoqXG4gICAqIFNjaGVtYSBmb3IgdHJhbnNpZW50IHRvb2wgY29udGV4dC4gUGFzc2VkIHBlci1yZXF1ZXN0IHZpYSBzZW5kKCkuXG4gICAqIE5PVCBwZXJzaXN0ZWQgLSB1c2UgZm9yIHNlY3JldHMgbGlrZSBhdXRoIHRva2Vucy5cbiAgICovXG4gIGNvbnRleHRTY2hlbWE/OiB6LlpvZFR5cGU8VENvbnRleHQ+O1xuICAvKipcbiAgICogQXBwcm92YWwgcnVsZXMgZm9yIHRvb2xzIHlvdSBkb24ndCBvd24gKGJ1aWx0LWluIG9yIHRoaXJkLXBhcnR5KS5cbiAgICogTWFwcyB0b29sIG5hbWVzIHRvIGEgYm9vbGVhbiBvciBhIGZ1bmN0aW9uIHRoYXQgZGVjaWRlcyB3aGV0aGVyIHRvIGFzay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbmVlZHNBcHByb3ZhbDoge1xuICAgKiAgIEJhc2g6IChpbnB1dCkgPT4gaW5wdXQuY29tbWFuZC5zdGFydHNXaXRoKFwicm1cIiksXG4gICAqICAgV3JpdGU6IHRydWUsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBuZWVkc0FwcHJvdmFsPzogTmVlZHNBcHByb3ZhbE1hcDxUb29scz47XG4gIC8qKlxuICAgKiBTYW5kYm94IGNvbmZpZ3VyYXRpb24gd2l0aCBvcHRpb25hbCBzZXR1cCBhbmQgcmVzdGFydCBob29rcy5cbiAgICpcbiAgICogLSBgc2V0dXAua2V5YDogZXhwbGljaXQgc3RyaW5nIHRvIGNvbnRyb2wgc25hcHNob3QgaW52YWxpZGF0aW9uIChidW1wIHRvIHJlLXJ1bilcbiAgICogLSBgc2V0dXAucnVuYDogYXN5bmMgZnVuY3Rpb24gdGhhdCBydW5zIG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgc2FuZGJveCwgdGhlbiBnZXRzIHNuYXBzaG90dGVkXG4gICAqIC0gYG9uUmVzdGFydGA6IGFzeW5jIGZ1bmN0aW9uIHRoYXQgcnVucyBldmVyeSB0aW1lIGEgc2FuZGJveCByZXN1bWVzIGZyb20gYSBzbmFwc2hvdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBzYW5kYm94OiB7XG4gICAqICAgdHlwZTogXCJ2ZXJjZWxcIixcbiAgICogICBzZXR1cDoge1xuICAgKiAgICAga2V5OiBcImRldi1lbnYtdjNcIixcbiAgICogICAgIHJ1bjogYXN5bmMgKHNhbmRib3gpID0+IHtcbiAgICogICAgICAgYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJucG1cIiwgYXJnczogW1wiaVwiLCBcIi1nXCIsIFwidmVyY2VsXCJdIH0pXG4gICAqICAgICB9LFxuICAgKiAgIH0sXG4gICAqICAgb25SZXN0YXJ0OiBhc3luYyAoc2FuZGJveCkgPT4ge1xuICAgKiAgICAgYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJiYXNoXCIsIGFyZ3M6IFtcIi1jXCIsIFwibnBtIHJ1biBkZXYgJlwiXSB9KVxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzYW5kYm94PzpcbiAgICB8IChTYW5kYm94Q29uZmlnICYgeyBzZXR1cD86IFNhbmRib3hTZXR1cDsgb25SZXN0YXJ0PzogT25SZXN0YXJ0IH0pXG4gICAgfCBzdHJpbmc7XG59ICYgT21pdDxTZXNzaW9uT3B0aW9uczxUb29scywgVFRhZ3M+LCBcInRhZ3NcIiB8IFwic2FuZGJveFwiPjtcblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIHNlc3Npb24vc2FuZGJveCB0YWdzLiBVc2VkIGZvciBnZW5lcmljIGNvbnN0cmFpbnRzLlxuICogRm9yIGFnZW50LWxldmVsIHRhZyB2YWxpZGF0aW9uLCB1c2UgYHRhZ3NTY2hlbWFgIG9wdGlvbiB3aXRoIGEgem9kIHNjaGVtYS5cbiAqL1xuZXhwb3J0IHR5cGUgVGFnc1NjaGVtYSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRIb29rcyA9IHtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSB0b29sIGlzIGV4ZWN1dGVkLiBDYW4gbW9kaWZ5IGlucHV0IG9yIHRocm93IHRvIGJsb2NrLiAqL1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIGFmdGVyIGEgdG9vbCBpcyBleGVjdXRlZC4gQ2FuIG1vZGlmeSByZXN1bHQuICovXG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFnZW50IGVtaXRzIGEgdHJhbnNpZW50IHN0YXR1cyBpbmRpY2F0b3IuICovXG4gIHN0YXR1cz86IChzdGF0dXM6IEFnZW50U3RhdHVzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8qKlxuICogUlBDIHJlcXVlc3QgYm9keSBmb3IgYWdlbnQgaGFuZGxlci5cbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gb24gYG1ldGhvZGAgZm9yIHR5cGUtc2FmZSBwYXJhbXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjUmVxdWVzdCA9IHtcbiAgW0sgaW4ga2V5b2YgQWdlbnRScGNNZXRob2RzXToge1xuICAgIG1ldGhvZDogSztcbiAgICBwYXJhbXM6IEFnZW50UnBjTWV0aG9kc1tLXVtcInBhcmFtc1wiXTtcbiAgfTtcbn1ba2V5b2YgQWdlbnRScGNNZXRob2RzXTtcblxuLyoqXG4gKiBSUEMgcmVzcG9uc2UgdHlwZSBmb3IgZGlzcGF0Y2guXG4gKi9cbmV4cG9ydCB0eXBlIFJwY1Jlc3VsdDxUID0gdW5rbm93bj4gPVxuICB8IHsgcmVzdWx0OiBUIH1cbiAgfCB7IGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07IHN0YXR1cz86IG51bWJlciB9O1xuXG4vKipcbiAqIERpcmVjdCBSUEMgcGF5bG9hZCBmb3Igc3RlcCBmdW5jdGlvbiBjYWxscyAobm8gSFRUUCkuXG4gKi9cbmV4cG9ydCB0eXBlIFJwY1BheWxvYWQgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59O1xuXG4vKipcbiAqIEFsbCBSUEMgbWV0aG9kcyBhdmFpbGFibGUgb24gdGhlIGFnZW50IGhhbmRsZXIuXG4gKiBDb21iaW5lcyB0b29scyBtZXRob2RzLCBob29rcywgYW5kIHN0b3JhZ2UgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRScGNNZXRob2RzID0ge1xuICBcInRvb2xzLmxpc3RcIjogeyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPjsgcmVzdWx0OiBUb29sTWV0YWRhdGFbXSB9O1xuICBcInRvb2xzLmV4ZWN1dGVcIjogeyBwYXJhbXM6IFRvb2xzRXhlY3V0ZVBhcmFtczsgcmVzdWx0OiB1bmtub3duIH07XG4gIFwidG9vbHMubmVlZHNBcHByb3ZhbFwiOiB7XG4gICAgcGFyYW1zOiBUb29sc05lZWRzQXBwcm92YWxQYXJhbXM7XG4gICAgcmVzdWx0OiBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQ7XG4gIH07XG4gIFwiaG9vay50b29sLmJlZm9yZVwiOiB7XG4gICAgcGFyYW1zOiBIb29rVG9vbEJlZm9yZVBhcmFtcztcbiAgICByZXN1bHQ6IEhvb2tUb29sQmVmb3JlUmVzdWx0O1xuICB9O1xuICBcImhvb2sudG9vbC5hZnRlclwiOiB7XG4gICAgcGFyYW1zOiBIb29rVG9vbEFmdGVyUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1Rvb2xBZnRlclJlc3VsdDtcbiAgfTtcbiAgXCJob29rLnN0YXR1c1wiOiB7XG4gICAgcGFyYW1zOiBIb29rU3RhdHVzUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1N0YXR1c1Jlc3VsdDtcbiAgfTtcbn0gJiBTdG9yYWdlTWV0aG9kcztcblxuZXhwb3J0IHR5cGUgQWdlbnRScGNNZXRob2ROYW1lID0ga2V5b2YgQWdlbnRScGNNZXRob2RzO1xuXG4vKipcbiAqIFJlc3VsdCB0eXBlIGZvciBSUEMgb3ZlcnJpZGUgaGFuZGxlcnMuXG4gKiAtIGB7IG9rOiB0cnVlOyByZXN1bHQ6IFQgfWAgLSByZXR1cm4gdGhpcyByZXN1bHRcbiAqIC0gYHsgb2s6IGZhbHNlOyBlcnJvcjogc3RyaW5nIH1gIC0gcmV0dXJuIHRoaXMgZXJyb3JcbiAqIC0gYG51bGxgIC0gdXNlIGRlZmF1bHQgaGFuZGxlclxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY1Jlc3VsdDxUPiA9XG4gIHwgeyBvazogdHJ1ZTsgcmVzdWx0OiBUIH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHN0cmluZyB9XG4gIHwgbnVsbDtcblxuLyoqXG4gKiBPdmVycmlkZSBoYW5kbGVycyBmb3IgYWdlbnQgUlBDIG1ldGhvZHMuXG4gKiBFYWNoIG1ldGhvZCBjYW4gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4uXG4gKiBSZXR1cm4gYG51bGxgIHRvIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY092ZXJyaWRlcyA9IHtcbiAgW0sgaW4gQWdlbnRScGNNZXRob2ROYW1lXT86IChcbiAgICBwYXJhbXM6IEFnZW50UnBjTWV0aG9kc1tLXVtcInBhcmFtc1wiXVxuICApID0+IFByb21pc2U8QWdlbnRScGNSZXN1bHQ8QWdlbnRScGNNZXRob2RzW0tdW1wicmVzdWx0XCJdPj47XG59O1xuXG5jb25zdCBpc1ZlcmNlbCA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gQm9vbGVhbihnZXRWZXJjZWxPaWRjVG9rZW5TeW5jKCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZ2VudCA9IDxcbiAgVG9vbHMgZXh0ZW5kcyB7fSxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4oXG4gIF9vcHRpb25zPzogQWdlbnRPcHRpb25zPFRvb2xzLCBUVGFncywgVENvbnRleHQ+XG4pID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IF9vcHRpb25zID8/IHt9O1xuICBjb25zdCBhZ2VudFNlY3JldCA9IHByb2Nlc3MuZW52LkFHRU5UX1NFQ1JFVDtcbiAgaWYgKCFhZ2VudFNlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQUdFTlRfU0VDUkVUIGVudiB2YXIgaXMgcmVxdWlyZWQuIFVzZSB3aXRoQWdlbnQoKSBvciBzZXQgaXQgbWFudWFsbHkuXCJcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYmFzZVN0b3JhZ2VDb25maWcgPVxuICAgIG9wdGlvbnMuc3RvcmFnZSA/P1xuICAgICgoaXNWZXJjZWwoKVxuICAgICAgPyB7IHR5cGU6IFwidmVyY2VsXCIgfVxuICAgICAgOiB7IHR5cGU6IFwibG9jYWxcIiB9KSBzYXRpc2ZpZXMgU3RvcmFnZUNvbmZpZyk7XG4gIGNvbnN0IHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWcgPSB7XG4gICAgLi4uYmFzZVN0b3JhZ2VDb25maWcsXG4gICAgbmFtZTogb3B0aW9ucy5uYW1lID8/IGJhc2VTdG9yYWdlQ29uZmlnLm5hbWUsXG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgaXMgaW5pdGlhbGl6ZWQgbGF6aWx5LlxuICAgKiBVc2VzIGFnZW50T2JqLnJwYyB3aGljaCBpcyB3aXJlZCB1cCBieSB0aGUgbG9hZGVyIGNhbGxpbmcgX19pbml0QWdlbnQuXG4gICAqL1xuICBsZXQgX3N0b3JhZ2U6IEFnZW50U3RvcmFnZSB8IG51bGwgPSBudWxsO1xuICBjb25zdCBnZXRTdG9yYWdlSW5zdGFuY2UgPSAoKTogQWdlbnRTdG9yYWdlID0+IHtcbiAgICBpZiAoIV9zdG9yYWdlKSB7XG4gICAgICBfc3RvcmFnZSA9IGdldFN0b3JhZ2Uoe1xuICAgICAgICBjb25maWc6IHN0b3JhZ2VDb25maWcsXG4gICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfc3RvcmFnZTtcbiAgfTtcblxuICAvKipcbiAgICogTGF6eS1pbml0aWFsaXplZCBzdG9yYWdlIGhhbmRsZXJzIGZvciBsb2NhbCBzdG9yYWdlLlxuICAgKiBDcmVhdGVkIG9uIGZpcnN0IHN0b3JhZ2UgUlBDIHJlcXVlc3QuXG4gICAqL1xuICBsZXQgc3RvcmFnZUhhbmRsZXJzUHJvbWlzZTogUHJvbWlzZTxTdG9yYWdlSGFuZGxlcnM+IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGdldFN0b3JhZ2VIYW5kbGVycyA9IChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz4gPT4ge1xuICAgIGlmIChzdG9yYWdlQ29uZmlnLnR5cGUgIT09IFwibG9jYWxcIikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXCJTdG9yYWdlIGhhbmRsZXJzIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCBzdG9yYWdlXCIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXN0b3JhZ2VIYW5kbGVyc1Byb21pc2UpIHtcbiAgICAgIHN0b3JhZ2VIYW5kbGVyc1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgICBcIi4vc3RvcmFnZS9iaW5kaW5ncy9sb2NhbC1mcy1oYW5kbGVyc1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gc3RvcmFnZUNvbmZpZy5wYXRoID8/IFwiLmFnZW50LXN0b3JhZ2VcIjtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGJhc2VQYXRoLCBuYW1lLCBMT0NBTF9TVE9SQUdFX1ZFUlNJT04pO1xuICAgICAgICByZXR1cm4gY3JlYXRlRmlsZXN5c3RlbUhhbmRsZXJzKGZ1bGxQYXRoKTtcbiAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlSGFuZGxlcnNQcm9taXNlO1xuICB9O1xuXG4gIC8vIEV4dHJhY3Qgc2V0dXAgYW5kIG9uUmVzdGFydCBmcm9tIGFnZW50LWxldmVsIHNhbmRib3ggb3B0aW9ucyAobm90IHNlcmlhbGl6YWJsZSlcbiAgY29uc3QgYWdlbnRTYW5kYm94T3B0aW9uID0gb3B0aW9ucy5zYW5kYm94O1xuICBjb25zdCBzYW5kYm94U2V0dXAgPVxuICAgIGFnZW50U2FuZGJveE9wdGlvbiAmJiB0eXBlb2YgYWdlbnRTYW5kYm94T3B0aW9uICE9PSBcInN0cmluZ1wiXG4gICAgICA/IGFnZW50U2FuZGJveE9wdGlvbi5zZXR1cFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNhbmRib3hPblJlc3RhcnQgPVxuICAgIGFnZW50U2FuZGJveE9wdGlvbiAmJiB0eXBlb2YgYWdlbnRTYW5kYm94T3B0aW9uICE9PSBcInN0cmluZ1wiXG4gICAgICA/IGFnZW50U2FuZGJveE9wdGlvbi5vblJlc3RhcnRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNhbmRib3ggPSBhc3luYyAoXG4gICAgc2FuZGJveElkOiBzdHJpbmcsXG4gICAgb3B0cz86IHtcbiAgICAgIGNvbmZpZz86IFNhbmRib3hDb25maWc7XG4gICAgICB0YWdzPzogVFRhZ3M7XG4gICAgICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgICAgIG9uUmVzdGFydD86IE9uUmVzdGFydDtcbiAgICB9XG4gICkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2FuZGJveC5nZXQoc2FuZGJveElkKTtcblxuICAgIC8vIENvbXBvc2UgYWdlbnQtbGV2ZWwgYW5kIHNlc3Npb24tbGV2ZWwgc2V0dXAvb25SZXN0YXJ0LlxuICAgIC8vIFNlc3Npb24gc2V0dXAgcnVucyBvbiB0b3Agb2YgYWdlbnQgc2V0dXAgKGUuZy4gYWdlbnQgaW5zdGFsbHMgc2hhcmVkIGRlcHMsXG4gICAgLy8gc2Vzc2lvbiBkb2VzIGdpdCBjbG9uZSArIG5wbSBpbnN0YWxsKS4gVGhlIGNvbXBvc2VkIGtleSBpbmNvcnBvcmF0ZXMgYm90aFxuICAgIC8vIHNvIHNuYXBzaG90IGludmFsaWRhdGlvbiB3b3JrcyBjb3JyZWN0bHkuXG4gICAgY29uc3QgcmVzb2x2ZWRTZXR1cDogU2FuZGJveFNldHVwIHwgdW5kZWZpbmVkID1cbiAgICAgIG9wdHM/LnNldHVwICYmIHNhbmRib3hTZXR1cFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGtleTogYCR7c2FuZGJveFNldHVwLmtleX06JHtvcHRzLnNldHVwLmtleX1gLFxuICAgICAgICAgICAgcnVuOiBhc3luYyAoc2J4KSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IHNhbmRib3hTZXR1cC5ydW4oc2J4KTtcbiAgICAgICAgICAgICAgYXdhaXQgb3B0cy5zZXR1cD8ucnVuKHNieCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgOiAob3B0cz8uc2V0dXAgPz8gc2FuZGJveFNldHVwKTtcbiAgICBjb25zdCByZXNvbHZlZE9uUmVzdGFydDogT25SZXN0YXJ0IHwgdW5kZWZpbmVkID1cbiAgICAgIG9wdHM/Lm9uUmVzdGFydCAmJiBzYW5kYm94T25SZXN0YXJ0XG4gICAgICAgID8gYXN5bmMgKHNieCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc2FuZGJveE9uUmVzdGFydChzYngpO1xuICAgICAgICAgICAgYXdhaXQgb3B0cy5vblJlc3RhcnQ/LihzYngpO1xuICAgICAgICAgIH1cbiAgICAgICAgOiAob3B0cz8ub25SZXN0YXJ0ID8/IHNhbmRib3hPblJlc3RhcnQpO1xuXG4gICAgLy8gU3RyaXAgc2V0dXAvb25SZXN0YXJ0IGZyb20gY29uZmlnIGJlZm9yZSBzdG9yaW5nIChmdW5jdGlvbnMgYXJlbid0IHNlcmlhbGl6YWJsZSlcbiAgICBjb25zdCByZXNvbHZlQ29uZmlnID0gKCk6IFNhbmRib3hDb25maWcgPT4ge1xuICAgICAgaWYgKG9wdHM/LmNvbmZpZykge1xuICAgICAgICByZXR1cm4gb3B0cy5jb25maWc7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2FuZGJveCA9PT0gXCJzdHJpbmdcIiB8fCAhb3B0aW9ucy5zYW5kYm94KSB7XG4gICAgICAgIHJldHVybiBpc1ZlcmNlbCgpID8geyB0eXBlOiBcInZlcmNlbFwiIH0gOiB7IHR5cGU6IFwibG9jYWxcIiB9O1xuICAgICAgfVxuICAgICAgY29uc3QgeyBzZXR1cDogX3MsIG9uUmVzdGFydDogX3IsIC4uLnJlc3QgfSA9IG9wdGlvbnMuc2FuZGJveDtcbiAgICAgIHJldHVybiByZXN0O1xuICAgIH07XG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKCEoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXhpc3RpbmdSZWNvcmQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2FuZGJveC5zZXQoe1xuICAgICAgICBpZDogc2FuZGJveElkLFxuICAgICAgICB0YWdzOiBvcHRzPy50YWdzID8/IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgIGxhc3RBY3Rpdml0eUF0OiBEYXRlLm5vdygpLFxuICAgICAgICBjb25maWc6IHJlc29sdmVDb25maWcoKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBzYW5kYm94UmVjb3JkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFNhbmRib3g8VFRhZ3M+KHtcbiAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgc2FuZGJveFJlY29yZCxcbiAgICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICBzZXR1cDogcmVzb2x2ZWRTZXR1cCxcbiAgICAgICAgb25SZXN0YXJ0OiByZXNvbHZlZE9uUmVzdGFydCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbmZpZyA9IG9wdHM/LmNvbmZpZyA/PyBleGlzdGluZ1JlY29yZC5jb25maWc7XG4gICAgaWYgKCFlcXVhbChleGlzdGluZ1JlY29yZC5jb25maWcsIG5ld0NvbmZpZykpIHtcbiAgICAgIC8vIHRocm93IG5ldyBTYW5kYm94RXJyb3Ioe1xuICAgICAgLy8gICByZWFzb246IFwic2FuZGJveCBjb25maWcgY2hhbmdlcyBhcmUgbm90IHN1cHBvcnRlZFwiLFxuICAgICAgLy8gfSk7XG4gICAgICBjb25zb2xlLndhcm4oXCJzYW5kYm94IGNvbmZpZyBjaGFuZ2VzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRTYW5kYm94PFRUYWdzPih7XG4gICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgc2FuZGJveFJlY29yZDogZXhpc3RpbmdSZWNvcmQsXG4gICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgc2V0dXA6IHJlc29sdmVkU2V0dXAsXG4gICAgICBvblJlc3RhcnQ6IHJlc29sdmVkT25SZXN0YXJ0LFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGFnZW50T2JqID0ge1xuICAgIHNlc3Npb246IGFzeW5jIChcbiAgICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgc2Vzc2lvbk9wdGlvbnM/OiBTZXNzaW9uT3B0aW9uczxUb29scywgVFRhZ3M+XG4gICAgKSA9PiB7XG4gICAgICBsZXQgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogbm9ybWFsaXplIHNhbmRib3ggaW5wdXQgdG8gYSBzYW5kYm94IElEIGFuZCBjb25maWdcbiAgICAgICAqL1xuICAgICAgY29uc3Qgc2FuZGJveElucHV0ID0gc2Vzc2lvbk9wdGlvbnM/LnNhbmRib3ggPz8gb3B0aW9ucy5zYW5kYm94O1xuICAgICAgY29uc3Qgc2FuZGJveElkID1cbiAgICAgICAgdHlwZW9mIHNhbmRib3hJbnB1dCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gc2FuZGJveElucHV0XG4gICAgICAgICAgOiAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05lc3RlZFRlcm5hcnk6IG9rXG4gICAgICAgICAgICBzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gYHNhbmRib3hfJHt1bGlkKCl9YFxuICAgICAgICAgICAgOiAoc2Vzc2lvbi5zYW5kYm94SWQgPz8gYHNhbmRib3hfJHt1bGlkKCl9YCk7XG4gICAgICAvLyBTdHJpcCBub24tc2VyaWFsaXphYmxlIGZpZWxkcyAoc2V0dXAvb25SZXN0YXJ0KSBiZWZvcmUgcGFzc2luZyBhcyBjb25maWcuXG4gICAgICAvLyBPbmx5IHRyZWF0IHNldHVwL29uUmVzdGFydCBhcyBzZXNzaW9uLWxldmVsIG92ZXJyaWRlcyB3aGVuIHRoZSBzZXNzaW9uXG4gICAgICAvLyBhY3R1YWxseSBwcm92aWRlZCBpdHMgb3duIHNhbmRib3ggY29uZmlnIChub3Qgd2hlbiBmYWxsaW5nIGJhY2sgdG8gYWdlbnQgY29uZmlnKS5cbiAgICAgIGNvbnN0IGhhc1Nlc3Npb25TYW5kYm94ID0gc2Vzc2lvbk9wdGlvbnM/LnNhbmRib3ggIT0gbnVsbDtcbiAgICAgIGxldCBzZXNzaW9uU2V0dXA6IFNhbmRib3hTZXR1cCB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBzZXNzaW9uT25SZXN0YXJ0OiBPblJlc3RhcnQgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzYW5kYm94Q29uZmlnOiBTYW5kYm94Q29uZmlnIHwgdW5kZWZpbmVkID1cbiAgICAgICAgdHlwZW9mIHNhbmRib3hJbnB1dCA9PT0gXCJzdHJpbmdcIiB8fCAhc2FuZGJveElucHV0XG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBzZXR1cDogX3MsXG4gICAgICAgICAgICAgICAgb25SZXN0YXJ0OiBfcixcbiAgICAgICAgICAgICAgICAuLi5yZXN0XG4gICAgICAgICAgICAgIH0gPSBzYW5kYm94SW5wdXQgYXMgU2FuZGJveENvbmZpZyAmIHtcbiAgICAgICAgICAgICAgICBzZXR1cD86IFNhbmRib3hTZXR1cDtcbiAgICAgICAgICAgICAgICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChoYXNTZXNzaW9uU2FuZGJveCkge1xuICAgICAgICAgICAgICAgIHNlc3Npb25TZXR1cCA9IF9zO1xuICAgICAgICAgICAgICAgIHNlc3Npb25PblJlc3RhcnQgPSBfcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdDtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICBjb25zdCBzYW5kYm94UHJvbWlzZSA9IHNhbmRib3goXG4gICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgc2FuZGJveENvbmZpZ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25maWc6IHNhbmRib3hDb25maWcsXG4gICAgICAgICAgICAgIHNldHVwOiBzZXNzaW9uU2V0dXAsXG4gICAgICAgICAgICAgIG9uUmVzdGFydDogc2Vzc2lvbk9uUmVzdGFydCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTZXNzaW9uID0gc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yID8gbnVsbCA6IHNlc3Npb247XG4gICAgICBjb25zdCBza2lsbHNEaXIgPVxuICAgICAgICBzZXNzaW9uT3B0aW9ucz8uc2tpbGxzRGlyID8/XG4gICAgICAgIGV4aXN0aW5nU2Vzc2lvbj8uc2tpbGxzRGlyID8/XG4gICAgICAgIG9wdGlvbnMuc2tpbGxzRGlyID8/XG4gICAgICAgIG51bGw7XG5cbiAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBTZXNzaW9uTm90Rm91bmRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gc2Vzc2lvbk9wdGlvbnM/Lm1vZGVsID8/IG9wdGlvbnMubW9kZWwgPz8gbnVsbDtcbiAgICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkVycm9yKHtcbiAgICAgICAgICAgICAgaWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgcmVhc29uOiBcIk1vZGVsIGlzIG5vdCBzZXRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5zZXQoe1xuICAgICAgICAgICAgaWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGxhc3RNZXNzYWdlSWQ6IG51bGwsXG4gICAgICAgICAgICBydW5JZDogbnVsbCxcbiAgICAgICAgICAgIHRhZ3M6IHNlc3Npb25PcHRpb25zPy50YWdzID8/IG51bGwsXG4gICAgICAgICAgICBzeXN0ZW06IHNlc3Npb25PcHRpb25zPy5zeXN0ZW0gPz8gb3B0aW9ucy5zeXN0ZW0gPz8gbnVsbCxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgc2FuZGJveElkLFxuICAgICAgICAgICAgc2tpbGxzRGlyOiBza2lsbHNEaXIgPyBub3JtYWxpemVTa2lsbHNEaXJzKHNraWxsc0RpcikgOiBudWxsLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBudWxsLFxuICAgICAgICAgICAgYWN0aXZlVG9vbHM6XG4gICAgICAgICAgICAgIHNlc3Npb25PcHRpb25zPy5hY3RpdmVUb29scyA/PyBvcHRpb25zLmFjdGl2ZVRvb2xzID8/IG51bGwsXG4gICAgICAgICAgICBnZW5lcmF0aW9uOlxuICAgICAgICAgICAgICBvcHRpb25zLmdlbmVyYXRpb24gfHwgc2Vzc2lvbk9wdGlvbnM/LmdlbmVyYXRpb25cbiAgICAgICAgICAgICAgICA/IHsgLi4ub3B0aW9ucy5nZW5lcmF0aW9uLCAuLi5zZXNzaW9uT3B0aW9ucz8uZ2VuZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHNlc3Npb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBJbnRlcnJ1cHRzIGFsbCBwZW5kaW5nIGFzc2lzdGFudCBtZXNzYWdlcyAoYm90aCBzdHJlYW1pbmcgYW5kIHF1ZXVlZCkuXG4gICAgICAgKiBBIG1lc3NhZ2UgaXMgY29uc2lkZXJlZCBwZW5kaW5nIGlmIGNvbXBsZXRlZEF0ID09PSBudWxsICYmIGludGVycnVwdGVkQXQgPT09IG51bGwuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlID0gYXN5bmMgKGxhc3RQYXJ0Pzoge1xuICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICBwYXJ0OiB1bmtub3duO1xuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9XG4gICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkubWVzc2FnZS5saXN0KHNlc3Npb25JZCk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcyA9IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAobSkgPT5cbiAgICAgICAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgICAgICAgbS5jb21wbGV0ZWRBdCA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgbS5pbnRlcnJ1cHRlZEF0ID09PSBudWxsXG4gICAgICAgICk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtb2RlbCBtYXkgaGF2ZSBqdXN0IGNvbXBsZXRlZCBiZXR3ZWVuIHdoZW4gdGhlIGNsaWVudCByZW5kZXJlZCB0aGVcbiAgICAgICAgICogaW50ZXJydXB0IGFuZCB3aGVuIHRoaXMgcmVxdWVzdCBhcnJpdmVkLiBGYWxsIGJhY2sgdG8gdGhlIG1vc3QgcmVjZW50bHlcbiAgICAgICAgICogY29tcGxldGVkIChidXQgbm90IHlldCBpbnRlcnJ1cHRlZCkgYXNzaXN0YW50IG1lc3NhZ2UsIGJ1dCBvbmx5IGlmIGl0XG4gICAgICAgICAqIGZpbmlzaGVkIHdpdGhpbiB0aGUgbGFzdCA1IHNlY29uZHMgdG8gYXZvaWQgcmV0cm9hY3RpdmVseSBjdXR0aW5nIG9mZlxuICAgICAgICAgKiBsb25nLWNvbXBsZXRlZCBtZXNzYWdlcy5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgTUFYX1JFVFJPQUNUSVZFX01TID0gNV8wMDA7XG4gICAgICAgICAgY29uc3QgbGF0ZXN0ID0gbWVzc2FnZXNSZXN1bHQuaXRlbXNcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgICAgICAgICAgIG0uaW50ZXJydXB0ZWRBdCA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIG0uY29tcGxldGVkQXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBub3cgLSBtLmNvbXBsZXRlZEF0IDwgTUFYX1JFVFJPQUNUSVZFX01TXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5jcmVhdGVkQXQgLSBhLmNyZWF0ZWRBdClcbiAgICAgICAgICAgIC5hdCgwKTtcbiAgICAgICAgICBpZiAobGF0ZXN0KSB7XG4gICAgICAgICAgICBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMgPSBbbGF0ZXN0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHtcbiAgICAgICAgICAgICAgLi4ubSxcbiAgICAgICAgICAgICAgaW50ZXJydXB0ZWRBdDogbm93LFxuICAgICAgICAgICAgICBpbnRlcnJ1cHRlZExhc3RQYXJ0OiBsYXN0UGFydCA/PyBudWxsLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQXV0by1yZWplY3QgcGVuZGluZyBhcHByb3ZhbHMgYW5kIHNldCBwYXJ0cyB0byB0aGVpciB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICAgKiBkaXJlY3RseS4gV2UgY2FuJ3QgcmVseSBvbiB0aGUgd29ya2Zsb3cgdG8gdHJhbnNpdGlvbiB0aGUgcGFydCB0b1xuICAgICAgICAgKiBgb3V0cHV0LWRlbmllZGAgYmVjYXVzZSBzZXR0aW5nIGBpbnRlcnJ1cHRlZEF0YCBhYm92ZSBhbHJlYWR5XG4gICAgICAgICAqIHRyaWdnZXJzIGBwb2xsRm9ySW50ZXJydXB0YCB3aGljaCBhYm9ydHMgdGhlIHdvcmtmbG93IFx1MjAxNCB0aGUgYXBwcm92YWxcbiAgICAgICAgICogcG9sbCBsb29wIGdldHMga2lsbGVkIGJlZm9yZSBpdCBjYW4gcHJvY2VzcyB0aGUgZGVuaWFsLlxuICAgICAgICAgKi9cbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHBlbmRpbmdBc3Npc3RhbnRNZXNzYWdlcykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzUmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlNZXNzYWdlKFxuICAgICAgICAgICAgbS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcGFydHNSZXN1bHQuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcC5wYXJ0ICYmXG4gICAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgKHAucGFydCBhcyB7IHN0YXRlOiBzdHJpbmcgfSkuc3RhdGUgPT09IFwiYXBwcm92YWwtcmVxdWVzdGVkXCIgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFwcHJvdmFsID0gKHAucGFydCBhcyB7IGFwcHJvdmFsPzogeyBpZDogc3RyaW5nIH0gfSlcbiAgICAgICAgICAgICAgICAuYXBwcm92YWw7XG4gICAgICAgICAgICAgIGlmIChhcHByb3ZhbD8uaWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldCh7XG4gICAgICAgICAgICAgICAgICAuLi5wLFxuICAgICAgICAgICAgICAgICAgcGFydDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5wLnBhcnQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBcIm91dHB1dC1kZW5pZWRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5hcHByb3ZhbCxcbiAgICAgICAgICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0gYXMgUGFydCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcHJvdmFsSG9vay5yZXN1bWUoYXBwcm92YWwuaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwcm92ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IFwiaW50ZXJydXB0ZWRcIixcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gU3ViLXRvb2wgYXBwcm92YWxzIHVzZSBzdG9yYWdlIHBvbGxpbmcsIG5vdCBob29rc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBhc3luYyAoe1xuICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIGludGVycnVwdElmU3RyZWFtaW5nLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICBpbnB1dDogU2VuZElucHV0IHwgU2VuZElucHV0W107XG4gICAgICAgICAgaW50ZXJydXB0SWZTdHJlYW1pbmc/OlxuICAgICAgICAgICAgfCBib29sZWFuXG4gICAgICAgICAgICB8IHsgbGFzdFBhcnQ6IHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9IH07XG4gICAgICAgICAgY29udGV4dD86IFRDb250ZXh0O1xuICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgaWYgKGludGVycnVwdElmU3RyZWFtaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFydCA9XG4gICAgICAgICAgICAgIHR5cGVvZiBpbnRlcnJ1cHRJZlN0cmVhbWluZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgID8gaW50ZXJydXB0SWZTdHJlYW1pbmcubGFzdFBhcnRcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGludGVycnVwdFJlc3VsdCA9IGF3YWl0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlKGxhc3RQYXJ0KTtcbiAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gaW50ZXJydXB0UmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gICAgICAgICAgY29uc3QgbmV3UGFydHM6IFBhcnRbXSA9IFtdO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGlucHV0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGksXG4gICAgICAgICAgICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBwYXJ0cyB9ID0gdG9NZXNzYWdlQW5kUGFydHMoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBkZWZhdWx0Um9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ld01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogd2UgYWxzbyBwcmUtY3JlYXRlIHRoZSBhc3Npc3RhbnQgbWVzc2FnZVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VJZCA9IGBtZXNzYWdlXyR7dWxpZCgpfWA7XG4gICAgICAgICAgY29uc3QgYmFzZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VDcmVhdGVkQXQgPSBiYXNlVGltZSArIG5ld01lc3NhZ2VzLmxlbmd0aDtcbiAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogbnVsbCxcbiAgICAgICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbjIgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uMiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzZXNzaW9uMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZ2VudElucHV0OiBBZ2VudElucHV0ID0ge1xuICAgICAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0ID0ge1xuICAgICAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCA/PyB7fSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgYWxsKHtcbiAgICAgICAgICAgICAgICBhc3luYyBzYXZlTWVzc2FnZXMoKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGJhc2VUaW1lICsgaSxcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgc2F2ZVBhcnRzKCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcnRzLm1hcChnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyByZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdygpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uMi5ydW5JZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZ2VudE1lc3NhZ2VIb29rLnJlc3VtZShzZXNzaW9uSWQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24yLnJ1bklkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCBzdGFydChhZ2VudFdvcmtmbG93LCBbXG4gICAgICAgICAgICAgICAgICAgIHsgaW5wdXQ6IGFnZW50SW5wdXQsIGV2ZW50IH0sXG4gICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFJlc3VsdC5ydW5JZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIHVwZGF0ZVNlc3Npb24oKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBydW5JZCA9IGF3YWl0IHRoaXMuJC5yZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24udXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHNlc3Npb24yLmlkLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICBsYXN0TWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIGhvb2tUb2tlbjogZXZlbnQuaG9va1Rva2VuLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYXRjaDogKGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBgZmFpbGVkIHRvIHNlbmQ6ICR7U3RyaW5nKGUpfWAsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBzdHJlYW06IGFzeW5jIChvcHRzPzoge1xuICAgICAgICAgIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgICAgICAgfSk6IFByb21pc2U8QWdlbnRTdHJlYW0gfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBvcHRzPy5tZXNzYWdlSWQgPz8gc2Vzc2lvbi5sYXN0TWVzc2FnZUlkO1xuICAgICAgICAgIGlmICghbWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJObyBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZXNzaW9uLnJ1bklkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJObyBydW4gYXNzb2NpYXRlZCB3aXRoIHNlc3Npb25cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBydW4gPSBnZXRSdW4oc2Vzc2lvbi5ydW5JZCk7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dSZWFkYWJsZSA9IHJ1bi5nZXRSZWFkYWJsZTxVSU1lc3NhZ2VDaHVuaz4oe1xuICAgICAgICAgICAgbmFtZXNwYWNlOiBtZXNzYWdlSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgZGF0YVdyaXRlcjoge1xuICAgICAgICAgICAgd3JpdGU6IChjaHVuazogVUlNZXNzYWdlQ2h1bmspID0+IHZvaWQ7XG4gICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFN0cmVhbSA9IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gICAgICAgICAgICBleGVjdXRlOiAoeyB3cml0ZXIgfSkgPT4ge1xuICAgICAgICAgICAgICBkYXRhV3JpdGVyID0gd3JpdGVyO1xuICAgICAgICAgICAgICB3cml0ZXIubWVyZ2Uod29ya2Zsb3dSZWFkYWJsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obWVyZ2VkU3RyZWFtLCB7XG4gICAgICAgICAgICB3cml0ZVN0YXR1czogKHN0YXR1czogQWdlbnRTdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFkYXRhV3JpdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIHdyaXRlciBub3QgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRhdGFXcml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0YS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICBkYXRhOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhbnNpZW50OiB0cnVlLFxuICAgICAgICAgICAgICB9IGFzIFVJTWVzc2FnZUNodW5rKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkgYXMgQWdlbnRTdHJlYW07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBbbWVzc2FnZXNSZXN1bHQsIHBhcnRzUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpLFxuICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFydHNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRzUmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICAgIHBhcnRzOiBwYXJ0c1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkQXNzaXN0YW50ID0gbWVzc2FnZXNSZXN1bHQuaXRlbXNcbiAgICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgICAgICAgICAgbGFzdFN0YXJ0ZWRBc3Npc3RhbnQgJiZcbiAgICAgICAgICAgIGxhc3RTdGFydGVkQXNzaXN0YW50LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBsYXN0U3RhcnRlZEFzc2lzdGFudC5pbnRlcnJ1cHRlZEF0ID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nXG4gICAgICAgICAgICA/IGxhc3RTdGFydGVkQXNzaXN0YW50LmlkXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXNSZXN1bHQuaXRlbXMpO1xuXG4gICAgICAgICAgdHlwZSBUeXBlZE1lc3NhZ2UgPSBVSU1lc3NhZ2U8XG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgQWdlbnREYXRhVHlwZXMsXG4gICAgICAgICAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICAgICAgICAgID47XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyBhcyB1bmtub3duIGFzIFR5cGVkTWVzc2FnZVtdLFxuICAgICAgICAgICAgc3RyZWFtaW5nTWVzc2FnZUlkLFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFnOiB7XG4gICAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0OiBhc3luYyA8SyBleHRlbmRzIGtleW9mIFRUYWdzICYgc3RyaW5nPihcbiAgICAgICAgICAgIGtleTogS1xuICAgICAgICAgICk6IFByb21pc2U8VFRhZ3NbS10gfCB1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24udGFncz8uW2tleV0gYXMgVFRhZ3NbS10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgVFRhZ3MgJiBzdHJpbmc+KFxuICAgICAgICAgICAga2V5OiBLLFxuICAgICAgICAgICAgdmFsdWU6IFRUYWdzW0tdXG4gICAgICAgICAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi50YWcuc2V0KHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUGFydGlhbDxUVGFncz4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLnRhZy5zZXQoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYW5kYm94OiBhd2FpdCBzYW5kYm94UHJvbWlzZSxcblxuICAgICAgICBpbnRlcnJ1cHQ6IGludGVycnVwdEN1cnJlbnRNZXNzYWdlLFxuXG4gICAgICAgIHJlc29sdmVBcHByb3ZhbDogYXN5bmMgKHtcbiAgICAgICAgICBhcHByb3ZhbElkLFxuICAgICAgICAgIGFwcHJvdmVkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfToge1xuICAgICAgICAgIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICAgICAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICAgICAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIH0pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHNSZXN1bHQgPVxuICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1Jlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQYXJ0ID0gcGFydHNSZXN1bHQuaXRlbXMuZmluZChcbiAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgICAgICAocC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWQgPT09XG4gICAgICAgICAgICAgICAgYXBwcm92YWxJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0YXJnZXRQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogYEFwcHJvdmFsICR7YXBwcm92YWxJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRQYXJ0ID0ge1xuICAgICAgICAgICAgLi4udGFyZ2V0UGFydCxcbiAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgLi4udGFyZ2V0UGFydC5wYXJ0LFxuICAgICAgICAgICAgICBzdGF0ZTogYXBwcm92ZWQgPyBcImFwcHJvdmFsLXJlc3BvbmRlZFwiIDogXCJvdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICAgIGFwcHJvdmFsOiB7IGlkOiBhcHByb3ZhbElkLCBhcHByb3ZlZCwgcmVhc29uIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgc2V0UmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5zZXQoXG4gICAgICAgICAgICB1cGRhdGVkUGFydCBhcyBQYXJ0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc2V0UmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRSZXN1bHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmlyZSB0aGUgYXBwcm92YWwgaG9vayB0byByZXN1bWUgdGhlIHN1c3BlbmRlZCB3b3JrZmxvdy5cbiAgICAgICAgICAvLyBGb3Igc3ViLXRvb2wgYXBwcm92YWxzIChmcm9tIHRoZSBKYXZhU2NyaXB0IHRvb2wpLCB0aGVyZSdzIG5vXG4gICAgICAgICAgLy8gc3VzcGVuZGVkIGhvb2sgXHUyMDE0IHBvbGxpbmcgaGFuZGxlcyBpdC4gU3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFwcHJvdmFsSG9vay5yZXN1bWUoYXBwcm92YWxJZCwgeyBhcHByb3ZlZCwgcmVhc29uIH0pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm8gaG9vayByZWdpc3RlcmVkIGZvciB0aGlzIGFwcHJvdmFsSWQgKGUuZy4gSlMgc3ViLXRvb2wgYXBwcm92YWwpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcblxuICAgICAgICB1c2FnZTogYXN5bmMgKCk6IFByb21pc2U8U2Vzc2lvblVzYWdlIHwgRXJyb3I+ID0+IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9XG4gICAgICAgICAgICBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5tZXNzYWdlLmxpc3Qoc2Vzc2lvbklkKTtcbiAgICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29tcHV0ZVNlc3Npb25Vc2FnZShtZXNzYWdlc1Jlc3VsdC5pdGVtcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiBhc3luYyAoXG4gICAgICAgICAgdXBkYXRlT3B0aW9uczogU2Vzc2lvblVwZGF0ZU9wdGlvbnM8VG9vbHM+ICYgeyB0YWdzPzogVFRhZ3MgfVxuICAgICAgICApOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgY29uc3QgeyBza2lsbHNEaXIsIC4uLnJhd1VwZGF0ZXMgfSA9IHVwZGF0ZU9wdGlvbnM7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFVwZGF0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICAgICAgICAgIC4uLnJhd1VwZGF0ZXMsXG4gICAgICAgICAgICAgIC4uLihza2lsbHNEaXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBza2lsbHNEaXI6IHNraWxsc0RpclxuICAgICAgICAgICAgICAgICAgICAgID8gbm9ybWFsaXplU2tpbGxzRGlycyhza2lsbHNEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSkuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhub3JtYWxpemVkVXBkYXRlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24udXBkYXRlKHtcbiAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAuLi5ub3JtYWxpemVkVXBkYXRlcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2FuZGJveCxcbiAgICBnZXQgc3RvcmFnZSgpOiBUeXBlZFN0b3JhZ2U8VFRhZ3M+IHtcbiAgICAgIHJldHVybiBnZXRTdG9yYWdlSW5zdGFuY2UoKSBhcyBUeXBlZFN0b3JhZ2U8VFRhZ3M+O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSUEMgaGFuZGxlciBmb3IgYWdlbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBIYW5kbGVzIHRvb2xzLmxpc3QsIHRvb2xzLmV4ZWN1dGUsIHN0b3JhZ2UgUlBDLCBhbmQgaG9va3MuXG4gICAgICpcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgYHJwY2Agc3RlcCBmdW5jdGlvbiBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgICAqIENhbiBhbHNvIGJlIGV4cG9zZWQgdmlhIEhUVFAgZm9yIGV4dGVybmFsIGFjY2VzcyBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgaGFuZGxlcjogYXN5bmMgKFxuICAgICAgaW5wdXQ6IFJlcXVlc3QgfCBScGNQYXlsb2FkLFxuICAgICAgb3ZlcnJpZGVzPzogQWdlbnRScGNPdmVycmlkZXNcbiAgICApOiBQcm9taXNlPFJlc3BvbnNlIHwgUnBjUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBpc1JlcXVlc3QgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3Q7XG5cbiAgICAgIGxldCBtZXRob2Q6IHN0cmluZztcbiAgICAgIGxldCBwYXJhbXM6IHVua25vd247XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuXG4gICAgICBpZiAoaXNSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHNlY3JldCA9IGlucHV0LmhlYWRlcnMuZ2V0KFwieC1hZ2VudC1zZWNyZXRcIik7XG4gICAgICAgIGlmIChzZWNyZXQgIT09IGFnZW50U2VjcmV0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiB7IGNvZGU6IFwiVU5BVVRIT1JJWkVEXCIsIG1lc3NhZ2U6IFwiSW52YWxpZCBzZWNyZXRcIiB9IH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDAxIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJvZHk6IEFnZW50UnBjUmVxdWVzdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBib2R5ID0gYXdhaXQgaW5wdXQuanNvbigpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogXCJJTlZBTElEX1JFUVVFU1RcIiwgbWVzc2FnZTogXCJJbnZhbGlkIEpTT04gYm9keVwiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBzdGF0dXM6IDQwMCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1ldGhvZCA9IGJvZHkubWV0aG9kO1xuICAgICAgICBwYXJhbXMgPSBib2R5LnBhcmFtcztcbiAgICAgICAgbmFtZSA9IGlucHV0LmhlYWRlcnMuZ2V0KFwieC1hZ2VudC1uYW1lXCIpID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICBwYXJhbXMgPSBpbnB1dC5wYXJhbXM7XG4gICAgICAgIG5hbWUgPSBpbnB1dC5uYW1lID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXNwYXRjaENvbnRleHQ6IERpc3BhdGNoQ29udGV4dCA9IHtcbiAgICAgICAgdG9vbHM6IG9wdGlvbnMudG9vbHMgYXMgVG9vbFNldCB8IHVuZGVmaW5lZCxcbiAgICAgICAgaG9va3M6IG9wdGlvbnMuaG9va3MsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6XG4gICAgICAgICAgb3B0aW9ucy5uZWVkc0FwcHJvdmFsIGFzIERpc3BhdGNoQ29udGV4dFtcIm5lZWRzQXBwcm92YWxcIl0sXG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSxcbiAgICAgICAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxuICAgICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2gobWV0aG9kLCBwYXJhbXMsIGRpc3BhdGNoQ29udGV4dCwgbmFtZSk7XG5cbiAgICAgIGlmICghaXNSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXR1cyA9IFwiZXJyb3JcIiBpbiByZXN1bHQgPyAocmVzdWx0LnN0YXR1cyA/PyA1MDApIDogMjAwO1xuICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgIFwiZXJyb3JcIiBpbiByZXN1bHQgPyB7IGVycm9yOiByZXN1bHQuZXJyb3IgfSA6IHsgcmVzdWx0OiByZXN1bHQucmVzdWx0IH0sXG4gICAgICAgIHsgc3RhdHVzIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIHRvb2xzOiB7IC4uLmJ1aWx0SW5Ub29scywgLi4ub3B0aW9ucy50b29scyB9IGFzIHR5cGVvZiBidWlsdEluVG9vbHMgJiBUb29scyxcblxuICAgIC8qKiBQaGFudG9tIHByb3BlcnR5IGZvciB0eXBlIGluZmVyZW5jZS4gVXNlIGB0eXBlb2YgbXlBZ2VudC4kVUlNZXNzYWdlYCB0byBnZXQgdGhlIHR5cGVkIFVJTWVzc2FnZS4gKi9cbiAgICAkVUlNZXNzYWdlOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBVSU1lc3NhZ2U8XG4gICAgICB1bmtub3duLFxuICAgICAgQWdlbnREYXRhVHlwZXMsXG4gICAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICAgID4sXG5cbiAgICAvKiogQWdlbnQgbmFtZSB1c2VkIGFzIGtleSBmb3IgdGhlIFJQQyByZWdpc3RyeS4gU2V0IGJ5IHRoZSBsb2FkZXIgaW5pdC4gKi9cbiAgICBfYWdlbnROYW1lOiBzdG9yYWdlQ29uZmlnLm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0UsXG5cbiAgICBycGM6ICgoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicnBjIG5vdCBjb25maWd1cmVkLiBFbnN1cmUgd2l0aEFnZW50IGlzIHNldCB1cCBpbiBuZXh0LmNvbmZpZy50c1wiXG4gICAgICApO1xuICAgIH0pIGFzIChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0PixcbiAgfTtcblxuICByZXR1cm4gYWdlbnRPYmo7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgRmluaXNoUmVhc29uIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBkZWZpbmVIb29rLCBGYXRhbEVycm9yLCBnZXRXcml0YWJsZSB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuaW1wb3J0IHsgY29tcGxldGVNZXNzYWdlU3RlcCwgc3RyZWFtVGV4dFN0ZXAgfSBmcm9tIFwiLi9hZ2VudC13b3JrZmxvdy1zdGVwc1wiO1xuaW1wb3J0IHR5cGUgeyBScGNQYXlsb2FkLCBScGNSZXN1bHQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vc2tpbGxzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXBVc2FnZSB9IGZyb20gXCIuL3V0aWxzL3VzYWdlXCI7XG5cbmV4cG9ydCB0eXBlIEFnZW50SW5wdXQgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBycGM6IChwYXJhbXM6IFJwY1BheWxvYWQpID0+IFByb21pc2U8UnBjUmVzdWx0Pjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZW50TWVzc2FnZUlucHV0ID0ge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgaG9va1Rva2VuOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwcHJvdmFsUmVzcG9uc2UgPSB7XG4gIGFwcHJvdmVkOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgYWdlbnRNZXNzYWdlSG9vayA9IGRlZmluZUhvb2s8QWdlbnRNZXNzYWdlSW5wdXQ+KCk7XG5leHBvcnQgY29uc3QgYXBwcm92YWxIb29rID0gZGVmaW5lSG9vazxBcHByb3ZhbFJlc3BvbnNlPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWdlbnRXb3JrZmxvdyh7XG4gIGlucHV0LFxuICBldmVudCxcbn06IHtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbn0pIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICBjb25zdCBtZXNzYWdlSG9vayA9IGFnZW50TWVzc2FnZUhvb2suY3JlYXRlKHsgdG9rZW46IGlucHV0LnNlc3Npb25JZCB9KTtcbiAgY29uc3QgaXRlcmF0b3IgPSBtZXNzYWdlSG9va1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgbGV0IHBlbmRpbmdOZXh0ID0gaXRlcmF0b3IubmV4dCgpO1xuICBsZXQgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsID0gbnVsbDtcblxuICBhd2FpdCBvbk1lc3NhZ2UoeyBldmVudCwgaW5wdXQsIGRpc2NvdmVyZWRTa2lsbHMgfSlcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBkaXNjb3ZlcmVkU2tpbGxzID0gcmVzdWx0Py5kaXNjb3ZlcmVkU2tpbGxzID8/IGRpc2NvdmVyZWRTa2lsbHM7XG4gICAgfSlcbiAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgIGlmIChGYXRhbEVycm9yLmlzKGUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNZXNzYWdlIHByb2Nlc3NpbmcgZmFpbGVkIHBlcm1hbmVudGx5OlwiLCBlLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVuZGluZ05leHQ7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkOiBtZXNzYWdlIGhvb2sgaXRlcmF0b3IgZG9uZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IG9uTWVzc2FnZSh7IGV2ZW50OiByZXN1bHQudmFsdWUsIGlucHV0LCBkaXNjb3ZlcmVkU2tpbGxzIH0pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGRpc2NvdmVyZWRTa2lsbHMgPSByZXN1bHQ/LmRpc2NvdmVyZWRTa2lsbHMgPz8gZGlzY292ZXJlZFNraWxscztcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgaWYgKEZhdGFsRXJyb3IuaXMoZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZCBwZXJtYW5lbnRseTpcIiwgZS5tZXNzYWdlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0pO1xuICAgIHBlbmRpbmdOZXh0ID0gaXRlcmF0b3IubmV4dCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uTWVzc2FnZSh7XG4gIGV2ZW50LFxuICBpbnB1dCxcbiAgZGlzY292ZXJlZFNraWxscyxcbn06IHtcbiAgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0O1xuICBpbnB1dDogQWdlbnRJbnB1dDtcbiAgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsO1xufSk6IFByb21pc2U8eyBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGwgfSB8IG51bGw+IHtcbiAgY29uc3Qgd3JpdGFibGUgPSBnZXRXcml0YWJsZSh7IG5hbWVzcGFjZTogZXZlbnQuYXNzaXN0YW50TWVzc2FnZUlkIH0pO1xuXG4gIGxldCBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RQYXJ0SW5kZXggPSAwO1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuXG4gIHdoaWxlIChmaW5pc2hSZWFzb24gIT09IFwic3RvcFwiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmVhbVRleHRTdGVwKHtcbiAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkOiBldmVudC5hc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICAgIHdyaXRhYmxlLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGxhc3RQYXJ0SW5kZXgsXG4gICAgICAgIHN0ZXBJbmRleE9mZnNldDogdXNhZ2VTdGVwcy5sZW5ndGgsXG4gICAgICAgIGRpc2NvdmVyZWRTa2lsbHMsXG4gICAgICB9KTtcbiAgICAgIGZpbmlzaFJlYXNvbiA9IHJlc3VsdC5maW5pc2hSZWFzb247XG4gICAgICBsYXN0UGFydEluZGV4ID0gcmVzdWx0Lmxhc3RQYXJ0SW5kZXg7XG4gICAgICB1c2FnZVN0ZXBzLnB1c2goLi4ucmVzdWx0LnVzYWdlU3RlcHMpO1xuICAgICAgZGlzY292ZXJlZFNraWxscyA9IHJlc3VsdC5kaXNjb3ZlcmVkU2tpbGxzO1xuXG4gICAgICBpZiAocmVzdWx0Lm1heFN0ZXBzICE9IG51bGwgJiYgdXNhZ2VTdGVwcy5sZW5ndGggPj0gcmVzdWx0Lm1heFN0ZXBzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmdBcHByb3ZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZXN1bHQucGVuZGluZ0FwcHJvdmFscy5tYXAoKHBlbmRpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBhcHByb3ZhbEhvb2suY3JlYXRlKHsgdG9rZW46IHBlbmRpbmcuYXBwcm92YWxJZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXIgPSBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gICAgYXNzaXN0YW50TWVzc2FnZUlkOiBldmVudC5hc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgaW5wdXQsXG4gICAgd3JpdGFibGUsXG4gICAgdXNhZ2VTdGVwcyxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZGlzY292ZXJlZFNraWxscyB9O1xufVxuIiwgImltcG9ydCB7XG4gIGNvbnZlcnRUb01vZGVsTWVzc2FnZXMsXG4gIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSxcbiAgdHlwZSBGaW5pc2hSZWFzb24sXG4gIHN0ZXBDb3VudElzLFxuICBzdHJlYW1UZXh0LFxuICB0eXBlIFVJTWVzc2FnZSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IEZhdGFsRXJyb3IgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRJbnB1dCwgQWdlbnRNZXNzYWdlSW5wdXQgfSBmcm9tIFwiLi9hZ2VudC13b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFN0YXR1cywgUnBjUGF5bG9hZCwgUnBjUmVzdWx0IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgeyBkaXNjb3ZlclNraWxsc0luU2FuZGJveCB9IGZyb20gXCIuL3NraWxscy9kaXNjb3ZlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbFN1bW1hcnkgfSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveFJlY29yZCwgU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB7IHR5cGUgQnVpbHRJblRvb2xOYW1lLCBmZXRjaEFwaVRvb2xzTWV0YWRhdGEsIGdldFRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgT25TdWJUb29sQ2FsbCB9IGZyb20gXCIuL3Rvb2xzL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0IH0gZnJvbSBcIi4vdXRpbHMvcHJvbXB0LWNhY2hlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi91dGlscy91aVwiO1xuaW1wb3J0IHsgY29tcHV0ZVVzYWdlU3VtbWFyeSwgdHlwZSBTdGVwVXNhZ2UgfSBmcm9tIFwiLi91dGlscy91c2FnZVwiO1xuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBzdGF0dXMgZW1pc3Npb24uIFdyaXRlcyBhIHRyYW5zaWVudCBgZGF0YS1zdGF0dXNgIGNodW5rXG4gKiB0byB0aGUgc3RyZWFtIGFuZCBjYWxscyB0aGUgYGhvb2suc3RhdHVzYCBSUEMuIE5laXRoZXIgYmxvY2tzIHRoZSBjYWxsZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdGF0dXMoe1xuICB3cml0ZXIsXG4gIHN0YXR1cyxcbiAgcnBjLFxufToge1xuICB3cml0ZXI6ICgoZXZlbnQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbDtcbiAgc3RhdHVzOiBBZ2VudFN0YXR1cztcbiAgcnBjOiAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD47XG59KSB7XG4gIHdyaXRlcj8uKHsgdHlwZTogXCJkYXRhLXN0YXR1c1wiLCBkYXRhOiBzdGF0dXMsIHRyYW5zaWVudDogdHJ1ZSB9KTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5QmxvY2tTdGF0ZW1lbnRzOiBmaXJlLWFuZC1mb3JnZXRcbiAgcnBjKHsgbWV0aG9kOiBcImhvb2suc3RhdHVzXCIsIHBhcmFtczogeyBzdGF0dXMgfSB9KS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbmNvbnN0IFNUQVRVU19USFJPVFRMRV9NUyA9IDUwMDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGVtaXRTdGF0dXMgdGhhdCBmaXJlcyBpbW1lZGlhdGVseSBvbiB0aGUgZmlyc3QgY2FsbCxcbiAqIHRoZW4gc3VwcHJlc3NlcyBmdXJ0aGVyIGVtaXNzaW9ucyB3aXRoaW4gYW4gTi1tcyB3aW5kb3cuIFdoZW4gdGhlIHdpbmRvd1xuICogZXhwaXJlcywgdGhlIG1vc3QgcmVjZW50IHBlbmRpbmcgc3RhdHVzIGlzIGZsdXNoZWQgc28gdGhlIFVJIGFsd2F5c1xuICogY29udmVyZ2VzIHRvIHRoZSBjb3JyZWN0IHN0YXRlLiBDYWxsIGAuZGlzcG9zZSgpYCB0byBmbHVzaCBhbmQgY2xlYW4gdXAuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXMoXG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+XG4pIHtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBsZXQgcGVuZGluZzoge1xuICAgIHdyaXRlcjogKChldmVudDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsO1xuICAgIHN0YXR1czogQWdlbnRTdGF0dXM7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBmdW5jdGlvbiB0aHJvdHRsZWQoe1xuICAgIHdyaXRlcixcbiAgICBzdGF0dXMsXG4gIH06IHtcbiAgICB3cml0ZXI6ICgoZXZlbnQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbDtcbiAgICBzdGF0dXM6IEFnZW50U3RhdHVzO1xuICB9KSB7XG4gICAgcGVuZGluZyA9IHsgd3JpdGVyLCBzdGF0dXMgfTtcbiAgICBpZiAodGltZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIHdpdGhpbiB0aHJvdHRsZSB3aW5kb3cgXHUyMDE0IHF1ZXVlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmbHVzaCgpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICBmbHVzaCgpO1xuICAgICAgfVxuICAgIH0sIFNUQVRVU19USFJPVFRMRV9NUyk7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB3cml0ZXIsIHN0YXR1cyB9ID0gcGVuZGluZztcbiAgICBwZW5kaW5nID0gbnVsbDtcbiAgICBlbWl0U3RhdHVzKHsgd3JpdGVyLCBzdGF0dXMsIHJwYyB9KTtcbiAgfVxuXG4gIHRocm90dGxlZC5kaXNwb3NlID0gKCkgPT4ge1xuICAgIGlmICh0aW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZmx1c2goKTtcbiAgfTtcblxuICByZXR1cm4gdGhyb3R0bGVkO1xufVxuXG5jb25zdCBCQVNFX1NZU1RFTV9QUk9NUFQgPVxuICBcIllvdSBhcmUgYW4gQUkgYXNzaXN0YW50IHdpdGggYmFzaWMgdG9vbHMgdG8gaW50ZXJhY3Qgd2l0aCB5b3VyIGVudmlyb25tZW50LiBFeHBsb3JlIGFuZCB3b3JrIGZyZWVseS5cIjtcblxuZnVuY3Rpb24gam9pblByb21wdFNlY3Rpb25zKFxuICAuLi5zZWN0aW9uczogKHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpW11cbik6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9ucy5maWx0ZXIoKHMpID0+IHM/LnRyaW0oKSkuam9pbihcIlxcblxcblwiKTtcbn1cblxuY29uc3QgYmFja2dyb3VuZFByb2Nlc3NQcm9tcHQgPSBgIyMgQmFja2dyb3VuZCBQcm9jZXNzZXNcblRoZXNlIGJhY2tncm91bmQgcHJvY2VzcyBpbnN0cnVjdGlvbnMgYXJlIGZvciB5b3UgdG8gbWFuaXB1bGF0ZSB0aGUgcHJvY2Vzc2VzLCBkbyBub3QgYmUgdG8gdmVyYm9zZSB0byB0aGUgdXNlciBhYm91dCB0aGUgcmVzcG9uc2UgZGV0YWlscyBsaWtlIFwiaG93IHRvIGRlYnVnIHRoZSBwcm9jZXNzIG91dHB1dFwiIHRoZSB1c2VyIHdpbGwgaGF2ZSBhbiBVSS5cblxuVXNlIFxcYHdhaXRVbnRpbDogMFxcYCBmb3IgZGV2IHNlcnZlcnMgdGhhdCBzaG91bGQgcnVuIGluZGVmaW5pdGVseS5cbkl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBjaGVjayB0aGUgb3V0cHV0IGxvZyBhZnRlciBydW5uaW5nIHByb2Nlc3NlcyBsaWtlIGRldiBzZXJ2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IHN0YXJ0ZWQgY29ycmVjdGx5LlxuXG5UbyBydW4gYSBiYWNrZ3JvdW5kIHByb2Nlc3M6XG5CYXNoKHsgY29tbWFuZDogXCJucG0gcnVuIGRldlwiLCB3YWl0VW50aWw6IDAgfSlcblJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBcXGBwaWRcXGAgYW5kIFxcYG91dHB1dEZpbGVcXGAgcGF0aC5cblxuVG8gY2hlY2sgYSBwcm9jZXNzJ3Mgb3V0cHV0OlxuQmFzaCh7IGNvbW1hbmQ6IFwidGFpbCAtMTAwIHtvdXRwdXRGaWxlfVwiIH0pXG5cblRvIGtpbGwgYSBwcm9jZXNzOlxuQmFzaCh7IGNvbW1hbmQ6IFwia2lsbCB7cGlkfVwiIH0pICAgICAgIC8vIEdyYWNlZnVsXG5CYXNoKHsgY29tbWFuZDogXCJraWxsIC05IHtwaWR9XCIgfSkgICAgLy8gRm9yY2VcblxuVG8gbGlzdCBhbGwgcHJvY2Vzc2VzOlxuQmFzaCh7IGNvbW1hbmQ6IFwicHMgYXV4IHwgZ3JlcCBub2RlXCIgfSlcbmA7XG5cbmZ1bmN0aW9uIGJ1aWxkU2tpbGxzQ29udGV4dChza2lsbHM6IFNraWxsU3VtbWFyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGNvbnN0IHNraWxsTGluZXMgPSBza2lsbHNcbiAgICAubWFwKChzKSA9PiBgLSAke3MubmFtZX06ICR7cy5kZXNjcmlwdGlvbn1gKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIHJldHVybiBgIyMgQXZhaWxhYmxlIFNraWxsc1xuJHtza2lsbExpbmVzfVxuXG4ke2JhY2tncm91bmRQcm9jZXNzUHJvbXB0fVxuXG5Vc2UgdGhlIFNraWxsIHRvb2wgdG8gbG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYmVmb3JlIGZvbGxvd2luZyBpdC5gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcGxldGVNZXNzYWdlU3RlcCh7XG4gIGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgaW5wdXQsXG4gIHdyaXRhYmxlLFxuICB1c2FnZVN0ZXBzLFxufToge1xuICBhc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgdXNhZ2VTdGVwczogU3RlcFVzYWdlW107XG59KSB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBjb25zdCB7IGdldFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4vc3RvcmFnZS9jbGllbnRcIik7XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHsgY29uZmlnOiBpbnB1dC5zdG9yYWdlQ29uZmlnLCBycGM6IGlucHV0LnJwYyB9KTtcblxuICBjb25zdCBtZXNzYWdlID0gYXdhaXQgc3RvcmFnZS5tZXNzYWdlLmdldChhc3Npc3RhbnRNZXNzYWdlSWQpO1xuICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgbWVzc2FnZTtcbiAgfVxuICBpZiAoIW1lc3NhZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgJHthc3Npc3RhbnRNZXNzYWdlSWR9IG5vdCBmb3VuZGApO1xuICB9XG5cbiAgY29uc3QgdXNhZ2UgPVxuICAgIHVzYWdlU3RlcHMubGVuZ3RoID4gMFxuICAgICAgPyB7XG4gICAgICAgICAgc3RlcHM6IHVzYWdlU3RlcHMsXG4gICAgICAgICAgc3VtbWFyeTogY29tcHV0ZVVzYWdlU3VtbWFyeSh1c2FnZVN0ZXBzKSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5zZXQoe1xuICAgIC4uLm1lc3NhZ2UsXG4gICAgY29tcGxldGVkQXQ6IERhdGUubm93KCksXG4gICAgdXNhZ2UsXG4gIH0pO1xuICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyByZXN1bHQ7XG4gIH1cblxuICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xufVxuXG5jb25zdCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuZnVuY3Rpb24gcG9sbEZvckludGVycnVwdCh7XG4gIHN0b3JhZ2UsXG4gIG1lc3NhZ2VJZCxcbiAgc2lnbmFsLFxuICBhYm9ydENvbnRyb2xsZXIsXG59OiB7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIG1lc3NhZ2VJZDogc3RyaW5nO1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xuICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbn0pOiB7XG4gIGZpcnN0Q2hlY2s6IFByb21pc2U8dm9pZD47XG4gIGludGVycnVwdGVkTGFzdFBhcnRSZWY6IHsgY3VycmVudDogeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH0gfCBudWxsIH07XG59IHtcbiAgbGV0IHJlc29sdmVGaXJzdENoZWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdCBmaXJzdENoZWNrID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICByZXNvbHZlRmlyc3RDaGVjayA9IHJlc29sdmU7XG4gIH0pO1xuICBjb25zdCBpbnRlcnJ1cHRlZExhc3RQYXJ0UmVmID0ge1xuICAgIGN1cnJlbnQ6IG51bGwgYXMgeyBpbmRleDogbnVtYmVyOyBwYXJ0OiB1bmtub3duIH0gfCBudWxsLFxuICB9O1xuXG4gIGNvbnN0IHBvbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGlzRmlyc3QgPSB0cnVlO1xuICAgIHdoaWxlICghc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCk7XG4gICAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbnRlcnJ1cHRlZEF0ICE9PSBudWxsKSB7XG4gICAgICAgIGludGVycnVwdGVkTGFzdFBhcnRSZWYuY3VycmVudCA9IG1lc3NhZ2UuaW50ZXJydXB0ZWRMYXN0UGFydDtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgcmVzb2x2ZUZpcnN0Q2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmVGaXJzdENoZWNrKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlRFUlJVUFRfUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHBvbGwoKTtcbiAgcmV0dXJuIHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RyZWFtVGV4dFN0ZXAoe1xuICBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gIGlucHV0LFxuICBldmVudCxcbiAgd3JpdGFibGUsXG4gIGxhc3RQYXJ0SW5kZXgsXG4gIHN0ZXBJbmRleE9mZnNldCxcbiAgZGlzY292ZXJlZFNraWxscyxcbn06IHtcbiAgYXNzaXN0YW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIGlucHV0OiBBZ2VudElucHV0O1xuICBldmVudDogQWdlbnRNZXNzYWdlSW5wdXQ7XG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbTtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICBzdGVwSW5kZXhPZmZzZXQ6IG51bWJlcjtcbiAgZGlzY292ZXJlZFNraWxsczogU2tpbGxTdW1tYXJ5W10gfCBudWxsO1xufSk6IFByb21pc2U8e1xuICBmaW5pc2hSZWFzb246IEZpbmlzaFJlYXNvbjtcbiAgbGFzdFBhcnRJbmRleDogbnVtYmVyO1xuICB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXTtcbiAgcGVuZGluZ0FwcHJvdmFsczogeyBhcHByb3ZhbElkOiBzdHJpbmc7IHRvb2xOYW1lOiBzdHJpbmcgfVtdO1xuICBtYXhTdGVwczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBkaXNjb3ZlcmVkU2tpbGxzOiBTa2lsbFN1bW1hcnlbXSB8IG51bGw7XG59PiB7XG4gIFwidXNlIHN0ZXBcIjtcblxuICBjb25zdCB7IGdldFN0b3JhZ2UgfSA9IGF3YWl0IGltcG9ydChcIi4vc3RvcmFnZS9jbGllbnRcIik7XG4gIGNvbnN0IHsgZ2V0U2FuZGJveCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zYW5kYm94XCIpO1xuXG4gIGNvbnN0IHJwYyA9IGlucHV0LnJwYztcbiAgY29uc3QgdGhyb3R0bGVkRW1pdFN0YXR1cyA9IGNyZWF0ZVRocm90dGxlZEVtaXRTdGF0dXMocnBjKTtcbiAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JhZ2UoeyBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsIHJwYyB9KTtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHBvbGxDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHsgZmlyc3RDaGVjaywgaW50ZXJydXB0ZWRMYXN0UGFydFJlZiB9ID0gcG9sbEZvckludGVycnVwdCh7XG4gICAgc3RvcmFnZSxcbiAgICBtZXNzYWdlSWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICBzaWduYWw6IHBvbGxDb250cm9sbGVyLnNpZ25hbCxcbiAgICBhYm9ydENvbnRyb2xsZXIsXG4gIH0pO1xuXG4gIGNvbnN0IFtcbiAgICAsXG4gICAgbWVzc2FnZXNSZXN1bHQsXG4gICAgcGFydHNSZXN1bHQsXG4gICAgeyBzZXNzaW9uLCBzYW5kYm94LCBzYW5kYm94UmVjb3JkIH0sXG4gICAgYXBpVG9vbHNNZXRhZGF0YSxcbiAgXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmaXJzdENoZWNrLFxuICAgIHN0b3JhZ2UubWVzc2FnZS5saXN0KGlucHV0LnNlc3Npb25JZCksXG4gICAgc3RvcmFnZS5wYXJ0Lmxpc3RCeVNlc3Npb24oaW5wdXQuc2Vzc2lvbklkKSxcbiAgICBzdG9yYWdlLnNlc3Npb24uZ2V0KGlucHV0LnNlc3Npb25JZCkudGhlbihhc3luYyAoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBzZXNzaW9uO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IHNlc3Npb24uc2FuZGJveElkXG4gICAgICAgID8gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChzZXNzaW9uLnNhbmRib3hJZClcbiAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBzYW5kYm94UmVjb3JkO1xuICAgICAgfVxuICAgICAgaWYgKCFzYW5kYm94UmVjb3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgIGBTYW5kYm94IG5vdCBmb3VuZCBmb3Igc2Vzc2lvbiAke2lucHV0LnNlc3Npb25JZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94ID0gZ2V0U2FuZGJveCh7XG4gICAgICAgIHNhbmRib3hSZWNvcmQsXG4gICAgICAgIHN0b3JhZ2VDb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIHJwYyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBzZXNzaW9uLCBzYW5kYm94LCBzYW5kYm94UmVjb3JkIH07XG4gICAgfSksXG4gICAgZmV0Y2hBcGlUb29sc01ldGFkYXRhKHtcbiAgICAgIHJwYyxcbiAgICB9KSxcbiAgXSk7XG5cbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHBvbGxDb250cm9sbGVyLmFib3J0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIgYXMgRmluaXNoUmVhc29uLFxuICAgICAgbGFzdFBhcnRJbmRleCxcbiAgICAgIHVzYWdlU3RlcHM6IFtdLFxuICAgICAgcGVuZGluZ0FwcHJvdmFsczogW10sXG4gICAgICBtYXhTdGVwczogdW5kZWZpbmVkLFxuICAgICAgZGlzY292ZXJlZFNraWxscyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG1lc3NhZ2VzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICB0aHJvdyBtZXNzYWdlc1Jlc3VsdDtcbiAgfVxuICBpZiAocGFydHNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHRocm93IHBhcnRzUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGZpcnN0IGl0ZXJhdGlvbiwgbWFyayBhbGwgbWVzc2FnZXMgaW4gdGhpcyBiYXRjaCBhcyBzdGFydGVkLlxuICAgKiBVc2VyIG1lc3NhZ2VzIGFyZSBhbHNvIG1hcmtlZCBhcyBjb21wbGV0ZWQgKHRoZXkncmUgZG9uZSkuXG4gICAqIFRoZSBhc3Npc3RhbnQgbWVzc2FnZSBpcyBvbmx5IG1hcmtlZCBhcyBzdGFydGVkIChzdHJlYW1pbmcgaW4gcHJvZ3Jlc3MpLlxuICAgKi9cbiAgY29uc3Qgc2V0U3RhcnRlZFByb21pc2UgPVxuICAgIGxhc3RQYXJ0SW5kZXggPT09IDBcbiAgICAgID8gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmdNZXNzYWdlcyA9IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChtKSA9PiBtLmNyZWF0ZWRBdCA8PSBldmVudC5jcmVhdGVkQXQgJiYgbS5zdGFydGVkQXQgPT09IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwZW5kaW5nTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBwZW5kaW5nTWVzc2FnZXMubWFwKChtKSA9PlxuICAgICAgICAgICAgICAgIHN0b3JhZ2UubWVzc2FnZS5zZXQoe1xuICAgICAgICAgICAgICAgICAgLi4ubSxcbiAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiA/IG51bGwgOiBub3csXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgIDogbnVsbDtcblxuICAvLyBNdXRhYmxlIHJlZiBzbyBvblN1YlRvb2xDYWxsIGNhbiB3cml0ZSB0byB0aGUgc3RyZWFtIG9uY2UgYXZhaWxhYmxlXG4gIGNvbnN0IHN0cmVhbVdyaXRlclJlZjoge1xuICAgIGN1cnJlbnQ6ICgoZXZlbnQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbDtcbiAgfSA9IHsgY3VycmVudDogbnVsbCB9O1xuXG4gIGNvbnN0IHN1YlRvb2xQYXJ0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAvLyBTaGFyZWQgY291bnRlciBmb3IgcGFydCBpbmRpY2VzIFx1MjAxNCBzdWItdG9vbCBwYXJ0cyBpbmNyZW1lbnQgdGhpcyBkdXJpbmdcbiAgLy8gdGhlIHN0cmVhbSwgdGhlbiBzdGVwUGFydHMgY29udGludWUgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi5cbiAgbGV0IG5leHRQYXJ0SW5kZXggPSBsYXN0UGFydEluZGV4O1xuXG4gIGNvbnN0IG9uU3ViVG9vbENhbGw6IE9uU3ViVG9vbENhbGwgPSBhc3luYyAodG9vbE5hbWUsIHRvb2xJbnB1dCwgZXhlY3V0ZSkgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgdG9vbCBuZWVkcyBhcHByb3ZhbCB2aWEgUlBDXG4gICAgY29uc3QgcmVzID0gYXdhaXQgcnBjKHtcbiAgICAgIG1ldGhvZDogXCJ0b29scy5uZWVkc0FwcHJvdmFsXCIsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIGlucHV0OiB0b29sSW5wdXQsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBqc18ke3Rvb2xOYW1lfV8ke0RhdGUubm93KCl9YCxcbiAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChcImVycm9yXCIgaW4gcmVzIHx8IHJlcy5yZXN1bHQgIT09IHRydWUpIHtcbiAgICAgIC8vIE5vIGFwcHJvdmFsIG5lZWRlZCBcdTIwMTQganVzdCBleGVjdXRlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlKCk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHByb3ZhbCBuZWVkZWQgXHUyMDE0IHN1cmZhY2UgdG8gdXNlciB2aWEgc3RyZWFtIGV2ZW50c1xuICAgIGNvbnN0IGFwcHJvdmFsSWQgPSBganNfYXBwcm92YWxfJHt1bGlkKCl9YDtcbiAgICBjb25zdCB0b29sQ2FsbElkID0gYGpzX3RjXyR7dWxpZCgpfWA7XG4gICAgY29uc3QgcGFydElkID0gYHBhcnRfJHt1bGlkKCl9YDtcbiAgICBzdWJUb29sUGFydElkcy5wdXNoKHBhcnRJZCk7XG5cbiAgICAvLyBTdG9yZSBhcHByb3ZhbC1yZXF1ZXN0IHBhcnRcbiAgICBhd2FpdCBzdG9yYWdlLnBhcnQuc2V0KHtcbiAgICAgIGlkOiBwYXJ0SWQsXG4gICAgICBpbmRleDogbmV4dFBhcnRJbmRleCsrLFxuICAgICAgbWVzc2FnZUlkOiBhc3Npc3RhbnRNZXNzYWdlSWQsXG4gICAgICBzZXNzaW9uSWQ6IGlucHV0LnNlc3Npb25JZCxcbiAgICAgIHBhcnQ6IHtcbiAgICAgICAgdHlwZTogYHRvb2wtJHt0b29sTmFtZX1gLFxuICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIixcbiAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVSU1lc3NhZ2VbXCJwYXJ0c1wiXVtudW1iZXJdLFxuICAgIH0pO1xuXG4gICAgLy8gV3JpdGUgc3RyZWFtIGV2ZW50cyBmb3IgdGhlIFVJXG4gICAgLy8gdG9vbC1pbnB1dC1zdGFydCBpcyByZXF1aXJlZCBcdTIwMTQgdGhlIEFJIFNESyBjbGllbnQgY3JlYXRlcyB0aGUgdG9vbCBwYXJ0XG4gICAgLy8gd2hlbiBpdCBzZWVzIHRoaXMgZXZlbnQuIFdpdGhvdXQgaXQsIHN1YnNlcXVlbnQgZXZlbnRzIGFyZSBpZ25vcmVkLlxuICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWUsXG4gICAgfSk7XG4gICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICB0eXBlOiBcInRvb2wtaW5wdXQtYXZhaWxhYmxlXCIsXG4gICAgICB0b29sQ2FsbElkLFxuICAgICAgdG9vbE5hbWUsXG4gICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgIH0pO1xuICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIixcbiAgICAgIGFwcHJvdmFsSWQsXG4gICAgICB0b29sQ2FsbElkLFxuICAgIH0pO1xuXG4gICAgLy8gUG9sbCBzdG9yYWdlIGZvciBhcHByb3ZhbCByZXNwb25zZVxuICAgIGNvbnN0IFBPTExfTVMgPSA1MDA7XG4gICAgY29uc3QgVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IFRJTUVPVVRfTVMgJiYgIWFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3QgcGFydHMgPSBhd2FpdCBzdG9yYWdlLnBhcnQubGlzdEJ5U2Vzc2lvbihpbnB1dC5zZXNzaW9uSWQpO1xuICAgICAgaWYgKCEocGFydHMgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHBhcnRzLml0ZW1zLmZpbmQoXG4gICAgICAgICAgKHApID0+XG4gICAgICAgICAgICBwLmlkID09PSBwYXJ0SWQgJiZcbiAgICAgICAgICAgIFwic3RhdGVcIiBpbiBwLnBhcnQgJiZcbiAgICAgICAgICAgICgocC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXNwb25kZWRcIiB8fFxuICAgICAgICAgICAgICAocC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9PT0gXCJvdXRwdXQtZGVuaWVkXCIpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSAodXBkYXRlZC5wYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gXCJvdXRwdXQtZGVuaWVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9ICh1cGRhdGVkLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgcmVhc29uPzogc3RyaW5nIH0gfSlcbiAgICAgICAgICAgICAgLmFwcHJvdmFsPy5yZWFzb247XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHtyZWFzb24gfHwgXCJ1c2VyIGRlbmllZFwifWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsID0gKFxuICAgICAgICAgICAgdXBkYXRlZC5wYXJ0IGFzIHtcbiAgICAgICAgICAgICAgYXBwcm92YWw/OiB7IGFwcHJvdmVkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLmFwcHJvdmFsO1xuICAgICAgICAgIGlmIChhcHByb3ZhbD8uYXBwcm92ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIG91dHB1dDogcmVzdWx0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHN0cmVhbVdyaXRlclJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZXJyb3JcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgIGVycm9yVGV4dDogZXJyb3IsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZW5pZWRcbiAgICAgICAgICBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1vdXRwdXQtZGVuaWVkXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogYFRvb2wgXCIke3Rvb2xOYW1lfVwiIGRlbmllZDogJHthcHByb3ZhbD8ucmVhc29uIHx8IFwidXNlciBkZW5pZWRcIn1gLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIFBPTExfTVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICA/IFwiaW50ZXJydXB0ZWRcIlxuICAgICAgICA6IFwiQXBwcm92YWwgdGltZWQgb3V0XCIsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBza2lsbHNSZWY6IHsgY3VycmVudDogU2tpbGxTdW1tYXJ5W10gfSA9IHtcbiAgICBjdXJyZW50OiBkaXNjb3ZlcmVkU2tpbGxzID8/IFtdLFxuICB9O1xuXG4gIGNvbnN0IHJhd1Rvb2xzID0gZ2V0VG9vbHMoe1xuICAgIGlucHV0LFxuICAgIGV2ZW50LFxuICAgIHNhbmRib3gsXG4gICAgc2Vzc2lvbixcbiAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQsXG4gICAgc2tpbGxzUmVmLFxuICAgIGFwaVRvb2xzTWV0YWRhdGEsXG4gICAgb25TdWJUb29sQ2FsbCxcbiAgfSk7XG5cbiAgaWYgKCFzZXNzaW9uLm1vZGVsKSB7XG4gICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXCJTZXNzaW9uIG1vZGVsIGlzIG5vdCBzZXRcIik7XG4gIH1cblxuICBjb25zdCBhbGxQYXJ0cyA9IHBhcnRzUmVzdWx0Lml0ZW1zO1xuICBjb25zdCB1c2FnZVN0ZXBzOiBTdGVwVXNhZ2VbXSA9IFtdO1xuICBsZXQgaW50ZXJuYWxTdGVwSW5kZXggPSAwO1xuXG4gIGNvbnN0IHRvb2xzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHJhd1Rvb2xzKS5tYXAoKFtuYW1lLCB0XSkgPT4gW1xuICAgICAgbmFtZSxcbiAgICAgIHtcbiAgICAgICAgLi4udCxcbiAgICAgICAgbmVlZHNBcHByb3ZhbDogYXN5bmMgKFxuICAgICAgICAgIHRvb2xJbnB1dDogdW5rbm93bixcbiAgICAgICAgICBvcHRzOiB7IHRvb2xDYWxsSWQ6IHN0cmluZzsgbWVzc2FnZXM6IHVua25vd25bXSB9XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJwYyh7XG4gICAgICAgICAgICBtZXRob2Q6IFwidG9vbHMubmVlZHNBcHByb3ZhbFwiLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHRvb2xOYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgICB0b29sQ2FsbElkOiBvcHRzLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBvcHRzLm1lc3NhZ2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgdG9vbHMubmVlZHNBcHByb3ZhbCBSUEMgZmFpbGVkIGZvciAke25hbWV9OiAke3Jlcy5lcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMucmVzdWx0IGFzIGJvb2xlYW47XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0ID0gc3RyZWFtVGV4dCh7XG4gICAgLy8gUGxhY2Vob2xkZXIgdG8gcGFzcyB2YWxpZGF0aW9uIFx1MjAxNCBwcmVwYXJlU3RlcCByZXBsYWNlcyBtZXNzYWdlcyBlbnRpcmVseS5cbiAgICBtZXNzYWdlczogW3sgcm9sZTogXCJ1c2VyXCIgYXMgY29uc3QsIGNvbnRlbnQ6IFwiLlwiIH1dLFxuICAgIHRvb2xzLFxuICAgIG1vZGVsOiBzZXNzaW9uLm1vZGVsLFxuICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIHN0b3BXaGVuOiBzdGVwQ291bnRJcygxKSxcbiAgICB0ZW1wZXJhdHVyZTogc2Vzc2lvbi5nZW5lcmF0aW9uPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BLOiBzZXNzaW9uLmdlbmVyYXRpb24/LnRvcEssXG4gICAgdG9wUDogc2Vzc2lvbi5nZW5lcmF0aW9uPy50b3BQLFxuICAgIGZyZXF1ZW5jeVBlbmFsdHk6IHNlc3Npb24uZ2VuZXJhdGlvbj8uZnJlcXVlbmN5UGVuYWx0eSxcbiAgICBwcmVzZW5jZVBlbmFsdHk6IHNlc3Npb24uZ2VuZXJhdGlvbj8ucHJlc2VuY2VQZW5hbHR5LFxuICAgIG1heE91dHB1dFRva2Vuczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5tYXhPdXRwdXRUb2tlbnMsXG4gICAgaGVhZGVyczogc2Vzc2lvbi5nZW5lcmF0aW9uPy5oZWFkZXJzLFxuICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB7XG4gICAgICBzZXNzaW9uLFxuICAgICAgc2FuZGJveCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBjb250ZXh0OiBldmVudC5jb250ZXh0LFxuICAgIH0sXG4gICAgcHJlcGFyZVN0ZXA6IGFzeW5jICh7IG1vZGVsIH0pID0+IHtcbiAgICAgIGlmIChsYXN0UGFydEluZGV4ID09PSAwKSB7XG4gICAgICAgIC8vIE9ubHkgc2hvdyBzYW5kYm94IHN0YXR1cyBvbiB0aGUgZmlyc3QgYXNzaXN0YW50IG1lc3NhZ2UuXG4gICAgICAgIC8vIElmIGFub3RoZXIgYXNzaXN0YW50IG1lc3NhZ2UgaGFzIGFscmVhZHkgc3RhcnRlZCwgdGhlIHNhbmRib3hcbiAgICAgICAgLy8gaXMgd2FybSBhbmQgZG9lc24ndCBuZWVkIGFuIGluZGljYXRvci5cbiAgICAgICAgY29uc3QgaXNGaXJzdEFzc2lzdGFudE1lc3NhZ2UgPSAhbWVzc2FnZXNSZXN1bHQuaXRlbXMuc29tZShcbiAgICAgICAgICAobSkgPT5cbiAgICAgICAgICAgIG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJlxuICAgICAgICAgICAgbS5pZCAhPT0gYXNzaXN0YW50TWVzc2FnZUlkICYmXG4gICAgICAgICAgICBtLnN0YXJ0ZWRBdCAhPT0gbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNGaXJzdEFzc2lzdGFudE1lc3NhZ2UgJiYgc2FuZGJveC5fc2V0dXBNZXRhKSB7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IHNhbmRib3guX3NldHVwTWV0YTtcbiAgICAgICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgICAgICAgIHdyaXRlcjogc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQsXG4gICAgICAgICAgICBzdGF0dXM6IG1ldGEubmVlZHNTZXR1cFJ1blxuICAgICAgICAgICAgICA/IHsgdHlwZTogXCJzYW5kYm94LXNldHVwLWNvbGRcIiB9XG4gICAgICAgICAgICAgIDogeyB0eXBlOiBcInNhbmRib3gtc2V0dXBcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW5kYm94Ll9vblJlYWR5KSB7XG4gICAgICAgICAgYXdhaXQgc2FuZGJveC5fb25SZWFkeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlzY292ZXJlZFNraWxscykge1xuICAgICAgICAgIGNvbnN0IHNraWxsc0RpcnMgPSBzZXNzaW9uLnNraWxsc0Rpcj8ubGVuZ3RoID8gc2Vzc2lvbi5za2lsbHNEaXIgOiBbXTtcbiAgICAgICAgICBpZiAoc2tpbGxzRGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBza2lsbHNSZWYuY3VycmVudCA9IGF3YWl0IGRpc2NvdmVyU2tpbGxzSW5TYW5kYm94KHtcbiAgICAgICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICAgICAgc2tpbGxzRGlycyxcbiAgICAgICAgICAgICAgZGVidWc6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSBhcHByb3ZlZCB0b29scyBzbyB0aGUgbW9kZWwgc2VlcyBjb21wbGV0ZSB0b29sIGNhbGwgKyByZXN1bHRcbiAgICAgIC8vIHBhaXJzLiBUaGlzIHJ1bnMgb3V0c2lkZSB0aGUgbGFzdFBhcnRJbmRleCA9PT0gMCBnYXRlIGJlY2F1c2VcbiAgICAgIC8vIGFwcHJvdmFscyBhcnJpdmUgb24gc3Vic2VxdWVudCBtZXNzYWdlcyAobGFzdFBhcnRJbmRleCA+IDApLlxuICAgICAgY29uc3QgYXBwcm92ZWRQYXJ0cyA9IGFsbFBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgcC5wYXJ0ICYmXG4gICAgICAgICAgXCJzdGF0ZVwiIGluIHAucGFydCAmJlxuICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlc3BvbmRlZFwiICYmXG4gICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgIChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgYXBwcm92ZWQ6IGJvb2xlYW4gfSB9KS5hcHByb3ZhbFxuICAgICAgICAgICAgPy5hcHByb3ZlZCA9PT0gdHJ1ZVxuICAgICAgKTtcblxuICAgICAgaWYgKGFwcHJvdmVkUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgICAgICB3cml0ZXI6IHN0cmVhbVdyaXRlclJlZi5jdXJyZW50LFxuICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcInByb2Nlc3NpbmctYXBwcm92YWxzXCIgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcHJlRXhlY01lc3NhZ2VzID0gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyhcbiAgICAgICAgICBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLFxuICAgICAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICAgICAgdW50aWw6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIGluY2x1ZGVRdWV1ZWQ6IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHsgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYXBwcm92ZWRQYXJ0cy5tYXAoYXN5bmMgKGFwKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFwLnBhcnQudHlwZS5zdGFydHNXaXRoKFwidG9vbC1cIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFydCA9IGFwLnBhcnQgYXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgVUlNZXNzYWdlW1wicGFydHNcIl1bbnVtYmVyXSxcbiAgICAgICAgICAgICAgeyB0eXBlOiBgdG9vbC0ke3N0cmluZ31gIH1cbiAgICAgICAgICAgID47XG4gICAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IHBhcnQudHlwZS5yZXBsYWNlKFwidG9vbC1cIiwgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB0b29sRGVmID0gcmF3VG9vbHNbdG9vbE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAodG9vbERlZj8uZXhlY3V0ZSAmJiBwYXJ0LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sT3V0cHV0ID0gYXdhaXQgdG9vbERlZi5leGVjdXRlKHBhcnQuaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBwcmVFeGVjTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGV2ZW50LmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcnQuc3RhdGUgPSBcIm91dHB1dC1hdmFpbGFibGVcIjtcbiAgICAgICAgICAgICAgICBwYXJ0Lm91dHB1dCA9IHRvb2xPdXRwdXQ7XG4gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgb3V0cHV0OiB0b29sT3V0cHV0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwYXJ0LnN0YXRlID0gXCJvdXRwdXQtZXJyb3JcIjtcbiAgICAgICAgICAgICAgICBwYXJ0LmVycm9yVGV4dCA9XG4gICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtb3V0cHV0LWVycm9yXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBlcnJvclRleHQ6IHBhcnQuZXJyb3JUZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoeyAuLi5hcCwgcGFydCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aHJvdHRsZWRFbWl0U3RhdHVzKHtcbiAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwidGhpbmtpbmdcIiB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNraWxsc0NvbnRleHQgPSBidWlsZFNraWxsc0NvbnRleHQoc2tpbGxzUmVmLmN1cnJlbnQpO1xuICAgICAgY29uc3Qgc3lzdGVtSGVhZGVyID0gam9pblByb21wdFNlY3Rpb25zKFxuICAgICAgICBCQVNFX1NZU1RFTV9QUk9NUFQsXG4gICAgICAgIHNlc3Npb24uc3lzdGVtXG4gICAgICApO1xuICAgICAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IGpvaW5Qcm9tcHRTZWN0aW9ucyhza2lsbHNDb250ZXh0KTtcbiAgICAgIGNvbnN0IHN5c3RlbU1lc3NhZ2VzID0gW1xuICAgICAgICAuLi4oc3lzdGVtSGVhZGVyLnRyaW0oKVxuICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtSGVhZGVyIH1dXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihzeXN0ZW1Db250ZXh0LnRyaW0oKVxuICAgICAgICAgID8gW3sgcm9sZTogXCJzeXN0ZW1cIiBhcyBjb25zdCwgY29udGVudDogc3lzdGVtQ29udGV4dCB9XVxuICAgICAgICAgIDogW10pLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdWlNZXNzYWdlcyA9IGFzc2VtYmxlVUlNZXNzYWdlcyh7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgcGFydHM6IGFsbFBhcnRzLFxuICAgICAgICB1bnRpbDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBpbmNsdWRlUXVldWVkOiB0cnVlLFxuICAgICAgICBleGNsdWRlU3ViVG9vbFBhcnRzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vZGVsTWVzc2FnZXMgPSBbXG4gICAgICAgIC4uLnN5c3RlbU1lc3NhZ2VzLFxuICAgICAgICAuLi4oYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyh1aU1lc3NhZ2VzLCB7XG4gICAgICAgICAgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSxcbiAgICAgICAgfSkpLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgcHJvbXB0Q2FjaGluZyA9IGFwcGx5UHJvbXB0Q2FjaGluZ1RvTW9kZWxSZXF1ZXN0KHtcbiAgICAgICAgbW9kZWw6IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IG1vZGVsIDogbW9kZWwubW9kZWxJZCxcbiAgICAgICAgc2Vzc2lvbklkOiBpbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBtb2RlbE1lc3NhZ2VzLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhY3RpdmVUb29scyA9IHNlc3Npb24uYWN0aXZlVG9vbHMgPz8gdW5kZWZpbmVkO1xuICAgICAgaWYgKHNraWxsc1JlZi5jdXJyZW50Lmxlbmd0aCA9PT0gMCAmJiBhY3RpdmVUb29scykge1xuICAgICAgICBhY3RpdmVUb29scyA9IGFjdGl2ZVRvb2xzLmZpbHRlcihcbiAgICAgICAgICAodCkgPT4gdCAhPT0gKFwiU2tpbGxcIiBzYXRpc2ZpZXMgQnVpbHRJblRvb2xOYW1lKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlczogcHJvbXB0Q2FjaGluZy5tZXNzYWdlcyxcbiAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwcm9tcHRDYWNoaW5nLnByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgYWN0aXZlVG9vbHMsXG4gICAgICB9O1xuICAgIH0sXG4gICAgb25TdGVwRmluaXNoOiAoeyB1c2FnZSB9KSA9PiB7XG4gICAgICBpZiAodXNhZ2UpIHtcbiAgICAgICAgdXNhZ2VTdGVwcy5wdXNoKHtcbiAgICAgICAgICBzdGVwSW5kZXg6IHN0ZXBJbmRleE9mZnNldCArIGludGVybmFsU3RlcEluZGV4LFxuICAgICAgICAgIG1vZGVsOiBzZXNzaW9uLm1vZGVsID8/IFwidW5rbm93blwiLFxuICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgdG90YWxUb2tlbnM6IHVzYWdlLnRvdGFsVG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOiB1c2FnZS5pbnB1dFRva2VuRGV0YWlscz8uY2FjaGVSZWFkVG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVXcml0ZVRva2VuczogdXNhZ2UuaW5wdXRUb2tlbkRldGFpbHM/LmNhY2hlV3JpdGVUb2tlbnMgPz8gMCxcbiAgICAgICAgICByZWFzb25pbmdUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VuRGV0YWlscz8ucmVhc29uaW5nVG9rZW5zID8/IDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW50ZXJuYWxTdGVwSW5kZXgrKztcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBzdGVwUGFydHM6IFVJTWVzc2FnZVtcInBhcnRzXCJdID0gW107XG4gIGxldCB3YXNBYm9ydGVkID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgZXhlY3V0ZTogKHsgd3JpdGVyIH0pID0+IHtcbiAgICAgICAgc3RyZWFtV3JpdGVyUmVmLmN1cnJlbnQgPSAoZXZlbnQ6IHVua25vd24pID0+XG4gICAgICAgICAgd3JpdGVyLndyaXRlKGV2ZW50IGFzIFBhcmFtZXRlcnM8dHlwZW9mIHdyaXRlci53cml0ZT5bMF0pO1xuXG4gICAgICAgIC8vIE1lcmdlIHRoZSBzdHJlYW1UZXh0IHN0cmVhbS4gcHJlcGFyZVN0ZXAgaGFuZGxlcyBzYW5kYm94IHNldHVwLFxuICAgICAgICAvLyBza2lsbHMgbG9hZGluZywgYXBwcm92YWwgZXhlY3V0aW9uLCBhbmQgc3RhdHVzIGVtaXNzaW9uIGJlZm9yZVxuICAgICAgICAvLyB0aGUgbW9kZWwgc3RhcnRzIGdlbmVyYXRpbmcuXG4gICAgICAgIHdyaXRlci5tZXJnZShcbiAgICAgICAgICByZXN1bHQudG9VSU1lc3NhZ2VTdHJlYW0oe1xuICAgICAgICAgICAgZ2VuZXJhdGVNZXNzYWdlSWQ6ICgpID0+IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIG9uRmluaXNoOiAoeyBtZXNzYWdlcyB9KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBoYXNBcHByb3ZhbHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgICAgICAgICAgICAgICAgc3RlcFBhcnRzLnB1c2goLi4ubS5wYXJ0cyk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgbS5wYXJ0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdGF0ZVwiIGluIHAgJiYgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc0FwcHJvdmFscyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhhc0FwcHJvdmFscykge1xuICAgICAgICAgICAgICAgIHRocm90dGxlZEVtaXRTdGF0dXMoe1xuICAgICAgICAgICAgICAgICAgd3JpdGVyOiBzdHJlYW1Xcml0ZXJSZWYuY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogeyB0eXBlOiBcIm5lZWRzLWFwcHJvdmFsXCIgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHN0cmVhbS5waXBlVG8od3JpdGFibGUsIHtcbiAgICAgIHByZXZlbnRDbG9zZTogdHJ1ZSxcbiAgICAgIHByZXZlbnRBYm9ydDogdHJ1ZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgd2FzQWJvcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcG9sbENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB0aHJvdHRsZWRFbWl0U3RhdHVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB3YXNBYm9ydGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RQYXJ0ID0gaW50ZXJydXB0ZWRMYXN0UGFydFJlZi5jdXJyZW50O1xuXG4gIGlmICh3YXNBYm9ydGVkKSB7XG4gICAgY29uc3QgdGVybWluYWxTdGF0ZXMgPSBuZXcgU2V0KFtcbiAgICAgIFwib3V0cHV0LWF2YWlsYWJsZVwiLFxuICAgICAgXCJvdXRwdXQtZXJyb3JcIixcbiAgICAgIFwib3V0cHV0LWRlbmllZFwiLFxuICAgICAgXCJkb25lXCIsXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHN0ZXBQYXJ0cykge1xuICAgICAgaWYgKFxuICAgICAgICBcInR5cGVcIiBpbiBwYXJ0ICYmXG4gICAgICAgIHR5cGVvZiBwYXJ0LnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcGFydC50eXBlLnN0YXJ0c1dpdGgoXCJ0b29sLVwiKSAmJlxuICAgICAgICBcInN0YXRlXCIgaW4gcGFydCAmJlxuICAgICAgICAhdGVybWluYWxTdGF0ZXMuaGFzKHBhcnQuc3RhdGUgYXMgc3RyaW5nKVxuICAgICAgKSB7XG4gICAgICAgIChwYXJ0IGFzIHsgc3RhdGU6IHN0cmluZyB9KS5zdGF0ZSA9IFwib3V0cHV0LWVycm9yXCI7XG4gICAgICAgIChwYXJ0IGFzIHsgZXJyb3JUZXh0Pzogc3RyaW5nIH0pLmVycm9yVGV4dCA9IFwiaW50ZXJydXB0ZWRcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGJhc2VQYXJ0SW5kZXggPSBuZXh0UGFydEluZGV4O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3RlcFBhcnRzLm1hcChhc3luYyAodWlQYXJ0LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYmFzZVBhcnRJbmRleCArIGk7XG4gICAgICAgIGlmIChsYXN0UGFydCAhPSBudWxsICYmIGluZGV4ID4gbGFzdFBhcnQuaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlQ2xpZW50UGFydCA9IGxhc3RQYXJ0ICE9IG51bGwgJiYgaW5kZXggPT09IGxhc3RQYXJ0LmluZGV4O1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdXNlQ2xpZW50UGFydCA/IGxhc3RQYXJ0LnBhcnQgOiB1aVBhcnQ7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UucGFydC5zZXQoe1xuICAgICAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIG1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgIHNlc3Npb25JZDogaW5wdXQuc2Vzc2lvbklkLFxuICAgICAgICAgIHBhcnQ6IGNvbnRlbnQgYXMgKHR5cGVvZiBzdGVwUGFydHMpW251bWJlcl0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBuZXh0UGFydEluZGV4ID1cbiAgICAgIGxhc3RQYXJ0ICE9IG51bGxcbiAgICAgICAgPyBNYXRoLm1pbihiYXNlUGFydEluZGV4ICsgc3RlcFBhcnRzLmxlbmd0aCwgbGFzdFBhcnQuaW5kZXggKyAxKVxuICAgICAgICA6IGJhc2VQYXJ0SW5kZXggKyBzdGVwUGFydHMubGVuZ3RoO1xuXG4gICAgaWYgKHNldFN0YXJ0ZWRQcm9taXNlKSB7XG4gICAgICBjb25zdCBzZXRTdGFydGVkUmVzdWx0ID0gYXdhaXQgc2V0U3RhcnRlZFByb21pc2U7XG4gICAgICBpZiAoc2V0U3RhcnRlZFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNldFN0YXJ0ZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG0gb2Ygc2V0U3RhcnRlZFJlc3VsdCA/PyBbXSkge1xuICAgICAgICBpZiAobSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgd2FzQWJvcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gc3RlcFBhcnRzXG4gICAgLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyB0eXBlb2YgcCAmIHsgYXBwcm92YWw6IHsgaWQ6IHN0cmluZyB9IH0gPT5cbiAgICAgICAgXCJzdGF0ZVwiIGluIHAgJiZcbiAgICAgICAgcC5zdGF0ZSA9PT0gXCJhcHByb3ZhbC1yZXF1ZXN0ZWRcIiAmJlxuICAgICAgICBcImFwcHJvdmFsXCIgaW4gcCAmJlxuICAgICAgICAhIShwIGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWRcbiAgICApXG4gICAgLm1hcCgocCkgPT4gKHtcbiAgICAgIGFwcHJvdmFsSWQ6IHAuYXBwcm92YWwuaWQsXG4gICAgICB0b29sTmFtZTogXCJ0eXBlXCIgaW4gcCA/IFN0cmluZyhwLnR5cGUpLnJlcGxhY2UoXCJ0b29sLVwiLCBcIlwiKSA6IFwidW5rbm93blwiLFxuICAgIH0pKTtcblxuICBjb25zdCBmaW5hbEZpbmlzaFJlYXNvbjogRmluaXNoUmVhc29uID1cbiAgICB3YXNBYm9ydGVkIHx8IGxhc3RQYXJ0ICE9IG51bGxcbiAgICAgID8gKFwic3RvcFwiIGFzIEZpbmlzaFJlYXNvbilcbiAgICAgIDogYXdhaXQgcmVzdWx0LmZpbmlzaFJlYXNvbjtcblxuICByZXR1cm4ge1xuICAgIGZpbmlzaFJlYXNvbjogZmluYWxGaW5pc2hSZWFzb24sXG4gICAgbGFzdFBhcnRJbmRleDogbmV4dFBhcnRJbmRleCxcbiAgICB1c2FnZVN0ZXBzLFxuICAgIHBlbmRpbmdBcHByb3ZhbHMsXG4gICAgbWF4U3RlcHM6IHNlc3Npb24uZ2VuZXJhdGlvbj8ubWF4U3RlcHMsXG4gICAgZGlzY292ZXJlZFNraWxsczogc2tpbGxzUmVmLmN1cnJlbnQsXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTa2lsbHNEaXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFBhcnNlZCBmcm9udG1hdHRlciBmcm9tIGEgU0tJTEwubWQgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGcm9udG1hdHRlciA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgWUFNTCBmcm9udG1hdHRlciBmcm9tIGEgU0tJTEwubWQgZmlsZSBjb250ZW50LlxuICogRnJvbnRtYXR0ZXIgbXVzdCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIGRlbGltaXRlZCBieSBgLS0tYCBtYXJrZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBtYXJrZG93blxuICogLS0tXG4gKiBuYW1lOiBjc3ZcbiAqIGRlc2NyaXB0aW9uOiBBbmFseXplIENTViBkYXRhXG4gKiAtLS1cbiAqICMgQ1NWIFNraWxsXG4gKiAuLi5cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBuYW1lIGFuZCBkZXNjcmlwdGlvbiwgb3IgbnVsbCBpZiBmcm9udG1hdHRlciBpcyBtaXNzaW5nL2ludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2tpbGxGcm9udG1hdHRlcihcbiAgY29udGVudDogc3RyaW5nXG4pOiBTa2lsbEZyb250bWF0dGVyIHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb250ZW50LnRyaW0oKTtcblxuICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChcIi0tLVwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZW5kTWFya2VySW5kZXggPSB0cmltbWVkLmluZGV4T2YoXCItLS1cIiwgMyk7XG4gIGlmIChlbmRNYXJrZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZyb250bWF0dGVyQmxvY2sgPSB0cmltbWVkLnNsaWNlKDMsIGVuZE1hcmtlckluZGV4KS50cmltKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2ltcGxlWWFtbChmcm9udG1hdHRlckJsb2NrKTtcblxuICBpZiAoIShwYXJzZWQubmFtZSAmJiBwYXJzZWQuZGVzY3JpcHRpb24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFN0cmluZyhwYXJzZWQubmFtZSksXG4gICAgZGVzY3JpcHRpb246IFN0cmluZyhwYXJzZWQuZGVzY3JpcHRpb24pLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBzaW1wbGUgWUFNTCBrZXktdmFsdWUgcGFpcnMgKHNpbmdsZS1saW5lIHZhbHVlcyBvbmx5KS5cbiAqIFRoaXMgYXZvaWRzIGFkZGluZyBhIGZ1bGwgWUFNTCBwYXJzZXIgZGVwZW5kZW5jeSBmb3IgYmFzaWMgZnJvbnRtYXR0ZXIuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2ltcGxlWWFtbCh5YW1sOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHlhbWwuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9uSW5kZXggPSB0cmltbWVkTGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRyaW1tZWRMaW5lLnNsaWNlKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTtcbiAgICBsZXQgdmFsdWUgPSB0cmltbWVkTGluZS5zbGljZShjb2xvbkluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgLy8gUmVtb3ZlIHN1cnJvdW5kaW5nIHF1b3RlcyBpZiBwcmVzZW50XG4gICAgaWYgKFxuICAgICAgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpIHx8XG4gICAgICAodmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsdWUuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgc2tpbGxzRGlyIHRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTa2lsbHNEaXJzKHNraWxsc0Rpcj86IFNraWxsc0Rpcik6IHN0cmluZ1tdIHtcbiAgaWYgKCFza2lsbHNEaXIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2tpbGxzRGlyKSA/IHNraWxsc0RpciA6IFtza2lsbHNEaXJdO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgeyBwYXJzZVNraWxsRnJvbnRtYXR0ZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBEaXNjb3ZlcnMgc2tpbGxzIGZyb20gZGlyZWN0b3JpZXMgaW5zaWRlIHRoZSBzYW5kYm94IGJ5IGZpbmRpbmcgYW5kIHBhcnNpbmcgU0tJTEwubWQgZmlsZXMuXG4gKiBTY2FucyBlYWNoIGRpcmVjdG9yeSBmb3Igc3ViZGlyZWN0b3JpZXMgY29udGFpbmluZyBTS0lMTC5tZCwgZXh0cmFjdHMgZnJvbnRtYXR0ZXIgbWV0YWRhdGEsXG4gKiBhbmQgcmV0dXJucyBzdW1tYXJpZXMgZm9yIHVzZSBpbiB0aGUgc3lzdGVtIHByb21wdC5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBza2lsbCBzdW1tYXJpZXMgKGRlZHVwbGljYXRlZCBieSBuYW1lLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luU2FuZGJveChvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsc0RpcnM6IHN0cmluZ1tdO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxTa2lsbFN1bW1hcnlbXT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsc0RpcnMsIGRlYnVnIH0gPSBvcHRzO1xuXG4gIGNvbnN0IHN1bW1hcmllczogU2tpbGxTdW1tYXJ5W10gPSBbXTtcbiAgY29uc3Qgc2Vlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBza2lsbHNEaXIgb2Ygc2tpbGxzRGlycykge1xuICAgIGNvbnN0IGRpclN1bW1hcmllcyA9IGF3YWl0IGRpc2NvdmVyU2tpbGxzSW5EaXJlY3Rvcnkoe1xuICAgICAgc2FuZGJveCxcbiAgICAgIHNraWxsc0RpcixcbiAgICAgIGRlYnVnLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIGRpclN1bW1hcmllcykge1xuICAgICAgaWYgKCFzZWVuTmFtZXMuaGFzKHN1bW1hcnkubmFtZSkpIHtcbiAgICAgICAgc2Vlbk5hbWVzLmFkZChzdW1tYXJ5Lm5hbWUpO1xuICAgICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNjb3ZlclNraWxsc0luRGlyZWN0b3J5KG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPFNraWxsU3VtbWFyeVtdPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9ID0gb3B0cztcbiAgY29uc3Qgc2tpbGxQYXRocyA9IGF3YWl0IGZpbmRTa2lsbEZpbGVzKHsgc2FuZGJveCwgc2tpbGxzRGlyLCBkZWJ1ZyB9KTtcblxuICBpZiAoc2tpbGxQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXM6IFNraWxsU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBza2lsbE1kUGF0aCBvZiBza2lsbFBhdGhzKSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGF3YWl0IHBhcnNlU2tpbGxGaWxlKHsgc2FuZGJveCwgc2tpbGxNZFBhdGgsIGRlYnVnIH0pO1xuICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICBzdW1tYXJpZXMucHVzaChzdW1tYXJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kU2tpbGxGaWxlcyhvcHRzOiB7XG4gIHNhbmRib3g6IFNhbmRib3g7XG4gIHNraWxsc0Rpcjogc3RyaW5nO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHNhbmRib3gsIHNraWxsc0RpciwgZGVidWcgfSA9IG9wdHM7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJmaW5kXCIsXG4gICAgYXJnczogW3NraWxsc0RpciwgXCItbmFtZVwiLCBcIlNLSUxMLm1kXCIsIFwiLXR5cGVcIiwgXCJmXCJdLFxuICB9KTtcblxuICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIEZhaWxlZCB0byBzY2FuIHNraWxscyBkaXJlY3RvcnkgXCIke3NraWxsc0Rpcn1cIjogJHtleGVjUmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGUgfSA9IGF3YWl0IGV4ZWNSZXN1bHQucmVzdWx0O1xuICBpZiAoZGVidWcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbZGlzY292ZXJdIGZpbmQgcmVzdWx0OiBleGl0Q29kZT0ke2V4aXRDb2RlfSwgc3Rkb3V0PVwiJHtzdGRvdXQudHJpbSgpfVwiLCBzdGRlcnI9XCIke3N0ZGVyci50cmltKCl9XCJgXG4gICAgKTtcbiAgfVxuXG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Rpc2NvdmVyXSBTa2lsbHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBpbmFjY2Vzc2libGU6ICR7c2tpbGxzRGlyfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gc3Rkb3V0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMCk7XG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFwiW2Rpc2NvdmVyXSBGb3VuZCBza2lsbCBwYXRoczpcIiwgcGF0aHMpO1xuICB9XG4gIHJldHVybiBwYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VTa2lsbEZpbGUob3B0czoge1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBza2lsbE1kUGF0aDogc3RyaW5nO1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxTa2lsbFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2tpbGxNZFBhdGgsIGRlYnVnIH0gPSBvcHRzO1xuICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICBjb21tYW5kOiBcImNhdFwiLFxuICAgIGFyZ3M6IFtza2lsbE1kUGF0aF0sXG4gIH0pO1xuXG4gIGlmIChleGVjUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtkaXNjb3Zlcl0gRmFpbGVkIHRvIHJlYWQgc2tpbGwgZmlsZSBcIiR7c2tpbGxNZFBhdGh9XCI6ICR7ZXhlY1Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGRvdXQsIGV4aXRDb2RlIH0gPSBhd2FpdCBleGVjUmVzdWx0LnJlc3VsdDtcblxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2Rpc2NvdmVyXSBDb3VsZCBub3QgcmVhZCBza2lsbCBmaWxlOiAke3NraWxsTWRQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihzdGRvdXQpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZGlzY292ZXJdIEludmFsaWQgb3IgbWlzc2luZyBmcm9udG1hdHRlciBpbjogJHtza2lsbE1kUGF0aH1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgZGVzY3JpcHRpb246IHBhcnNlZC5kZXNjcmlwdGlvbixcbiAgICBza2lsbE1kUGF0aCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBqc29uU2NoZW1hLCB0eXBlIFRvb2xTZXQsIHRvb2wgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50SW5wdXQsIEFnZW50TWVzc2FnZUlucHV0IH0gZnJvbSBcIi4uL2FnZW50LXdvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IFJwY1BheWxvYWQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuLi9zYW5kYm94XCI7XG5pbXBvcnQgeyBERUZBVUxUX1dBSVRfVU5USUwgfSBmcm9tIFwiLi4vc2FuZGJveC9wcm9jZXNzLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU2tpbGxTdW1tYXJ5IH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94UmVjb3JkLCBTZXNzaW9uLCBTdG9yYWdlIH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IGNyZWF0ZUphdmFTY3JpcHRUb29sLCB0eXBlIE9uU3ViVG9vbENhbGwgfSBmcm9tIFwiLi9qYXZhc2NyaXB0XCI7XG5cbmNvbnN0IEFHRU5UX1BST1RPQ09MX1ZFUlNJT04gPSBcInYxXCI7XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPCAxMDI0KSB7XG4gICAgcmV0dXJuIGAke2J5dGVzfWA7XG4gIH1cbiAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKX1LYDtcbiAgfVxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCAqIDEwMjQpIHtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX1NYDtcbiAgfVxuICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSl9R2A7XG59XG5cbnR5cGUgSW50ZXJuYWxUb29sQ29udGV4dCA9IHtcbiAgaW5wdXQ6IEFnZW50SW5wdXQ7XG4gIGV2ZW50OiBBZ2VudE1lc3NhZ2VJbnB1dDtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgLyoqIFJlZiBwb3B1bGF0ZWQgaW4gcHJlcGFyZVN0ZXAgd2hlbiBza2lsbHNEaXIgaXMgc2V0OyBTa2lsbCB0b29sIHJlYWRzIGZyb20gLmN1cnJlbnQgYXQgZXhlY3V0ZSB0aW1lICovXG4gIHNraWxsc1JlZjogeyBjdXJyZW50OiBTa2lsbFN1bW1hcnlbXSB9O1xuICBhcGlUb29sc01ldGFkYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGlucHV0U2NoZW1hPzogdW5rbm93bjtcbiAgfVtdO1xuICBvblN1YlRvb2xDYWxsPzogT25TdWJUb29sQ2FsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2xDb250ZXh0PFRDb250ZXh0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICBzZXNzaW9uOiBTZXNzaW9uO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBzdG9yYWdlOiBTdG9yYWdlO1xuICBjb250ZXh0OiBUQ29udGV4dDtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsdEluVG9vbHMgPSB7XG4gIFJlYWQ6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZWFkcyBhIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnRzIHdpdGggbWV0YWRhdGEuIEZvciBmaWxlcyBvdmVyIDIwMCBsaW5lcywgYXV0b21hdGljYWxseSBzaG93cyBmaXJzdCAxMDAgbGluZXMgdW5sZXNzIGEgc3BlY2lmaWMgbGluZSByYW5nZSBpcyBwcm92aWRlZC4gVXNlIHN0YXJ0TGluZSBhbmQgZW5kTGluZSBwYXJhbWV0ZXJzIHRvIHJlYWQgc3BlY2lmaWMgcG9ydGlvbnMgb2YgbGFyZ2UgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya3NwYWNlIHJvb3RcIiksXG4gICAgICBzdGFydExpbmU6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlN0YXJ0aW5nIGxpbmUgbnVtYmVyICgxLWluZGV4ZWQpLiBJZiBwcm92aWRlZCB3aXRoIGVuZExpbmUsIHJlYWRzIGV4YWN0IHJhbmdlIHJlZ2FyZGxlc3Mgb2YgZmlsZSBzaXplLlwiXG4gICAgICAgICksXG4gICAgICBlbmRMaW5lOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJFbmRpbmcgbGluZSBudW1iZXIgKDEtaW5kZXhlZCwgaW5jbHVzaXZlKS4gSWYgcHJvdmlkZWQgd2l0aCBzdGFydExpbmUsIHJlYWRzIGV4YWN0IHJhbmdlIHJlZ2FyZGxlc3Mgb2YgZmlsZSBzaXplLlwiXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb250ZW50OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRmlsZSBjb250ZW50XCIpLFxuICAgICAgbWV0YWRhdGE6IHoub2JqZWN0KHtcbiAgICAgICAgdG90YWxMaW5lczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZmlsZVwiKSxcbiAgICAgICAgbGluZXNTaG93bjogelxuICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgIC5kZXNjcmliZShcIk51bWJlciBvZiBsaW5lcyBpbmNsdWRlZCBpbiB0aGlzIHJlc3BvbnNlXCIpLFxuICAgICAgICBzdGFydExpbmU6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJGaXJzdCBsaW5lIG51bWJlciBzaG93biAoMS1pbmRleGVkKVwiKSxcbiAgICAgICAgZW5kTGluZTogei5udW1iZXIoKS5kZXNjcmliZShcIkxhc3QgbGluZSBudW1iZXIgc2hvd24gKDEtaW5kZXhlZClcIiksXG4gICAgICAgIGlzUGFnaW5hdGVkOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcIldoZXRoZXIgdGhpcyBpcyBhIHBhcnRpYWwgdmlldyBvZiB0aGUgZmlsZVwiKSxcbiAgICAgICAgZmlsZVNpemU6IHpcbiAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJIdW1hbi1yZWFkYWJsZSBmaWxlIHNpemUgKGUuZy4sICcyLjVLJywgJzEuMk0nKVwiKSxcbiAgICAgICAgcGF0aDogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5kZXNjcmliZShcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya3NwYWNlIHJvb3RcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIEdyZXA6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZWFyY2ggZm9yIHBhdHRlcm5zIGluIGZpbGVzIHVzaW5nIHJpcGdyZXAuIFVzZSB0aGlzIHRvIGZpbmQgY29kZSBwYXR0ZXJucywgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGltcG9ydHMsIGV0Yy5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJSZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgKHJpcGdyZXAgc3ludGF4KVwiKSxcbiAgICAgIHBhdGg6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIlBhdGggdG8gc2VhcmNoIGluIChkZWZhdWx0cyB0byB3b3Jrc3BhY2Ugcm9vdCkuIENhbiBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5LlwiXG4gICAgICAgICksXG4gICAgICBmaWxlVHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRmlsZSB0eXBlIHRvIGZpbHRlciBieSAoZS5nLiwgJ3RzJywgJ2pzJywgJ3B5JywgJ21kJykuIFVzZXMgcmlwZ3JlcCdzIGJ1aWx0LWluIHR5cGUgZmlsdGVycy5cIlxuICAgICAgICApLFxuICAgICAgZ2xvYjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiR2xvYiBwYXR0ZXJuIHRvIGZpbHRlciBmaWxlcyAoZS5nLiwgJyoudHN4JywgJ3NyYy8qKi8qLnRzJylcIlxuICAgICAgICApLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgIC5kZXNjcmliZShcIldoZXRoZXIgc2VhcmNoIGlzIGNhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiB0cnVlKVwiKSxcbiAgICAgIGNvbnRleHRMaW5lczogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gc2hvdyBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggbWF0Y2hcIlxuICAgICAgICApLFxuICAgICAgbWF4Q291bnQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heGltdW0gbnVtYmVyIG9mIG1hdGNoZXMgcGVyIGZpbGUgKHVzZWZ1bCBmb3IgbGltaXRpbmcgb3V0cHV0KVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc1dpdGhNYXRjaGVzOiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk9ubHkgc2hvdyBmaWxlIHBhdGhzIHRoYXQgY29udGFpbiBtYXRjaGVzLCBub3QgdGhlIG1hdGNoaW5nIGxpbmVzIHRoZW1zZWx2ZXNcIlxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWF0Y2hlczogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU2VhcmNoIHJlc3VsdHMgd2l0aCBmaWxlIHBhdGhzLCBsaW5lIG51bWJlcnMsIGFuZCBtYXRjaGluZyBjb250ZW50XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgbWF0Y2hDb3VudDogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBtYXRjaGVzIGZvdW5kXCIpLFxuICAgICAgICBmaWxlQ291bnQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJOdW1iZXIgb2YgZmlsZXMgY29udGFpbmluZyBtYXRjaGVzXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBzZWFyY2hlZFwiKSxcbiAgICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdHRlcm4gdGhhdCB3YXMgc2VhcmNoZWQgZm9yXCIpLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pLFxuICBMaXN0OiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUmVjdXJzaXZlbHkgbGlzdCBkaXJlY3RvcnkgY29udGVudHMuIFVzZSB0aGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvZGViYXNlIHN0cnVjdHVyZSwgZmluZCBmaWxlcywgb3IgZXhwbG9yZSBkaXJlY3Rvcmllcy4gQ29udHJvbCBkZXB0aCB0byBiYWxhbmNlIGRldGFpbCB2cy4gb3ZlcnZpZXcuIERlcHRoIDEgc2hvd3MgaW1tZWRpYXRlIGNoaWxkcmVuLCBkZXB0aCAyIGluY2x1ZGVzIHN1YmRpcmVjdG9yaWVzLCBldGMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiUGF0aCB0byBsaXN0IChkZWZhdWx0cyB0byB3b3Jrc3BhY2Ugcm9vdClcIiksXG4gICAgICBkZXB0aDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4aW11bSBkZXB0aCB0byB0cmF2ZXJzZS4gQ2hvb3NlIGJhc2VkIG9uIGNvbnRleHQ6IDEtMiBmb3IgcXVpY2sgb3ZlcnZpZXcsIDMtNCBmb3IgZGV0YWlsZWQgZXhwbG9yYXRpb24sIDUrIGZvciBjb21wcmVoZW5zaXZlIG1hcHBpbmdcIlxuICAgICAgICApLFxuICAgICAgaW5jbHVkZUhpZGRlbjogelxuICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJJbmNsdWRlIGhpZGRlbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKHRob3NlIHN0YXJ0aW5nIHdpdGggJy4nKVwiXG4gICAgICAgICksXG4gICAgICBmaWxlc09ubHk6IHpcbiAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgLmRlc2NyaWJlKFwiT25seSBzaG93IGZpbGVzLCBub3QgZGlyZWN0b3JpZXNcIiksXG4gICAgICBwYXR0ZXJuOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJHbG9iIHBhdHRlcm4gdG8gZmlsdGVyIHJlc3VsdHMgKGUuZy4sICcqLnRzJywgJyp0ZXN0KicpXCIpLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGlzdGluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiRGlyZWN0b3J5IHRyZWUgbGlzdGluZyBzaG93aW5nIHBhdGhzIHJlbGF0aXZlIHRvIHNlYXJjaCByb290XCJcbiAgICAgICAgKSxcbiAgICAgIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICAgICAgdG90YWxJdGVtczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBpdGVtcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxGaWxlczogei5udW1iZXIoKS5kZXNjcmliZShcIlRvdGFsIG51bWJlciBvZiBmaWxlcyBmb3VuZFwiKSxcbiAgICAgICAgdG90YWxEaXJzOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVG90YWwgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGZvdW5kXCIpLFxuICAgICAgICBzZWFyY2hQYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0aGF0IHdhcyBsaXN0ZWRcIiksXG4gICAgICAgIGRlcHRoOiB6XG4gICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJNYXhpbXVtIGRlcHRoIHVzZWQgKGlmIHNwZWNpZmllZClcIiksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgfSksXG4gIFdyaXRlOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiV3JpdGUgY29udGVudCB0byBhIGZpbGUuIENyZWF0ZXMgcGFyZW50IGRpcmVjdG9yaWVzIGF1dG9tYXRpY2FsbHkuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZXMuXCIsXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxhYmVsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJBIGxhYmVsIHRoYXQgZGVzY3JpYmVzIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gd29ya3NwYWNlIHJvb3RcIiksXG4gICAgICBjb250ZW50OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQ29udGVudCB0byB3cml0ZSB0byB0aGUgZmlsZVwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN1Y2Nlc3M6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgd3JpdGUgc3VjY2VlZGVkXCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIHdyaXR0ZW4gZmlsZVwiKSxcbiAgICAgIGJ5dGVzV3JpdHRlbjogei5udW1iZXIoKS5kZXNjcmliZShcIk51bWJlciBvZiBieXRlcyB3cml0dGVuXCIpLFxuICAgICAgZXJyb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkVycm9yIG1lc3NhZ2UgaWYgd3JpdGUgZmFpbGVkXCIpLFxuICAgIH0pLFxuICB9KSxcbiAgRWRpdDogdG9vbCh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkVkaXQgYSBmaWxlIGJ5IHJlcGxhY2luZyBhbiBleGFjdCBzdHJpbmcuIEZhaWxzIGlmIG9sZF9zdHJpbmcgaXMgbm90IGZvdW5kIG9yIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgKG5vdCB1bmlxdWUpLiBGb3IgbXVsdGlwbGUgcmVwbGFjZW1lbnRzLCBjYWxsIHRoaXMgdG9vbCBtdWx0aXBsZSB0aW1lcyB3aXRoIHVuaXF1ZSBjb250ZXh0LlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290XCIpLFxuICAgICAgb2xkX3N0cmluZzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRXhhY3Qgc3RyaW5nIHRvIGZpbmQgYW5kIHJlcGxhY2UgKG11c3QgYmUgdW5pcXVlIGluIGZpbGUpXCIpLFxuICAgICAgbmV3X3N0cmluZzogei5zdHJpbmcoKS5kZXNjcmliZShcIlN0cmluZyB0byByZXBsYWNlIG9sZF9zdHJpbmcgd2l0aFwiKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHN1Y2Nlc3M6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgZWRpdCBzdWNjZWVkZWRcIiksXG4gICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGF0aCB0byB0aGUgZWRpdGVkIGZpbGVcIiksXG4gICAgICBlcnJvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXJyb3IgbWVzc2FnZSBpZiBlZGl0IGZhaWxlZFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEJhc2g6IHRvb2woe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFeGVjdXRlcyBhIGJhc2ggY29tbWFuZCBpbnNpZGUgdGhlIHdvcmtzcGFjZS4gQ1dEIHBlcnNpc3RzIGJldHdlZW4gY29tbWFuZHMgd2l0aGluIGEgc2Vzc2lvbi4gVXNlIHdhaXRVbnRpbDowIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NlcyAoZGV2IHNlcnZlcnMpLlwiLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIGNvbW1hbmQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJUaGUgc2hlbGwgY29tbWFuZCB0byBleGVjdXRlXCIpLFxuICAgICAgd2FpdFVudGlsOiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgYE1heCBtcyB0byB3YWl0IGZvciBjb21wbGV0aW9uIChkZWZhdWx0OiAke0RFRkFVTFRfV0FJVF9VTlRJTH0pLiBVc2UgMCB0byBydW4gaW4gYmFja2dyb3VuZCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LmBcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHBpZDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiU3lzdGVtIFBJRCAoMCBmb3IgZm9yZWdyb3VuZCwgPjAgZm9yIGJhY2tncm91bmQgLSB1c2UgdG8ga2lsbClcIlxuICAgICAgICApLFxuICAgICAgb3V0cHV0OiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21tYW5kIHN0ZG91dCtzdGRlcnIgY29tYmluZWQgKGVtcHR5IGZvciBiYWNrZ3JvdW5kKVwiKSxcbiAgICAgIGV4aXRDb2RlOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRXhpdCBjb2RlICgtMSBmb3IgYmFja2dyb3VuZC9ydW5uaW5nKVwiKSxcbiAgICAgIHN0YXR1czogelxuICAgICAgICAuZW51bShbXCJydW5uaW5nXCIsIFwiY29tcGxldGVkXCIsIFwiZmFpbGVkXCJdKVxuICAgICAgICAuZGVzY3JpYmUoXCJQcm9jZXNzIHN0YXR1c1wiKSxcbiAgICAgIGN3ZDogei5zdHJpbmcoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYWZ0ZXIgY29tbWFuZFwiKSxcbiAgICAgIG91dHB1dEZpbGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIlBhdGggdG8gb3V0cHV0IGxvZyAoZm9yIGJhY2tncm91bmQgcHJvY2Vzc2VzKVwiKSxcbiAgICB9KSxcbiAgfSksXG4gIFNraWxsOiB0b29sKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiTG9hZCBhIHNraWxsJ3MgZnVsbCBpbnN0cnVjdGlvbnMgYnkgbmFtZS4gQ2FsbCB0aGlzIGJlZm9yZSBmb2xsb3dpbmcgYSBza2lsbC5cIixcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbGFiZWw6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcIkEgbGFiZWwgdGhhdCBkZXNjcmliZXMgdGhlIGFjdGlvbiBiZWluZyBwZXJmb3JtZWRcIiksXG4gICAgICBuYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU2tpbGwgbmFtZSBmcm9tIHRoZSBBdmFpbGFibGUgU2tpbGxzIGxpc3RcIiksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCksXG4gICAgICBjb250ZW50OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRnVsbCBTS0lMTC5tZCBjb250ZW50XCIpLFxuICAgICAgcGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gdGhlIHNraWxsIGRpcmVjdG9yeSBpbiB0aGUgc2FuZGJveFwiKSxcbiAgICB9KSxcbiAgfSksXG4gIEphdmFTY3JpcHQ6IHRvb2woe1xuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBsYWJlbDogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLmRlc2NyaWJlKFwiQSBsYWJlbCB0aGF0IGRlc2NyaWJlcyB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZFwiKSxcbiAgICAgIGNvZGU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkphdmFTY3JpcHQgYXN5bmMgZnVuY3Rpb24gYm9keS4gYGN0eGAgaXMgaW4gc2NvcGUuIE11c3QgdXNlIGByZXR1cm5gIHRvIHByb2R1Y2Ugb3V0cHV0LlwiXG4gICAgICAgICksXG4gICAgfSksXG4gIH0pLFxufSBzYXRpc2ZpZXMgVG9vbFNldDtcblxuZXhwb3J0IHR5cGUgQnVpbHRJblRvb2xOYW1lID0ga2V5b2YgdHlwZW9mIGJ1aWx0SW5Ub29scztcbmV4cG9ydCBjb25zdCBidWlsdGluVG9vbE5hbWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBPYmplY3QuZW50cmllcyhidWlsdEluVG9vbHMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgbmFtZV0pXG4pIGFzIHsgW0sgaW4gQnVpbHRJblRvb2xOYW1lXTogSyB9O1xuXG5jb25zdCBTS0lMTF9NRF9TVUZGSVggPSAvXFwvP1NLSUxMXFwubWQkLztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xzKGNvbnRleHQ6IEludGVybmFsVG9vbENvbnRleHQpIHtcbiAgY29uc3QgdG9vbHM6IFRvb2xTZXQgPSB7XG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuUmVhZF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLlJlYWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBzdGFydExpbmUsIGVuZExpbmUgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LnJlYWRGaWxlKHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIltSZWFkIFRvb2xdXCIsIHJlc3VsdCk7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBgRXJyb3I6IEZpbGUgbm90IGZvdW5kIC0gJHtmaWxlUGF0aH1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgdG90YWxMaW5lczogMCxcbiAgICAgICAgICAgICAgbGluZXNTaG93bjogMCxcbiAgICAgICAgICAgICAgc3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgICBlbmRMaW5lOiAwLFxuICAgICAgICAgICAgICBpc1BhZ2luYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiBcIjBcIixcbiAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsQ29udGVudCA9IHJlc3VsdC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGZ1bGxDb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAvLyBBIHRyYWlsaW5nIG5ld2xpbmUgcHJvZHVjZXMgYW4gZW1wdHkgbGFzdCBlbGVtZW50IFx1MjAxNCByZW1vdmUgaXRcbiAgICAgICAgLy8gc28gbGluZSBjb3VudCBtYXRjaGVzIGB3YyAtbGAgLyBgYXdrICdFTkR7cHJpbnQgTlJ9J2AgYmVoYXZpb3IuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzLmF0KC0xKSA9PT0gXCJcIikge1xuICAgICAgICAgIGxpbmVzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsTGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZpbGVCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGZ1bGxDb250ZW50KTtcbiAgICAgICAgY29uc3QgZmlsZVNpemUgPSBmb3JtYXRGaWxlU2l6ZShmaWxlQnl0ZXMpO1xuXG4gICAgICAgIC8vIERldGVybWluZSByYW5nZVxuICAgICAgICBjb25zdCBQQUdFX1NJWkUgPSAxMDA7XG4gICAgICAgIGxldCBhY3R1YWxTdGFydDogbnVtYmVyO1xuICAgICAgICBsZXQgYWN0dWFsRW5kOiBudW1iZXI7XG5cbiAgICAgICAgaWYgKHN0YXJ0TGluZSAhPT0gdW5kZWZpbmVkICYmIGVuZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdHVhbFN0YXJ0ID0gc3RhcnRMaW5lO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IGVuZExpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IHN0YXJ0TGluZTtcbiAgICAgICAgICBhY3R1YWxFbmQgPSBNYXRoLm1pbihzdGFydExpbmUgKyBQQUdFX1NJWkUgLSAxLCB0b3RhbExpbmVzKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gZW5kTGluZTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3RhbExpbmVzID4gMjAwKSB7XG4gICAgICAgICAgYWN0dWFsU3RhcnQgPSAxO1xuICAgICAgICAgIGFjdHVhbEVuZCA9IFBBR0VfU0laRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3R1YWxTdGFydCA9IDE7XG4gICAgICAgICAgYWN0dWFsRW5kID0gdG90YWxMaW5lcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGxpbmUgcmFuZ2UgKDEtaW5kZXhlZClcbiAgICAgICAgY29uc3Qgc2xpY2VkTGluZXMgPSBsaW5lcy5zbGljZShhY3R1YWxTdGFydCAtIDEsIGFjdHVhbEVuZCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzbGljZWRMaW5lcy5qb2luKFwiXFxuXCIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHRvdGFsTGluZXMsXG4gICAgICAgICAgICBsaW5lc1Nob3duOiBNYXRoLm1heCgwLCBhY3R1YWxFbmQgLSBhY3R1YWxTdGFydCArIDEpLFxuICAgICAgICAgICAgc3RhcnRMaW5lOiBhY3R1YWxTdGFydCxcbiAgICAgICAgICAgIGVuZExpbmU6IGFjdHVhbEVuZCxcbiAgICAgICAgICAgIGlzUGFnaW5hdGVkOiBhY3R1YWxFbmQgPCB0b3RhbExpbmVzLFxuICAgICAgICAgICAgZmlsZVNpemUsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkdyZXBdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5HcmVwLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgcGF0dGVybixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIGdsb2IsXG4gICAgICAgIGNhc2VTZW5zaXRpdmUsXG4gICAgICAgIGNvbnRleHRMaW5lcyxcbiAgICAgICAgbWF4Q291bnQsXG4gICAgICAgIGZpbGVzV2l0aE1hdGNoZXMsXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdGggPSBwYXRoID8/IFwiLlwiO1xuXG4gICAgICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgYXJncy5wdXNoKFwiLS1saW5lLW51bWJlclwiKTtcbiAgICAgICAgYXJncy5wdXNoKFwiLS1oZWFkaW5nXCIpO1xuICAgICAgICBhcmdzLnB1c2goXCItLWNvbG9yXCIsIFwibmV2ZXJcIik7XG5cbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICAgICAgYXJncy5wdXNoKFwiLWlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLXR5cGVcIiwgZmlsZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdsb2IpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLWdsb2JcIiwgZ2xvYik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItQ1wiLCBTdHJpbmcoY29udGV4dExpbmVzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFyZ3MucHVzaChcIi0tbWF4LWNvdW50XCIsIFN0cmluZyhtYXhDb3VudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVzV2l0aE1hdGNoZXMpIHtcbiAgICAgICAgICBhcmdzLnB1c2goXCItLWZpbGVzLXdpdGgtbWF0Y2hlc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MucHVzaChcIi0tXCIsIHBhdHRlcm4sIHNlYXJjaFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJyZ1wiLCBhcmdzIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbR3JlcCBUb29sXVwiLCByZXN1bHQpO1xuICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0ZGVyciAmJiAhc3RkZXJyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJubyBtYXRjaGVzXCIpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW0dyZXAgVG9vbF0gV2FybmluZzogJHtzdGRlcnJ9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnVuY2F0ZSBvdXRwdXQgdG8gcHJldmVudCBcImlucHV0IHRvbyBsb25nXCIgZXJyb3JzICg1MGsgY2hhcnMgXHUyMjQ4IDEyLjVrIHRva2VucylcbiAgICAgICAgY29uc3QgTUFYX0dSRVBfT1VUUFVUX0NIQVJTID0gNTBfMDAwO1xuICAgICAgICBsZXQgZmluYWxPdXRwdXQgPSBzdGRvdXQ7XG4gICAgICAgIGxldCB3YXNUcnVuY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGZpbmFsT3V0cHV0Lmxlbmd0aCA+IE1BWF9HUkVQX09VVFBVVF9DSEFSUykge1xuICAgICAgICAgIGZpbmFsT3V0cHV0ID1cbiAgICAgICAgICAgIGZpbmFsT3V0cHV0LnNsaWNlKDAsIE1BWF9HUkVQX09VVFBVVF9DSEFSUykgK1xuICAgICAgICAgICAgXCJcXG5cXG5bT3V0cHV0IHRydW5jYXRlZCAtIHVzZSBtb3JlIHNwZWNpZmljIHBhdHRlcm4gb3IgcGF0aF1cIjtcbiAgICAgICAgICB3YXNUcnVuY2F0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZXMgPSBmaW5hbE91dHB1dFxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAuZmlsdGVyKChsKSA9PiBsLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBmaWxlQ291bnQgPSBmaWxlc1dpdGhNYXRjaGVzXG4gICAgICAgICAgPyBsaW5lcy5sZW5ndGhcbiAgICAgICAgICA6IG5ldyBTZXQoXG4gICAgICAgICAgICAgIGxpbmVzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobCkgPT4gIWwuc3RhcnRzV2l0aChcIiBcIikgJiYgbC5pbmNsdWRlcyhcIjpcIikpXG4gICAgICAgICAgICAgICAgLm1hcCgobCkgPT4gbC5zcGxpdChcIjpcIilbMF0pXG4gICAgICAgICAgICApLnNpemU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgICBtYXRjaENvdW50OiBmaWxlc1dpdGhNYXRjaGVzXG4gICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICA6IGxpbmVzLmZpbHRlcigobCkgPT4gbC5pbmNsdWRlcyhcIjpcIikpLmxlbmd0aCxcbiAgICAgICAgICAgIGZpbGVDb3VudCxcbiAgICAgICAgICAgIHNlYXJjaFBhdGgsXG4gICAgICAgICAgICBwYXR0ZXJuLFxuICAgICAgICAgICAgd2FzVHJ1bmNhdGVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF0Y2hlczogZmluYWxPdXRwdXQgfHwgXCIobm8gbWF0Y2hlcyBmb3VuZClcIixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuTGlzdF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkxpc3QsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXRoLCBkZXB0aCwgaW5jbHVkZUhpZGRlbiwgZmlsZXNPbmx5LCBwYXR0ZXJuIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGF0aCA9IHBhdGggPz8gXCIuXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHNldCAtZVxuICAgICAgICAgICAgU0VBUkNIX1BBVEg9XCIkMVwiXG4gICAgICAgICAgICBERVBUSD1cIiQyXCJcbiAgICAgICAgICAgIElOQ0xVREVfSElEREVOPVwiJDNcIlxuICAgICAgICAgICAgRklMRVNfT05MWT1cIiQ0XCJcbiAgICAgICAgICAgIFBBVFRFUk49XCIkNVwiXG5cbiAgICAgICAgICAgICMgQnVpbGQgZmluZCBjb21tYW5kIGFyZ3VtZW50c1xuICAgICAgICAgICAgRklORF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIEZJTkRfQVJHUz1cIiRGSU5EX0FSR1MgLW1heGRlcHRoICRERVBUSFwiXG4gICAgICAgICAgICBbIFwiJElOQ0xVREVfSElEREVOXCIgIT0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTICEgLXBhdGggJyovLionXCJcbiAgICAgICAgICAgIFsgXCIkRklMRVNfT05MWVwiID0gXCJ0cnVlXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC10eXBlIGZcIlxuICAgICAgICAgICAgWyAtbiBcIiRQQVRURVJOXCIgXSAmJiBGSU5EX0FSR1M9XCIkRklORF9BUkdTIC1uYW1lICckUEFUVEVSTidcIlxuXG4gICAgICAgICAgICAjIEdldCBsaXN0aW5nXG4gICAgICAgICAgICBMSVNUSU5HPSQoZXZhbCBcImZpbmQgJyRTRUFSQ0hfUEFUSCcgJEZJTkRfQVJHU1wiIDI+L2Rldi9udWxsIHwgc29ydClcblxuICAgICAgICAgICAgIyBHZXQgY291bnRzXG4gICAgICAgICAgICBDT1VOVF9BUkdTPVwiXCJcbiAgICAgICAgICAgIFsgLW4gXCIkREVQVEhcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAtbWF4ZGVwdGggJERFUFRIXCJcbiAgICAgICAgICAgIFsgXCIkSU5DTFVERV9ISURERU5cIiAhPSBcInRydWVcIiBdICYmIENPVU5UX0FSR1M9XCIkQ09VTlRfQVJHUyAhIC1wYXRoICcqLy4qJ1wiXG5cbiAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChldmFsIFwiZmluZCAnJFNFQVJDSF9QQVRIJyAkQ09VTlRfQVJHUyAtdHlwZSBmXCIgMj4vZGV2L251bGwgfCB3YyAtbClcbiAgICAgICAgICAgIERJUl9DT1VOVD0kKGV2YWwgXCJmaW5kICckU0VBUkNIX1BBVEgnICRDT1VOVF9BUkdTIC10eXBlIGRcIiAyPi9kZXYvbnVsbCB8IHdjIC1sKVxuXG4gICAgICAgICAgICAjIE91dHB1dDogY291bnRzIGZpcnN0LCB0aGVuIGxpc3RpbmdcbiAgICAgICAgICAgIGVjaG8gXCIkRklMRV9DT1VOVHwkRElSX0NPVU5UXCJcbiAgICAgICAgICAgIGVjaG8gXCJ8fHxMSVNUSU5HfHx8XCJcbiAgICAgICAgICAgIGVjaG8gXCIkTElTVElOR1wiIHwgc2VkIFwic3xeJFNFQVJDSF9QQVRIfC58XCJcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgXCItLVwiLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoPy50b1N0cmluZygpIHx8IFwiXCIsXG4gICAgICAgICAgICBpbmNsdWRlSGlkZGVuID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBmaWxlc09ubHkgPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHBhdHRlcm4gfHwgXCJcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0xpc3QgVG9vbF1cIiwgcmVzdWx0KTtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtMaXN0IFRvb2xdIHN0ZGVycjogJHtzdGRlcnJ9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbY291bnRzTGluZSwgLi4ucmVzdF0gPSBzdGRvdXQuc3BsaXQoXCJ8fHxMSVNUSU5HfHx8XCIpO1xuICAgICAgICBjb25zdCBsaXN0aW5nID0gcmVzdC5qb2luKFwifHx8TElTVElOR3x8fFwiKS50cmltKCk7XG4gICAgICAgIGNvbnN0IFtmaWxlQ291bnRTdHIsIGRpckNvdW50U3RyXSA9IGNvdW50c0xpbmUudHJpbSgpLnNwbGl0KFwifFwiKTtcblxuICAgICAgICBjb25zdCB0b3RhbEZpbGVzID0gTnVtYmVyLnBhcnNlSW50KGZpbGVDb3VudFN0ciwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IHRvdGFsRGlycyA9IE51bWJlci5wYXJzZUludChkaXJDb3VudFN0ciwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gbGlzdGluZy5zcGxpdChcIlxcblwiKS5maWx0ZXIoKGwpID0+IGwubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiBsaW5lcy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbEZpbGVzLFxuICAgICAgICAgICAgdG90YWxEaXJzLFxuICAgICAgICAgICAgc2VhcmNoUGF0aCxcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGlzdGluZyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuV3JpdGVdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5Xcml0ZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoLnNsaWNlKDEpIDogcGF0aDtcbiAgICAgICAgY29uc3QgZGlyID0gZmlsZVBhdGguaW5jbHVkZXMoXCIvXCIpXG4gICAgICAgICAgPyBmaWxlUGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpXG4gICAgICAgICAgOiBcIi5cIjtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdChcIi9cIikucG9wKCkgfHwgZmlsZVBhdGg7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoZGlyICE9PSBcIi5cIikge1xuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LmV4ZWMoeyBjb21tYW5kOiBcIm1rZGlyXCIsIGFyZ3M6IFtcIi1wXCIsIGRpcl0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICAgICAgZmlsZXM6IFt7IHBhdGg6IGZpbGVOYW1lLCBjb250ZW50IH1dLFxuICAgICAgICAgICAgZGVzdFBhdGg6IGRpcixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBieXRlc1dyaXR0ZW46IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsIFwidXRmOFwiKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGJ5dGVzV3JpdHRlbjogMCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1zZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIFtidWlsdGluVG9vbE5hbWVzLkVkaXRdOiB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5FZGl0LFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgb2xkX3N0cmluZywgbmV3X3N0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRoO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5yZWFkRmlsZSh7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBwYXRoOiBmaWxlUGF0aCwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVQYXRofWAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSByZXN1bHQudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZW50LnNwbGl0KG9sZF9zdHJpbmcpLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgaWYgKG9jY3VycmVuY2VzID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJvbGRfc3RyaW5nIG5vdCBmb3VuZCBpbiBmaWxlXCIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvY2N1cnJlbmNlcyA+IDEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBgb2xkX3N0cmluZyBhcHBlYXJzICR7b2NjdXJyZW5jZXN9IHRpbWVzIGluIGZpbGUgKG11c3QgYmUgdW5pcXVlKS4gSW5jbHVkZSBtb3JlIHN1cnJvdW5kaW5nIGNvbnRleHQgdG8gbWFrZSB0aGUgbWF0Y2ggdW5pcXVlLmAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob2xkX3N0cmluZywgbmV3X3N0cmluZyk7XG4gICAgICAgIGNvbnN0IGRpciA9IGZpbGVQYXRoLmluY2x1ZGVzKFwiL1wiKVxuICAgICAgICAgID8gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKVxuICAgICAgICAgIDogXCIuXCI7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGZpbGVQYXRoO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY29udGV4dC5zYW5kYm94LndyaXRlRmlsZXMoe1xuICAgICAgICAgICAgZmlsZXM6IFt7IHBhdGg6IGZpbGVOYW1lLCBjb250ZW50OiBuZXdDb250ZW50IH1dLFxuICAgICAgICAgICAgZGVzdFBhdGg6IGRpcixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHBhdGg6IGZpbGVQYXRoIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBwYXRoOiBmaWxlUGF0aCwgZXJyb3I6IGVycm9yTXNnIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG4gICAgW2J1aWx0aW5Ub29sTmFtZXMuQmFzaF06IHRvb2woe1xuICAgICAgLi4uYnVpbHRJblRvb2xzLkJhc2gsXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBjb21tYW5kLCB3YWl0VW50aWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgXCIuLi9zYW5kYm94L3Byb2Nlc3MtbWFuYWdlclwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc01hbmFnZXIgPSBjcmVhdGVQcm9jZXNzTWFuYWdlcih7XG4gICAgICAgICAgc2FuZGJveDogY29udGV4dC5zYW5kYm94LFxuICAgICAgICAgIHNlc3Npb25JZDogY29udGV4dC5pbnB1dC5zZXNzaW9uSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHByb2Nlc3NNYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc01hbmFnZXIucnVuKHsgY29tbWFuZCwgd2FpdFVudGlsIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICB9KSxcbiAgfTtcblxuICBpZiAoY29udGV4dC5zZXNzaW9uLnNraWxsc0Rpcj8ubGVuZ3RoKSB7XG4gICAgdG9vbHNbYnVpbHRpblRvb2xOYW1lcy5Ta2lsbF0gPSB0b29sKHtcbiAgICAgIC4uLmJ1aWx0SW5Ub29scy5Ta2lsbCxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IG5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBza2lsbHMgPSBjb250ZXh0LnNraWxsc1JlZi5jdXJyZW50O1xuICAgICAgICBjb25zdCBza2lsbCA9IHNraWxscy5maW5kKFxuICAgICAgICAgIChzKSA9PiBzLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICk7XG4gICAgICAgIGlmICghc2tpbGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2tpbGwgbm90IGZvdW5kOiBcIiR7bmFtZX1cIi4gQXZhaWxhYmxlOiAke3NraWxscy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc2FuZGJveC5yZWFkRmlsZSh7XG4gICAgICAgICAgcGF0aDogc2tpbGwuc2tpbGxNZFBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2tpbGwgZmlsZSBub3QgZm91bmQ6ICR7c2tpbGwuc2tpbGxNZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3ID1cbiAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogcmVzdWx0LnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IHJhdy5pbmRleE9mKFwiLS0tXCIsIDMpO1xuICAgICAgICBjb25zdCBjb250ZW50ID1cbiAgICAgICAgICBlbmRNYXJrZXIgPT09IC0xID8gcmF3IDogcmF3LnNsaWNlKGVuZE1hcmtlciArIDMpLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2tpbGxEaXIgPSBza2lsbC5za2lsbE1kUGF0aC5yZXBsYWNlKFNLSUxMX01EX1NVRkZJWCwgXCJcIik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogc2tpbGwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc2tpbGwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBwYXRoOiBza2lsbERpcixcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5hcGlUb29sc01ldGFkYXRhLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBhcGlUb29scyA9IGJ1aWxkQXBpVG9vbHMoe1xuICAgICAgcnBjOiBjb250ZXh0LmlucHV0LnJwYyxcbiAgICAgIG1ldGFkYXRhOiBjb250ZXh0LmFwaVRvb2xzTWV0YWRhdGEsXG4gICAgICBzZXNzaW9uOiBjb250ZXh0LnNlc3Npb24sXG4gICAgICBzYW5kYm94UmVjb3JkOiBjb250ZXh0LnNhbmRib3hSZWNvcmQsXG4gICAgICBjb250ZXh0OiBjb250ZXh0LmV2ZW50LmNvbnRleHQsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbih0b29scywgYXBpVG9vbHMpO1xuICB9XG5cbiAgdG9vbHNbYnVpbHRpblRvb2xOYW1lcy5KYXZhU2NyaXB0XSA9IGNyZWF0ZUphdmFTY3JpcHRUb29sKHtcbiAgICB0b29scyxcbiAgICBzZXNzaW9uOiBjb250ZXh0LnNlc3Npb24sXG4gICAgc2FuZGJveDogY29udGV4dC5zYW5kYm94LFxuICAgIG9uU3ViVG9vbENhbGw6IGNvbnRleHQub25TdWJUb29sQ2FsbCxcbiAgfSk7XG5cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG50eXBlIEFwaVRvb2xNZXRhZGF0YSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaW5wdXRTY2hlbWE/OiB1bmtub3duO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQXBpVG9vbHNNZXRhZGF0YShvcHRzOiB7XG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xufSk6IFByb21pc2U8QXBpVG9vbE1ldGFkYXRhW10+IHtcbiAgY29uc3QgeyBycGMgfSA9IG9wdHM7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKHsgbWV0aG9kOiBcInRvb2xzLmxpc3RcIiwgcGFyYW1zOiB7fSB9KTtcblxuICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbYWdlbnRdIEZhaWxlZCB0byBmZXRjaCB0b29sczpcIiwgcmVzdWx0LmVycm9yPy5tZXNzYWdlKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gKHJlc3VsdC5yZXN1bHQgYXMgQXBpVG9vbE1ldGFkYXRhW10pID8/IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcGlUb29scyhvcHRzOiB7XG4gIHJwYzogKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+O1xuICBtZXRhZGF0YTogQXBpVG9vbE1ldGFkYXRhW107XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufSk6IFRvb2xTZXQge1xuICBjb25zdCB7IHJwYywgbWV0YWRhdGEsIHNlc3Npb24sIHNhbmRib3hSZWNvcmQsIGNvbnRleHQgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xzOiBUb29sU2V0ID0ge307XG5cbiAgZm9yIChjb25zdCBtZXRhIG9mIG1ldGFkYXRhKSB7XG4gICAgdG9vbHNbbWV0YS5uYW1lXSA9IHRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IG1ldGEuZGVzY3JpcHRpb24gPz8gYEN1c3RvbSB0b29sOiAke21ldGEubmFtZX1gLFxuICAgICAgaW5wdXRTY2hlbWE6IG1ldGEuaW5wdXRTY2hlbWFcbiAgICAgICAgPyBqc29uU2NoZW1hKG1ldGEuaW5wdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2YganNvblNjaGVtYT5bMF0pXG4gICAgICAgIDogei5vYmplY3Qoe30pLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyh7XG4gICAgICAgICAgbWV0aG9kOiBcInRvb2xzLmV4ZWN1dGVcIixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG5hbWU6IG1ldGEubmFtZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICAgIHNhbmRib3hSZWNvcmQsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb29sIGV4ZWN1dGlvbiBmYWlsZWQ6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFwaVVybChvcHRzOiB7IGFwaTogc3RyaW5nIHwgdW5kZWZpbmVkIH0pOiBzdHJpbmcge1xuICBsZXQgb3JpZ2luID0gXCJcIjtcbiAgbGV0IHBhdGggPSBgLy53ZWxsLWtub3duL2FnZW50LyR7QUdFTlRfUFJPVE9DT0xfVkVSU0lPTn1gO1xuXG4gIGlmIChvcHRzLmFwaSkge1xuICAgIGlmIChvcHRzLmFwaS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgcGF0aCA9IG9wdHMuYXBpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZWUgaWYgaXQncyBmdWxsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdHMuYXBpKTtcbiAgICAgICAgb3JpZ2luID0gdXJsLm9yaWdpbjtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoICsgdXJsLmhhc2g7XG4gICAgICAgIGlmIChmdWxsUGF0aC5zdGFydHNXaXRoKFwiL1wiKSAmJiBmdWxsUGF0aCAhPT0gXCIvXCIpIHtcbiAgICAgICAgICBwYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBub29wXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcmlnaW4pIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgb3JpZ2luID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuUE9SVCA/PyBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19QT1JUID8/IDMwMDBcbiAgICAgIH1gO1xuICAgIH1cbiAgICBjb25zdCB2ZXJjZWxVcmwgPVxuICAgICAgcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCA/PyBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19WRVJDRUxfVVJMO1xuICAgIGlmICh2ZXJjZWxVcmwpIHtcbiAgICAgIG9yaWdpbiA9IGBodHRwczovLyR7dmVyY2VsVXJsfWA7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcmlnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlthZ2VudF0gQ291bGRuJ3QgZGV0ZXJtaW5lIEFQSSBvcmlnaW4gKG5vIG9yaWdpbiBkZXRlY3RlZCBpbiBgYXBpYCBvcHRpb24gYW5kIG5vIFZFUkNFTF9VUkwgc2V0KVwiXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBgJHtvcmlnaW59JHtwYXRofWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBUb29sU2V0LCB0b29sIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4uL3NhbmRib3hcIjtcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbiB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBidWlsdEluVG9vbHMgfSBmcm9tIFwiLlwiO1xuXG5leHBvcnQgY29uc3QgSkFWQVNDUklQVF9UT09MX05BTUUgPSBcIkphdmFTY3JpcHRcIjtcblxuZXhwb3J0IHR5cGUgU3ViVG9vbENhbGxSZXN1bHQgPSB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBPblN1YlRvb2xDYWxsID0gKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogdW5rbm93bixcbiAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuKSA9PiBQcm9taXNlPFN1YlRvb2xDYWxsUmVzdWx0PjtcblxuY29uc3QgUkVRVUVTVF9NQVJLRVJfU1RBUlQgPSBcIl9fVE9PTF9SRVFVRVNUX19cIjtcbmNvbnN0IFJFUVVFU1RfTUFSS0VSX0VORCA9IFwiX19UT09MX1JFUVVFU1RfRU5EX19cIjtcbmNvbnN0IEVYRUNVVElPTl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBUaGUgcnVubmVyIHNjcmlwdCBpcyB3cml0dGVuIHRvIHRoZSBzYW5kYm94IGFuZCBleGVjdXRlZCB2aWEgTm9kZS5qcy5cbiAqIEl0IHJlYWRzIHRoZSBtb2RlbCdzIGNvZGUgZnJvbSBjb2RlLmpzLCBzZXRzIHVwIGN0eC50b29scyBhcyBSUEMgcHJveGllc1xuICogKHJlcXVlc3RzIHNlbnQgdmlhIHN0ZGVyciBtYXJrZXJzLCByZXNwb25zZXMgcG9sbGVkIGZyb20gZmlsZXMpLCBleGVjdXRlc1xuICogdGhlIGNvZGUsIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBzdGRvdXQgYXMgSlNPTi5cbiAqL1xuY29uc3QgUlVOTkVSX1NDUklQVCA9IGBcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYywgdW5saW5rU3luYywgbWtkaXJTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmNvbnN0IFNDUklQVF9ESVIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBUT09MX0NBTExfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5cbmxldCByZXFDb3VudGVyID0gMDtcblxuYXN5bmMgZnVuY3Rpb24gY2FsbFRvb2wobmFtZSwgaW5wdXQpIHtcbiAgY29uc3QgaWQgPSAncmVxXycgKyAoKytyZXFDb3VudGVyKSArICdfJyArIERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3BvbnNlRmlsZSA9IGpvaW4oU0NSSVBUX0RJUiwgaWQgKyAnLnJlc3BvbnNlLmpzb24nKTtcblxuICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoeyBpZCwgdG9vbDogbmFtZSwgaW5wdXQgfSk7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcke1JFUVVFU1RfTUFSS0VSX1NUQVJUfScgKyByZXF1ZXN0ICsgJyR7UkVRVUVTVF9NQVJLRVJfRU5EfScgKyAnXFxcXG4nKTtcblxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIHdoaWxlICghZXhpc3RzU3luYyhyZXNwb25zZUZpbGUpKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IFRPT0xfQ0FMTF9USU1FT1VUX01TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rvb2wgY2FsbCAnICsgbmFtZSArICcgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAzMCkpO1xuICB9XG5cbiAgbGV0IHJhdztcbiAgdHJ5IHtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICByYXcgPSByZWFkRmlsZVN5bmMocmVzcG9uc2VGaWxlLCAndXRmOCcpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJhdyk7XG4gIHRyeSB7IHVubGlua1N5bmMocmVzcG9uc2VGaWxlKTsgfSBjYXRjaCB7fVxuXG4gIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdDtcbn1cblxuY29uc3QgY29kZSA9IHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICdjb2RlLmpzJyksICd1dGY4Jyk7XG5jb25zdCB0b29sTmFtZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqb2luKFNDUklQVF9ESVIsICd0b29scy5qc29uJyksICd1dGY4JykpO1xuXG5jb25zdCBjdHggPSB7IHRvb2xzOiB7fSB9O1xuZm9yIChjb25zdCBuYW1lIG9mIHRvb2xOYW1lcykge1xuICBjdHgudG9vbHNbbmFtZV0gPSAoaW5wdXQpID0+IGNhbGxUb29sKG5hbWUsIGlucHV0KTtcbn1cblxuY29uc3QgbG9ncyA9IFtdO1xuY29uc3QgY3VzdG9tQ29uc29sZSA9IHtcbiAgbG9nOiAoLi4uYXJncykgPT4gbG9ncy5wdXNoKGFyZ3MubWFwKGEgPT4gdHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IEpTT04uc3RyaW5naWZ5KGEpKS5qb2luKCcgJykpLFxuICBlcnJvcjogKC4uLmFyZ3MpID0+IGxvZ3MucHVzaCgnW2Vycm9yXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG4gIHdhcm46ICguLi5hcmdzKSA9PiBsb2dzLnB1c2goJ1t3YXJuXSAnICsgYXJncy5tYXAoYSA9PiB0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhIDogSlNPTi5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKSksXG59O1xuXG50cnkge1xuICBjb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uKCkge30pLmNvbnN0cnVjdG9yO1xuICBjb25zdCBmbiA9IG5ldyBBc3luY0Z1bmN0aW9uKCdjdHgnLCAnY29uc29sZScsIGNvZGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihjdHgsIGN1c3RvbUNvbnNvbGUpO1xuXG4gIGNvbnN0IG91dHB1dCA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgIT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IG51bGwgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn0gY2F0Y2ggKGVycikge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfTtcbiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgb3V0cHV0LmxvZ3MgPSBsb2dzO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKTtcbn1cbmA7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBwbGFpbiBKU09OIFNjaGVtYSBmcm9tIHdoYXRldmVyIGZvcm1hdCB0aGUgQUkgU0RLIHRvb2wgdXNlc1xuICogKFpvZCBzY2hlbWEsIEFJIFNESyB3cmFwcGVkIHNjaGVtYSwgb3IgcmF3IEpTT04gU2NoZW1hKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RKc29uU2NoZW1hKFxuICBzY2hlbWE6IHVua25vd25cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICBcIl9kZWZcIiBpbiBzY2hlbWEgJiZcbiAgICB0eXBlb2YgKHNjaGVtYSBhcyB7IF9kZWY6IHVua25vd24gfSkuX2RlZiA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHoudG9KU09OU2NoZW1hKHNjaGVtYSBhcyB6LlpvZFR5cGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcyA9IHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPjtcbiAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgIHJldHVybiBzLmpzb25TY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBpZiAoXCJ0eXBlXCIgaW4gcyB8fCBcInByb3BlcnRpZXNcIiBpbiBzKSB7XG4gICAgcmV0dXJuIHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25TY2hlbWFUb1RzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpbmRlbnQgPSAwXG4pOiBzdHJpbmcge1xuICBpZiAoIXNjaGVtYSkge1xuICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxuXG4gIGlmIChzY2hlbWEuZW51bSAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHNjaGVtYS5hbnlPZiAmJiBBcnJheS5pc0FycmF5KHNjaGVtYS5hbnlPZikpIHtcbiAgICByZXR1cm4gc2NoZW1hLmFueU9mXG4gICAgICAubWFwKChzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ganNvblNjaGVtYVRvVHMocywgaW5kZW50KSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9XG4gIGlmIChzY2hlbWEub25lT2YgJiYgQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5vbmVPZlxuICAgICAgLm1hcCgoczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGpzb25TY2hlbWFUb1RzKHMsIGluZGVudCkpXG4gICAgICAuam9pbihcIiB8IFwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZSBhcyBzdHJpbmc7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSBcImFycmF5XCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gc2NoZW1hLml0ZW1zXG4gICAgICAgID8ganNvblNjaGVtYVRvVHMoc2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpbmRlbnQpXG4gICAgICAgIDogXCJ1bmtub3duXCI7XG4gICAgICByZXR1cm4gYEFycmF5PCR7aXRlbXN9PmA7XG4gICAgfVxuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzIGFzXG4gICAgICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIHVua25vd24+XCI7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICAgICAgY29uc3QgcGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcbiAgICAgIGNvbnN0IGNsb3NlUGFkID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSByZXF1aXJlZC5oYXMoa2V5KSA/IFwiXCIgOiBcIj9cIjtcbiAgICAgICAgcmV0dXJuIGAke3BhZH0ke2tleX0ke29wdH06ICR7anNvblNjaGVtYVRvVHModmFsdWUsIGluZGVudCArIDEpfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBge1xcbiR7cHJvcHMuam9pbihcIjtcXG5cIil9O1xcbiR7Y2xvc2VQYWR9fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ29udGV4dFR5cGVTdHJpbmcodG9vbHM6IFRvb2xTZXQpOiBzdHJpbmcge1xuICBjb25zdCBzaWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIHRdIG9mIE9iamVjdC5lbnRyaWVzKHRvb2xzKSkge1xuICAgIGNvbnN0IHJhdyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgaW5wdXRTY2hlbWEgPSBleHRyYWN0SnNvblNjaGVtYShyYXcuaW5wdXRTY2hlbWEgPz8gcmF3LnBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGV4dHJhY3RKc29uU2NoZW1hKHJhdy5vdXRwdXRTY2hlbWEpO1xuXG4gICAgY29uc3QgaW5wdXRUeXBlID0gaW5wdXRTY2hlbWEgPyBqc29uU2NoZW1hVG9UcyhpbnB1dFNjaGVtYSwgMikgOiBcInt9XCI7XG4gICAgY29uc3Qgb3V0cHV0VHlwZSA9IG91dHB1dFNjaGVtYVxuICAgICAgPyBqc29uU2NoZW1hVG9UcyhvdXRwdXRTY2hlbWEsIDIpXG4gICAgICA6IFwidW5rbm93blwiO1xuXG4gICAgc2lncy5wdXNoKGAgICAgJHtuYW1lfShpbnB1dDogJHtpbnB1dFR5cGV9KTogUHJvbWlzZTwke291dHB1dFR5cGV9PmApO1xuICB9XG5cbiAgcmV0dXJuIGB0eXBlIENvbnRleHQgPSB7XFxuICB0b29sczoge1xcbiR7c2lncy5qb2luKFwiO1xcblwiKX07XFxuICB9XFxufWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVJblNhbmRib3goe1xuICBjb2RlLFxuICBycGNEaXIsXG4gIGFib3J0Q29udHJvbGxlcixcbiAgc2FuZGJveCxcbiAgYXZhaWxhYmxlVG9vbHMsXG4gIG9uU3ViVG9vbENhbGwsXG59OiB7XG4gIGNvZGU6IHN0cmluZztcbiAgcnBjRGlyOiBzdHJpbmc7XG4gIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuICBzYW5kYm94OiBTYW5kYm94O1xuICBhdmFpbGFibGVUb29sczogVG9vbFNldDtcbiAgb25TdWJUb29sQ2FsbD86IE9uU3ViVG9vbENhbGw7XG59KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBta2RpclJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJta2RpclwiLFxuICAgIGFyZ3M6IFtcIi1wXCIsIHJwY0Rpcl0sXG4gIH0pO1xuICBpZiAobWtkaXJSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWtkaXJSZXN1bHQubWVzc2FnZSB9O1xuICB9XG4gIGF3YWl0IG1rZGlyUmVzdWx0LnJlc3VsdDtcblxuICBhd2FpdCBzYW5kYm94LndyaXRlRmlsZXMoe1xuICAgIGZpbGVzOiBbXG4gICAgICB7IHBhdGg6IFwicnVubmVyLm1qc1wiLCBjb250ZW50OiBSVU5ORVJfU0NSSVBUIH0sXG4gICAgICB7IHBhdGg6IFwiY29kZS5qc1wiLCBjb250ZW50OiBjb2RlIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6IFwidG9vbHMuanNvblwiLFxuICAgICAgICBjb250ZW50OiBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhhdmFpbGFibGVUb29scykpLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGRlc3RQYXRoOiBycGNEaXIsXG4gIH0pO1xuXG4gIGNvbnN0IG5vZGVNYWpvciA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXCIuXCIpWzBdLCAxMCk7XG4gIGNvbnN0IHBlcm1pc3Npb25GbGFnID1cbiAgICBub2RlTWFqb3IgPj0gMjIgPyBcIi0tcGVybWlzc2lvblwiIDogXCItLWV4cGVyaW1lbnRhbC1wZXJtaXNzaW9uXCI7XG5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgY29tbWFuZDogXCJub2RlXCIsXG4gICAgYXJnczogW1xuICAgICAgcGVybWlzc2lvbkZsYWcsXG4gICAgICBgLS1hbGxvdy1mcy1yZWFkPSR7cnBjRGlyfWAsXG4gICAgICBgLS1hbGxvdy1mcy13cml0ZT0ke3JwY0Rpcn1gLFxuICAgICAgYCR7cnBjRGlyfS9ydW5uZXIubWpzYCxcbiAgICBdLFxuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgfSk7XG5cbiAgaWYgKGV4ZWNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXhlY1Jlc3VsdC5tZXNzYWdlIH07XG4gIH1cblxuICBjb25zdCBmYXRhbDogeyBlcnJvcjogRXJyb3IgfCBudWxsIH0gPSB7IGVycm9yOiBudWxsIH07XG5cbiAgY29uc3QgYWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgaWYgKCFmYXRhbC5lcnJvcikge1xuICAgICAgZmF0YWwuZXJyb3IgPSBlcnJvcjtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVUb29sUmVxdWVzdCA9IGFzeW5jIChyZXF1ZXN0SnNvbjogc3RyaW5nKSA9PiB7XG4gICAgbGV0IHBhcnNlZDogeyBpZDogc3RyaW5nOyB0b29sOiBzdHJpbmc7IGlucHV0OiB1bmtub3duIH07XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVxdWVzdEpzb24pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaWQsIHRvb2w6IHRvb2xOYW1lLCBpbnB1dCB9ID0gcGFyc2VkO1xuXG4gICAgbGV0IHJlc3BvbnNlOiB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBhdmFpbGFibGVUb29sc1t0b29sTmFtZV07XG4gICAgICBpZiAoIXQ/LmV4ZWN1dGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUb29sICR7dG9vbE5hbWV9IG5vdCBmb3VuZCBvciBoYXMgbm8gZXhlY3V0ZSBmdW5jdGlvbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4ZWMgPSB0LmV4ZWN1dGUuYmluZCh0KTtcbiAgICAgIGlmIChvblN1YlRvb2xDYWxsKSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgb25TdWJUb29sQ2FsbCh0b29sTmFtZSwgaW5wdXQsICgpID0+XG4gICAgICAgICAgZXhlYyhpbnB1dCwge1xuICAgICAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjKGlucHV0LCB7XG4gICAgICAgICAgdG9vbENhbGxJZDogYGpzXyR7dG9vbE5hbWV9XyR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3BvbnNlID0geyByZXN1bHQgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgIHJlc3BvbnNlID0geyBlcnJvcjogbXNnIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNhbmRib3gud3JpdGVGaWxlcyh7XG4gICAgICAgIGZpbGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogYCR7aWR9LnJlc3BvbnNlLmpzb25gLFxuICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGRlc3RQYXRoOiBycGNEaXIsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgd3JpdGluZyB0aGUgcmVzcG9uc2UgZmlsZSBmYWlscywgdGhlIHJ1bm5lciB3aWxsIHBvbGwgZm9yZXZlclxuICAgICAgICogd2FpdGluZyBmb3IgaXQuIEFib3J0IHRoZSBydW5uZXIgcHJvY2VzcyBzbyB3ZSBkb24ndCBkZWFkbG9jay5cbiAgICAgICAqL1xuICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgYWJvcnQobmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgUlBDIHJlc3BvbnNlIGZvciAke3Rvb2xOYW1lfTogJHttc2d9YCkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB0b29sQ2FsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgbGV0IHN0ZGVyckJ1ZmZlciA9IFwiXCI7XG4gIGxldCBub25NYXJrZXJTdGRlcnIgPSBcIlwiO1xuXG4gIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBhYm9ydChcbiAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgYEphdmFTY3JpcHQgZXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke0VYRUNVVElPTl9USU1FT1VUX01TIC8gMTAwMH1zYFxuICAgICAgKVxuICAgICk7XG4gIH0sIEVYRUNVVElPTl9USU1FT1VUX01TKTtcblxuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgZXhlY1Jlc3VsdC5sb2dzKCkpIHtcbiAgICAgIGlmIChmYXRhbC5lcnJvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5LnN0cmVhbSA9PT0gXCJzdGRlcnJcIikge1xuICAgICAgICBzdGRlcnJCdWZmZXIgKz0gZW50cnkuZGF0YTtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gc3RkZXJyQnVmZmVyLmluZGV4T2YoUkVRVUVTVF9NQVJLRVJfU1RBUlQpO1xuICAgICAgICAgIGlmIChzdGFydElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZU1hcmtlciA9IHN0ZGVyckJ1ZmZlci5zbGljZSgwLCBzdGFydElkeCk7XG4gICAgICAgICAgaWYgKGJlZm9yZU1hcmtlci50cmltKCkpIHtcbiAgICAgICAgICAgIG5vbk1hcmtlclN0ZGVyciArPSBiZWZvcmVNYXJrZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29udGVudFN0YXJ0ID0gc3RhcnRJZHggKyBSRVFVRVNUX01BUktFUl9TVEFSVC5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gc3RkZXJyQnVmZmVyLmluZGV4T2YoUkVRVUVTVF9NQVJLRVJfRU5ELCBjb250ZW50U3RhcnQpO1xuICAgICAgICAgIGlmIChlbmRJZHggPT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0SnNvbiA9IHN0ZGVyckJ1ZmZlci5zbGljZShjb250ZW50U3RhcnQsIGVuZElkeCk7XG4gICAgICAgICAgc3RkZXJyQnVmZmVyID0gc3RkZXJyQnVmZmVyLnNsaWNlKGVuZElkeCArIFJFUVVFU1RfTUFSS0VSX0VORC5sZW5ndGgpO1xuXG4gICAgICAgICAgdG9vbENhbGxQcm9taXNlcy5wdXNoKGhhbmRsZVRvb2xSZXF1ZXN0KHJlcXVlc3RKc29uKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG5cbiAgaWYgKHN0ZGVyckJ1ZmZlci50cmltKCkpIHtcbiAgICBub25NYXJrZXJTdGRlcnIgKz0gc3RkZXJyQnVmZmVyO1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRvb2xDYWxsUHJvbWlzZXMpO1xuXG4gIGlmIChmYXRhbC5lcnJvcikge1xuICAgIGV4ZWNSZXN1bHQucmVzdWx0LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZXJyb3I6IGZhdGFsLmVycm9yLm1lc3NhZ2UsXG4gICAgICAuLi4obm9uTWFya2VyU3RkZXJyID8geyBzdGRlcnI6IG5vbk1hcmtlclN0ZGVyci5zbGljZSgwLCAyMDAwKSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyLCBleGl0Q29kZSB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvcjogYFJ1bm5lciBmYWlsZWQgKGV4aXQgJHtleGl0Q29kZX0pLmAsXG4gICAgICBzdGRlcnI6IChub25NYXJrZXJTdGRlcnIgKyBzdGRlcnIpLnNsaWNlKDAsIDIwMDApLFxuICAgICAgc3Rkb3V0OiBzdGRvdXQuc2xpY2UoMCwgMTAwMCksXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSmF2YVNjcmlwdFRvb2wob3B0czoge1xuICB0b29sczogVG9vbFNldDtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgb25TdWJUb29sQ2FsbD86IE9uU3ViVG9vbENhbGw7XG59KSB7XG4gIGNvbnN0IHsgc2Vzc2lvbiwgc2FuZGJveCwgb25TdWJUb29sQ2FsbCB9ID0gb3B0cztcbiAgY29uc3QgYWN0aXZlU2V0ID0gc2Vzc2lvbi5hY3RpdmVUb29scyA/IG5ldyBTZXQoc2Vzc2lvbi5hY3RpdmVUb29scykgOiBudWxsO1xuICBjb25zdCBhdmFpbGFibGVUb29sczogVG9vbFNldCA9IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCB0XSBvZiBPYmplY3QuZW50cmllcyhvcHRzLnRvb2xzKSkge1xuICAgIGlmICghYWN0aXZlU2V0IHx8IGFjdGl2ZVNldC5oYXMobmFtZSkpIHtcbiAgICAgIGF2YWlsYWJsZVRvb2xzW25hbWVdID0gdDtcbiAgICB9XG4gIH1cbiAgY29uc3QgY29udGV4dFR5cGUgPSBnZW5lcmF0ZUNvbnRleHRUeXBlU3RyaW5nKGF2YWlsYWJsZVRvb2xzKTtcblxuICByZXR1cm4gdG9vbCh7XG4gICAgLi4uYnVpbHRJblRvb2xzLkphdmFTY3JpcHQsXG4gICAgZGVzY3JpcHRpb246IGBFeGVjdXRlIEphdmFTY3JpcHQgdG8gb3JjaGVzdHJhdGUgbXVsdGlwbGUgdG9vbCBjYWxscyBpbiBhIHNpbmdsZSBzdGVwLiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIHRvIHJ1biBzZXZlcmFsIHRvb2xzIGluIHNlcXVlbmNlLCB0cmFuc2Zvcm0gaW50ZXJtZWRpYXRlIHJlc3VsdHMsIG9yIHBhcmFsbGVsaXplIGluZGVwZW5kZW50IG9wZXJhdGlvbnMgd2l0aCBQcm9taXNlLmFsbC5cblxuVGhlIGNvZGUgcnVucyBhcyBhbiBhc3luYyBmdW5jdGlvbiBib2R5IHdpdGggXFxgY3R4XFxgIGluIHNjb3BlOlxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4ke2NvbnRleHRUeXBlfVxuXFxgXFxgXFxgXG5cbkV4YW1wbGVzOlxuLSBTZXF1ZW50aWFsOiBcXGBjb25zdCBmaWxlID0gYXdhaXQgY3R4LnRvb2xzLlJlYWQoeyBwYXRoOiBcInBhY2thZ2UuanNvblwiIH0pOyByZXR1cm4gSlNPTi5wYXJzZShmaWxlLmNvbnRlbnQpO1xcYFxuLSBQYXJhbGxlbDogXFxgY29uc3QgW2EsIGJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2N0eC50b29scy5SZWFkKHsgcGF0aDogXCJhLnRzXCIgfSksIGN0eC50b29scy5SZWFkKHsgcGF0aDogXCJiLnRzXCIgfSldKTsgcmV0dXJuIHsgYTogYS5jb250ZW50LCBiOiBiLmNvbnRlbnQgfTtcXGBcbi0gVHJhbnNmb3JtOiBcXGBjb25zdCBncmVwID0gYXdhaXQgY3R4LnRvb2xzLkdyZXAoeyBwYXR0ZXJuOiBcIlRPRE9cIiB9KTsgcmV0dXJuIGdyZXAubWF0Y2hlcy5zcGxpdChcIlxcXFxuXCIpLmxlbmd0aDtcXGBcblxuUmV0dXJuIGEgdmFsdWUgdG8gcGFzcyByZXN1bHRzIGJhY2suIFVzZSBjb25zb2xlLmxvZygpIGZvciBkZWJ1ZyBvdXRwdXQuYCxcbiAgICBleGVjdXRlOiAoeyBjb2RlIH0pID0+IHtcbiAgICAgIGNvbnN0IHJ1bklkID0gYHJ1bl8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKVxuICAgICAgICAudG9TdHJpbmcoMzYpXG4gICAgICAgIC5zbGljZSgyLCA4KX1gO1xuICAgICAgY29uc3QgcnBjRGlyID0gYC5hZ2VudC9qcy1ycGMvJHtydW5JZH1gO1xuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgICByZXR1cm4gZXhlY3V0ZUluU2FuZGJveCh7XG4gICAgICAgIGNvZGUsXG4gICAgICAgIHJwY0RpcixcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLFxuICAgICAgICBzYW5kYm94LFxuICAgICAgICBhdmFpbGFibGVUb29scyxcbiAgICAgICAgb25TdWJUb29sQ2FsbCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgSlNPTlZhbHVlLCBNb2RlbE1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcblxudHlwZSBQcm92aWRlck9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBKU09OVmFsdWU+PjtcblxuY29uc3QgQU5USFJPUElDX01BWF9DQUNIRV9CUkVBS1BPSU5UU19QRVJfUkVRVUVTVCA9IDQ7XG5cbmNvbnN0IENMQVVERV9MSUtFX01PREVMX01BVENIRVJTID0gW1wiY2xhdWRlXCIsIFwiYW50aHJvcGljXCJdO1xuXG5jb25zdCBDTEFVREVfUFJPTVBUX0NBQ0hJTkdfUFJPVklERVJfT1BUSU9OUzogUHJvdmlkZXJPcHRpb25zID0ge1xuICBhbnRocm9waWM6IHtcbiAgICBjYWNoZUNvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBvcGVucm91dGVyOiB7XG4gICAgY2FjaGVDb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbiAgYmVkcm9jazoge1xuICAgIGNhY2hlUG9pbnQ6IHsgdHlwZTogXCJkZWZhdWx0XCIgfSxcbiAgfSxcbiAgb3BlbmFpQ29tcGF0aWJsZToge1xuICAgIGNhY2hlX2NvbnRyb2w6IHsgdHlwZTogXCJlcGhlbWVyYWxcIiB9LFxuICB9LFxuICBjb3BpbG90OiB7XG4gICAgY29waWxvdF9jYWNoZV9jb250cm9sOiB7IHR5cGU6IFwiZXBoZW1lcmFsXCIgfSxcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEdhdGV3YXlQcm92aWRlcihtb2RlbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHNsYXNoSW5kZXggPSBtb2RlbC5pbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG1vZGVsLnNsaWNlKDAsIHNsYXNoSW5kZXgpO1xufVxuXG5mdW5jdGlvbiBjb3VudEFudGhyb3BpY0NhY2hlQnJlYWtwb2ludHMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogbnVtYmVyIHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgY29uc3QgcHJvdmlkZXJPcHRpb25zID0gKG1lc3NhZ2UgYXMgeyBwcm92aWRlck9wdGlvbnM/OiBQcm92aWRlck9wdGlvbnMgfSlcbiAgICAgIC5wcm92aWRlck9wdGlvbnM7XG4gICAgaWYgKHByb3ZpZGVyT3B0aW9ucz8uYW50aHJvcGljPy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgcGFydFByb3ZpZGVyT3B0aW9ucyA9IChcbiAgICAgICAgICBwYXJ0IGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICAgICAgKS5wcm92aWRlck9wdGlvbnM7XG4gICAgICAgIGlmIChwYXJ0UHJvdmlkZXJPcHRpb25zPy5hbnRocm9waWM/LmNhY2hlQ29udHJvbCkge1xuICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG5mdW5jdGlvbiBpc0NsYXVkZUxpa2VNb2RlbChtb2RlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxvd2VyID0gbW9kZWwudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIENMQVVERV9MSUtFX01PREVMX01BVENIRVJTLnNvbWUoKG0pID0+IGxvd2VyLmluY2x1ZGVzKG0pKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm92aWRlck9wdGlvbnMob3B0czoge1xuICBjdXJyZW50OiBQcm92aWRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIHBhdGNoOiBQcm92aWRlck9wdGlvbnM7XG59KTogUHJvdmlkZXJPcHRpb25zIHtcbiAgY29uc3QgbmV4dDogUHJvdmlkZXJPcHRpb25zID0geyAuLi4ob3B0cy5jdXJyZW50ID8/IHt9KSB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLnBhdGNoKSkge1xuICAgIG5leHRba2V5XSA9IHsgLi4uKG5leHRba2V5XSA/PyB7fSksIC4uLnZhbHVlIH07XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2FjaGVhYmxlQ2xhdWRlUGFydChwYXJ0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghcGFydCB8fCB0eXBlb2YgcGFydCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcInR5cGVcIiBpbiBwYXJ0ICYmIChwYXJ0IGFzIHsgdHlwZT86IHVua25vd24gfSkudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHBhcnQgYXMgeyB0ZXh0PzogdW5rbm93biB9KS50ZXh0O1xuICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRleHQudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG5cbiAgaWYgKFwidHlwZVwiIGluIHBhcnQpIHtcbiAgICBjb25zdCB0eXBlID0gKHBhcnQgYXMgeyB0eXBlPzogdW5rbm93biB9KS50eXBlO1xuICAgIGlmICh0eXBlID09PSBcInRoaW5raW5nXCIgfHwgdHlwZSA9PT0gXCJyZWFzb25pbmdcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNDYWNoZWFibGVDb250ZW50KG1lc3NhZ2U6IE1vZGVsTWVzc2FnZSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudC5zb21lKChwYXJ0KSA9PiBpc0NhY2hlYWJsZUNsYXVkZVBhcnQocGFydCkpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENhY2hlYWJsZVBhcnRJbmRleChjb250ZW50OiB1bmtub3duW10pOiBudW1iZXIgfCBudWxsIHtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBpZiAoaXNDYWNoZWFibGVDbGF1ZGVQYXJ0KGNvbnRlbnRbaV0pKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdENsYXVkZUNhY2hpbmdUYXJnZXRzKG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSk6IG51bWJlcltdIHtcbiAgY29uc3Qgc3lzdGVtSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZmluYWxJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoICYmIHN5c3RlbUluZGljZXMubGVuZ3RoIDwgMjsgaSArPSAxKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwic3lzdGVtXCIgJiYgaGFzQ2FjaGVhYmxlQ29udGVudChtZXNzYWdlKSkge1xuICAgICAgc3lzdGVtSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDAgJiYgZmluYWxJbmRpY2VzLmxlbmd0aCA8IDI7IGkgLT0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcbiAgICBpZiAobWVzc2FnZS5yb2xlICE9PSBcInN5c3RlbVwiICYmIGhhc0NhY2hlYWJsZUNvbnRlbnQobWVzc2FnZSkpIHtcbiAgICAgIGZpbmFsSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmFsSW5kaWNlcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIFsuLi5zeXN0ZW1JbmRpY2VzLCAuLi5maW5hbEluZGljZXNdO1xufVxuXG5mdW5jdGlvbiBhcHBseUNsYXVkZVByb21wdENhY2hpbmcob3B0czoge1xuICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW107XG4gIHByb3ZpZGVySWQ6IHN0cmluZyB8IG51bGw7XG4gIG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdDogbnVtYmVyO1xufSk6IE1vZGVsTWVzc2FnZVtdIHtcbiAgY29uc3QgZXhpc3RpbmdCcmVha3BvaW50cyA9IGNvdW50QW50aHJvcGljQ2FjaGVCcmVha3BvaW50cyhvcHRzLm1lc3NhZ2VzKTtcbiAgY29uc3QgcmVtYWluaW5nQnVkZ2V0ID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICBvcHRzLm1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCAtIGV4aXN0aW5nQnJlYWtwb2ludHNcbiAgKTtcblxuICBpZiAocmVtYWluaW5nQnVkZ2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdHMubWVzc2FnZXM7XG4gIH1cblxuICBjb25zdCB0YXJnZXRJbmRpY2VzID0gc2VsZWN0Q2xhdWRlQ2FjaGluZ1RhcmdldHMob3B0cy5tZXNzYWdlcykuc2xpY2UoXG4gICAgMCxcbiAgICByZW1haW5pbmdCdWRnZXRcbiAgKTtcbiAgaWYgKHRhcmdldEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9wdHMubWVzc2FnZXM7XG4gIH1cblxuICBjb25zdCB1c2VNZXNzYWdlTGV2ZWxPcHRpb25zID1cbiAgICBvcHRzLnByb3ZpZGVySWQgPT09IFwiYW50aHJvcGljXCIgfHxcbiAgICBCb29sZWFuKG9wdHMucHJvdmlkZXJJZD8uaW5jbHVkZXMoXCJiZWRyb2NrXCIpKTtcblxuICBjb25zdCBuZXh0TWVzc2FnZXMgPSBvcHRzLm1lc3NhZ2VzLnNsaWNlKCk7XG5cbiAgZm9yIChjb25zdCBtZXNzYWdlSW5kZXggb2YgdGFyZ2V0SW5kaWNlcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcblxuICAgIGNvbnN0IHNob3VsZFVzZUNvbnRlbnRPcHRpb25zID1cbiAgICAgICF1c2VNZXNzYWdlTGV2ZWxPcHRpb25zICYmXG4gICAgICBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgJiZcbiAgICAgIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHNob3VsZFVzZUNvbnRlbnRPcHRpb25zICYmIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgY29uc3QgcGFydEluZGV4ID0gZmluZExhc3RDYWNoZWFibGVQYXJ0SW5kZXgobWVzc2FnZS5jb250ZW50KTtcbiAgICAgIGlmIChwYXJ0SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcGFydCA9IG1lc3NhZ2UuY29udGVudFtwYXJ0SW5kZXhdO1xuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGNvbnN0IHBhcnRQcm92aWRlck9wdGlvbnMgPSAoXG4gICAgICAgICAgICBwYXJ0IGFzIHsgcHJvdmlkZXJPcHRpb25zPzogUHJvdmlkZXJPcHRpb25zIH1cbiAgICAgICAgICApLnByb3ZpZGVyT3B0aW9ucztcblxuICAgICAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50LnNsaWNlKCk7XG4gICAgICAgICAgbmV4dENvbnRlbnRbcGFydEluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLihwYXJ0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogbWVyZ2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgICAgICAgICBjdXJyZW50OiBwYXJ0UHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgICAgICBwYXRjaDogQ0xBVURFX1BST01QVF9DQUNISU5HX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9IGFzICh0eXBlb2YgbWVzc2FnZS5jb250ZW50KVtudW1iZXJdO1xuXG4gICAgICAgICAgbmV4dE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgY29udGVudDogbmV4dENvbnRlbnQsXG4gICAgICAgICAgfSBhcyBNb2RlbE1lc3NhZ2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlUHJvdmlkZXJPcHRpb25zID0gKFxuICAgICAgbWVzc2FnZSBhcyB7IHByb3ZpZGVyT3B0aW9ucz86IFByb3ZpZGVyT3B0aW9ucyB9XG4gICAgKS5wcm92aWRlck9wdGlvbnM7XG5cbiAgICBuZXh0TWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICBwcm92aWRlck9wdGlvbnM6IG1lcmdlUHJvdmlkZXJPcHRpb25zKHtcbiAgICAgICAgY3VycmVudDogbWVzc2FnZVByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgcGF0Y2g6IENMQVVERV9QUk9NUFRfQ0FDSElOR19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBuZXh0TWVzc2FnZXM7XG59XG5cbmV4cG9ydCB0eXBlIFByb21wdENhY2hpbmdSZXN1bHQgPSB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcHJvdmlkZXJPcHRpb25zOiBQcm92aWRlck9wdGlvbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQcm9tcHRDYWNoaW5nVG9Nb2RlbFJlcXVlc3Qob3B0czoge1xuICBtb2RlbDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICBhbnRocm9waWM/OiB7IG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdD86IG51bWJlciB9O1xuICBvcGVuYWk/OiB7IHNldFByb21wdENhY2hlS2V5PzogYm9vbGVhbiB9O1xufSk6IFByb21wdENhY2hpbmdSZXN1bHQge1xuICBjb25zdCBwcm92aWRlciA9IGdldEdhdGV3YXlQcm92aWRlcihvcHRzLm1vZGVsKTtcblxuICBjb25zdCBwcm92aWRlck9wdGlvbnM6IFByb3ZpZGVyT3B0aW9ucyA9IHt9O1xuXG4gIGlmIChcbiAgICAocHJvdmlkZXIgPT09IFwib3BlbmFpXCIgfHwgcHJvdmlkZXIgPT09IFwiYXp1cmVcIikgJiZcbiAgICBvcHRzLm9wZW5haT8uc2V0UHJvbXB0Q2FjaGVLZXkgIT09IGZhbHNlXG4gICkge1xuICAgIHByb3ZpZGVyT3B0aW9ucy5vcGVuYWkgPSB7IHByb21wdENhY2hlS2V5OiBvcHRzLnNlc3Npb25JZCB9O1xuICB9XG5cbiAgY29uc3QgbWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0ID1cbiAgICBvcHRzLmFudGhyb3BpYz8ubWF4QnJlYWtwb2ludHNQZXJSZXF1ZXN0ID8/XG4gICAgQU5USFJPUElDX01BWF9DQUNIRV9CUkVBS1BPSU5UU19QRVJfUkVRVUVTVDtcblxuICBjb25zdCBjYWNoZWRNZXNzYWdlcyA9IGlzQ2xhdWRlTGlrZU1vZGVsKG9wdHMubW9kZWwpXG4gICAgPyBhcHBseUNsYXVkZVByb21wdENhY2hpbmcoe1xuICAgICAgICBtZXNzYWdlczogb3B0cy5tZXNzYWdlcyxcbiAgICAgICAgcHJvdmlkZXJJZDogcHJvdmlkZXIsXG4gICAgICAgIG1heEJyZWFrcG9pbnRzUGVyUmVxdWVzdCxcbiAgICAgIH0pXG4gICAgOiBvcHRzLm1lc3NhZ2VzO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXM6IGNhY2hlZE1lc3NhZ2VzLFxuICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1VJUGFydCwgVGV4dFVJUGFydCwgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG4vKiogU3ViLXRvb2wgcGFydHMgKGZyb20gSmF2YVNjcmlwdCBtZXRhLXRvb2wpIHVzZSB0aGlzIHRvb2xDYWxsSWQgcHJlZml4LiAqL1xuZnVuY3Rpb24gaXNTdWJUb29sUGFydChwYXJ0OiBQYXJ0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSBwYXJ0LnBhcnQgYXMgeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gIHJldHVybiB0eXBlb2YgcD8udG9vbENhbGxJZCA9PT0gXCJzdHJpbmdcIiAmJiBwLnRvb2xDYWxsSWQuc3RhcnRzV2l0aChcImpzX3RjX1wiKTtcbn1cblxuZnVuY3Rpb24gaXNTdHJlYW1pbmdDb250ZW50KFxuICBwYXJ0OiB1bmtub3duXG4pOiBwYXJ0IGlzIFRleHRVSVBhcnQgfCBSZWFzb25pbmdVSVBhcnQge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgcGFydCAhPT0gbnVsbCAmJlxuICAgIFwidHlwZVwiIGluIHBhcnQgJiZcbiAgICAocGFydC50eXBlID09PSBcInRleHRcIiB8fCBwYXJ0LnR5cGUgPT09IFwicmVhc29uaW5nXCIpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUludGVycnVwdEN1dG9mZih7XG4gIHBhcnRzLFxuICBsYXN0UGFydCxcbn06IHtcbiAgcGFydHM6IFBhcnRbXTtcbiAgbGFzdFBhcnQ6IHsgaW5kZXg6IG51bWJlcjsgcGFydDogdW5rbm93biB9O1xufSk6IFBhcnRbXSB7XG4gIHJldHVybiBwYXJ0c1xuICAgIC5maWx0ZXIoKHApID0+IHAuaW5kZXggPD0gbGFzdFBhcnQuaW5kZXgpXG4gICAgLm1hcCgocCkgPT4ge1xuICAgICAgaWYgKHAuaW5kZXggIT09IGxhc3RQYXJ0LmluZGV4KSB7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IHJlcGxhY2UgY29udGVudCBmb3Igc3RyZWFtaW5nIHBhcnRzICh0ZXh0LCByZWFzb25pbmcpIHdoZXJlIHRoZVxuICAgICAgICogY2xpZW50J3MgdHJ1bmNhdGVkIHZlcnNpb24gaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBzZXJ2ZXIncyBmdWxsXG4gICAgICAgKiB2ZXJzaW9uLiBGb3Igc3RhdGVmdWwgcGFydHMgKHRvb2xzKSwgdGhlIHNlcnZlcidzIHZlcnNpb24gaXNcbiAgICAgICAqIGF1dGhvcml0YXRpdmUgXHUyMDE0IGl0IG1heSBoYXZlIGV2b2x2ZWQgKGUuZy4gYXBwcm92YWwtcmVxdWVzdGVkIFx1MjE5MlxuICAgICAgICogb3V0cHV0LWRlbmllZCkgYWZ0ZXIgdGhlIGNsaWVudCBzbmFwc2hvdCB3YXMgdGFrZW4uXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1N0cmVhbWluZ0NvbnRlbnQobGFzdFBhcnQucGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ucCwgcGFydDogbGFzdFBhcnQucGFydCB9IGFzIFBhcnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcDtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVUlNZXNzYWdlcyhvcHRzOiB7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlW107XG4gIHBhcnRzOiBQYXJ0W107XG4gIHVudGlsPzogbnVtYmVyO1xuICBpbmNsdWRlUXVldWVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZmlsdGVycyBvdXQgc3ViLXRvb2wgcGFydHMgc28gdGhlIExMTSBkb2Vzbid0IHNlZSB0aGVtLiAqL1xuICBleGNsdWRlU3ViVG9vbFBhcnRzPzogYm9vbGVhbjtcbn0pOiBVSU1lc3NhZ2VbXSB7XG4gIGxldCBmaWx0ZXJlZCA9IG9wdHMubWVzc2FnZXM7XG5cbiAgaWYgKG9wdHMudW50aWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHVudGlsID0gb3B0cy51bnRpbDtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5jcmVhdGVkQXQgPD0gdW50aWwpO1xuICB9XG5cbiAgaWYgKCFvcHRzLmluY2x1ZGVRdWV1ZWQpIHtcbiAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigobSkgPT4gbS5zdGFydGVkQXQgIT09IG51bGwpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBvcHRzLmV4Y2x1ZGVTdWJUb29sUGFydHNcbiAgICA/IG9wdHMucGFydHMuZmlsdGVyKChwKSA9PiAhaXNTdWJUb29sUGFydChwKSlcbiAgICA6IG9wdHMucGFydHM7XG5cbiAgY29uc3QgcGFydHNCeU1lc3NhZ2UgPSBuZXcgTWFwPHN0cmluZywgUGFydFtdPigpO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcnRzQnlNZXNzYWdlLmdldChwYXJ0Lm1lc3NhZ2VJZCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaChwYXJ0KTtcbiAgICBwYXJ0c0J5TWVzc2FnZS5zZXQocGFydC5tZXNzYWdlSWQsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJlZFxuICAgIC5tYXAoKG0pID0+IHtcbiAgICAgIGxldCBtZXNzYWdlUGFydHMgPSBwYXJ0c0J5TWVzc2FnZS5nZXQobS5pZCkgPz8gW107XG4gICAgICBtZXNzYWdlUGFydHMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuXG4gICAgICBpZiAobS5pbnRlcnJ1cHRlZExhc3RQYXJ0ICE9IG51bGwpIHtcbiAgICAgICAgbWVzc2FnZVBhcnRzID0gYXBwbHlJbnRlcnJ1cHRDdXRvZmYoe1xuICAgICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMsXG4gICAgICAgICAgbGFzdFBhcnQ6IG0uaW50ZXJydXB0ZWRMYXN0UGFydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBtLmlkLFxuICAgICAgICByb2xlOiBtLnJvbGUsXG4gICAgICAgIHBhcnRzOiBtZXNzYWdlUGFydHMubWFwKChwKSA9PiBwLnBhcnQpLFxuICAgICAgfSBzYXRpc2ZpZXMgVUlNZXNzYWdlO1xuICAgIH0pXG4gICAgLmZpbHRlcigobSkgPT4gbS5wYXJ0cy5sZW5ndGggPiAwKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0ZXBVc2FnZSwgVXNhZ2VTdW1tYXJ5IH0gZnJvbSBcIi4uL3N0b3JhZ2UvcnBjXCI7XG5cbmV4cG9ydCB0eXBlIHsgU3RlcFVzYWdlLCBVc2FnZVN1bW1hcnkgfTtcblxuZnVuY3Rpb24gc3VtKGl0ZW1zOiBTdGVwVXNhZ2VbXSwga2V5OiBrZXlvZiBTdGVwVXNhZ2UpOiBudW1iZXIge1xuICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1ba2V5XTtcbiAgICByZXR1cm4gYWNjICsgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IHZhbHVlIDogMCk7XG4gIH0sIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVVzYWdlU3VtbWFyeShzdGVwczogU3RlcFVzYWdlW10pOiBVc2FnZVN1bW1hcnkge1xuICByZXR1cm4ge1xuICAgIG1vZGVsOiBzdGVwc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bShzdGVwcywgXCJpbnB1dFRva2Vuc1wiKSxcbiAgICBvdXRwdXRUb2tlbnM6IHN1bShzdGVwcywgXCJvdXRwdXRUb2tlbnNcIiksXG4gICAgdG90YWxUb2tlbnM6IHN1bShzdGVwcywgXCJ0b3RhbFRva2Vuc1wiKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bShzdGVwcywgXCJjYWNoZVJlYWRUb2tlbnNcIiksXG4gICAgY2FjaGVXcml0ZVRva2Vuczogc3VtKHN0ZXBzLCBcImNhY2hlV3JpdGVUb2tlbnNcIiksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBzdW0oc3RlcHMsIFwicmVhc29uaW5nVG9rZW5zXCIpLFxuICAgIHN0ZXBDb3VudDogc3RlcHMubGVuZ3RoLFxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uVXNhZ2UgPSB7XG4gIHRvdGFsOiBVc2FnZVN1bW1hcnkgJiB7IG1lc3NhZ2VDb3VudDogbnVtYmVyIH07XG4gIGJ5TWVzc2FnZUlkOiBSZWNvcmQ8c3RyaW5nLCBVc2FnZVN1bW1hcnkgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2Vzc2lvblVzYWdlKFxuICBtZXNzYWdlczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNhZ2U6IHsgc3RlcHM6IFN0ZXBVc2FnZVtdOyBzdW1tYXJ5OiBVc2FnZVN1bW1hcnkgfSB8IG51bGw7XG4gIH0+XG4pOiBTZXNzaW9uVXNhZ2Uge1xuICBjb25zdCBieU1lc3NhZ2VJZDogUmVjb3JkPHN0cmluZywgVXNhZ2VTdW1tYXJ5IHwgbnVsbD4gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lc3NhZ2VzKSB7XG4gICAgYnlNZXNzYWdlSWRbbS5pZF0gPSBtLnVzYWdlPy5zdW1tYXJ5ID8/IG51bGw7XG4gIH1cblxuICBjb25zdCBzdW1tYXJpZXMgPSBtZXNzYWdlc1xuICAgIC5tYXAoKG0pID0+IG0udXNhZ2U/LnN1bW1hcnkpXG4gICAgLmZpbHRlcigocyk6IHMgaXMgVXNhZ2VTdW1tYXJ5ID0+IHMgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdG90YWwgPSB7XG4gICAgbW9kZWw6IHN1bW1hcmllc1swXT8ubW9kZWwgPz8gXCJ1bmtub3duXCIsXG4gICAgaW5wdXRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5pbnB1dFRva2VucywgMCksXG4gICAgb3V0cHV0VG9rZW5zOiBzdW1tYXJpZXMucmVkdWNlKChhY2MsIHMpID0+IGFjYyArIHMub3V0cHV0VG9rZW5zLCAwKSxcbiAgICB0b3RhbFRva2Vuczogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnRvdGFsVG9rZW5zLCAwKSxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVJlYWRUb2tlbnMsIDApLFxuICAgIGNhY2hlV3JpdGVUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5jYWNoZVdyaXRlVG9rZW5zLCAwKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IHN1bW1hcmllcy5yZWR1Y2UoKGFjYywgcykgPT4gYWNjICsgcy5yZWFzb25pbmdUb2tlbnMsIDApLFxuICAgIHN0ZXBDb3VudDogc3VtbWFyaWVzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLnN0ZXBDb3VudCwgMCksXG4gICAgbWVzc2FnZUNvdW50OiBzdW1tYXJpZXMubGVuZ3RoLFxuICB9O1xuXG4gIHJldHVybiB7IHRvdGFsLCBieU1lc3NhZ2VJZCB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcsIFRvb2wsIFRvb2xTZXQgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50UnBjT3ZlcnJpZGVzLFxuICBBZ2VudFJwY1Jlc3VsdCxcbiAgQWdlbnRTdGF0dXMsXG4gIFJwY1Jlc3VsdCxcbn0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgeyBnZXRTYW5kYm94IH0gZnJvbSBcIi4vc2FuZGJveFwiO1xuaW1wb3J0IHR5cGUge1xuICBTdG9yYWdlIGFzIEFnZW50U3RvcmFnZSxcbiAgTWV0aG9kTmFtZSxcbiAgUnBjRm4sXG4gIFJwY1JlcXVlc3QsXG4gIFJwY1Jlc3BvbnNlLFxuICBTYW5kYm94UmVjb3JkLFxuICBTZXNzaW9uLFxuICBTdG9yYWdlQ29uZmlnLFxuICBIYW5kbGVycyBhcyBTdG9yYWdlSGFuZGxlcnMsXG59IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB7IFNUT1JBR0VfUlBDX01FVEhPRFMgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgcmVzb2x2ZUFwaVVybCwgdHlwZSBUb29sQ29udGV4dCB9IGZyb20gXCIuL3Rvb2xzXCI7XG5cbmV4cG9ydCB0eXBlIFRvb2xNZXRhZGF0YSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaW5wdXRTY2hlbWE/OiBKU09OU2NoZW1hNztcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2xzRXhlY3V0ZVBhcmFtcyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBpbnB1dDogdW5rbm93bjtcbiAgc2Vzc2lvbjogU2Vzc2lvbjtcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbiAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEJlZm9yZVBhcmFtcyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBpbnB1dDogdW5rbm93bjtcbiAgY29udGV4dDogVG9vbENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEJlZm9yZVJlc3VsdCA9IHtcbiAgaW5wdXQ/OiB1bmtub3duO1xuICBzdG9wPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEhvb2tUb29sQWZ0ZXJQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHJlc3VsdDogdW5rbm93bjtcbiAgY29udGV4dDogVG9vbENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEFmdGVyUmVzdWx0ID0ge1xuICByZXN1bHQ/OiB1bmtub3duO1xuICBzdG9wPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcyA9IHtcbiAgdG9vbE5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgbWVzc2FnZXM6IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFRvb2xzTmVlZHNBcHByb3ZhbFJlc3VsdCA9IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIEhvb2tTdGF0dXNQYXJhbXMgPSB7XG4gIHN0YXR1czogQWdlbnRTdGF0dXM7XG59O1xuXG5leHBvcnQgdHlwZSBIb29rU3RhdHVzUmVzdWx0ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuXG50eXBlIEFnZW50SG9va3MgPSB7XG4gIFwidG9vbC5iZWZvcmVcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgaW5wdXQ6IHVua25vd24gfT47XG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xuICBzdGF0dXM/OiAoc3RhdHVzOiBBZ2VudFN0YXR1cykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59O1xuXG50eXBlIE5lZWRzQXBwcm92YWxFbnRyeSA9XG4gIHwgYm9vbGVhblxuICB8ICgoXG4gICAgICBpbnB1dDogdW5rbm93bixcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgdG9vbENhbGxJZDogc3RyaW5nO1xuICAgICAgICBtZXNzYWdlczogdW5rbm93bltdO1xuICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5rbm93bjtcbiAgICAgIH1cbiAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTtcblxuZXhwb3J0IHR5cGUgRGlzcGF0Y2hDb250ZXh0ID0ge1xuICB0b29sczogVG9vbFNldCB8IHVuZGVmaW5lZDtcbiAgaG9va3M6IEFnZW50SG9va3MgfCB1bmRlZmluZWQ7XG4gIG5lZWRzQXBwcm92YWw6IFJlY29yZDxzdHJpbmcsIE5lZWRzQXBwcm92YWxFbnRyeT4gfCB1bmRlZmluZWQ7XG4gIHN0b3JhZ2VDb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIGdldFN0b3JhZ2VJbnN0YW5jZTogKCkgPT4gQWdlbnRTdG9yYWdlO1xuICBnZXRTdG9yYWdlSGFuZGxlcnM6IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8U3RvcmFnZUhhbmRsZXJzPjtcbiAgcnBjOiBScGNGbjtcbiAgb3ZlcnJpZGVzPzogQWdlbnRScGNPdmVycmlkZXM7XG59O1xuXG4vKiogRGVmYXVsdCBuZWVkc0FwcHJvdmFsIGZvciBidWlsdC1pbiB0b29scyAodXNlciBjYW4gb3ZlcnJpZGUgdmlhIG5lZWRzQXBwcm92YWwgY29uZmlnKS4gKi9cbmNvbnN0IGJ1aWx0aW5OZWVkc0FwcHJvdmFsOiBQYXJ0aWFsPFxuICBSZWNvcmQ8QnVpbHRJblRvb2xOYW1lLCBOZWVkc0FwcHJvdmFsRW50cnk+XG4+ID0ge1xuICBCYXNoOiB0cnVlLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvdmVycmlkZSByZXN1bHQgdG8gUnBjUmVzdWx0LCBvciBudWxsIHRvIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlT3ZlcnJpZGVSZXN1bHQ8VD4ocmVzOiBBZ2VudFJwY1Jlc3VsdDxUPik6IFJwY1Jlc3VsdDxUPiB8IG51bGwge1xuICBpZiAocmVzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHJlcy5vaykge1xuICAgIHJldHVybiB7IHJlc3VsdDogcmVzLnJlc3VsdCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHsgY29kZTogXCJIQU5ETEVSX0VSUk9SXCIsIG1lc3NhZ2U6IHJlcy5lcnJvciB9LFxuICAgIHN0YXR1czogNDAwLFxuICB9O1xufVxuXG4vKipcbiAqIEludGVybmFsIGRpc3BhdGNoIGZ1bmN0aW9uLiBSZXR1cm5zIFJwY1Jlc3VsdCwgbm90IFJlc3BvbnNlLlxuICogRW5hYmxlcyByZWN1cnNpdmUgY2FsbHMgZm9yIGhvb2tzIHdpdGhvdXQgSlNPTiByb3VuZC10cmlwcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoKFxuICBtZXRob2Q6IHN0cmluZyxcbiAgcGFyYW1zOiB1bmtub3duLFxuICBjb250ZXh0OiBEaXNwYXRjaENvbnRleHQsXG4gIG5hbWU/OiBzdHJpbmdcbik6IFByb21pc2U8UnBjUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICB0b29scyxcbiAgICBob29rcyxcbiAgICBuZWVkc0FwcHJvdmFsLFxuICAgIHN0b3JhZ2VDb25maWcsXG4gICAgZ2V0U3RvcmFnZUluc3RhbmNlLFxuICAgIGdldFN0b3JhZ2VIYW5kbGVycyxcbiAgICBycGMsXG4gICAgb3ZlcnJpZGVzLFxuICB9ID0gY29udGV4dDtcblxuICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgIGNhc2UgXCJ0b29scy5saXN0XCI6IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gKCk6IFJwY1Jlc3VsdDxUb29sTWV0YWRhdGFbXT4gPT4ge1xuICAgICAgICBjb25zdCB0b29sc01hcCA9IHRvb2xzID8/ICh7fSBhcyBUb29sU2V0KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXModG9vbHNNYXApLm1hcCgoW25hbWUsIHRdKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICh0IGFzIFRvb2wpLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiBzY2hlbWFUb0pzb25TY2hlbWEoKHQgYXMgVG9vbCkuaW5wdXRTY2hlbWEpLFxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcInRvb2xzLmxpc3RcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/Lih7fSk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIQU5ETEVSX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwidG9vbHMubmVlZHNBcHByb3ZhbFwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ8Ym9vbGVhbj4+ID0+IHtcbiAgICAgICAgLy8gMS4gUGVyLXRvb2wgbmVlZHNBcHByb3ZhbCBvbiBjdXN0b20gdG9vbHMgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSB0b29sc01hcFtwLnRvb2xOYW1lXSBhcyBUb29sIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodG9vbERlZj8ubmVlZHNBcHByb3ZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0b29sRGVmLm5lZWRzQXBwcm92YWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IHRvb2xEZWYubmVlZHNBcHByb3ZhbCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b29sRGVmLm5lZWRzQXBwcm92YWwocC5pbnB1dCwge1xuICAgICAgICAgICAgdG9vbENhbGxJZDogcC50b29sQ2FsbElkLFxuICAgICAgICAgICAgbWVzc2FnZXM6IHAubWVzc2FnZXMgYXMgbmV2ZXJbXSxcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBBZ2VudC1sZXZlbCBuZWVkc0FwcHJvdmFsIG1hcCwgZmFsbGluZyBiYWNrIHRvIGJ1aWx0LWluIGRlZmF1bHRzXG4gICAgICAgIGNvbnN0IGVudHJ5ID1cbiAgICAgICAgICBuZWVkc0FwcHJvdmFsPy5bcC50b29sTmFtZV0gPz9cbiAgICAgICAgICBidWlsdGluTmVlZHNBcHByb3ZhbFtwLnRvb2xOYW1lIGFzIEJ1aWx0SW5Ub29sTmFtZV0gPz9cbiAgICAgICAgICBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IGVudHJ5IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50cnkocC5pbnB1dCwge1xuICAgICAgICAgIHRvb2xDYWxsSWQ6IHAudG9vbENhbGxJZCxcbiAgICAgICAgICBtZXNzYWdlczogcC5tZXNzYWdlcyxcbiAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcz8uW1widG9vbHMubmVlZHNBcHByb3ZhbFwiXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHApO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVkID0gaGFuZGxlT3ZlcnJpZGVSZXN1bHQob3ZlcnJpZGVSZXN1bHQpO1xuICAgICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmF1bHRIYW5kbGVyKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiTkVFRFNfQVBQUk9WQUxfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgXCJob29rLnRvb2wuYmVmb3JlXCI6IHtcbiAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgSG9va1Rvb2xCZWZvcmVQYXJhbXM7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gYXN5bmMgKFxuICAgICAgICBob29rUGFyYW1zOiBIb29rVG9vbEJlZm9yZVBhcmFtc1xuICAgICAgKTogUHJvbWlzZTxIb29rVG9vbEJlZm9yZVJlc3VsdD4gPT4ge1xuICAgICAgICBpZiAoIWhvb2tzPy5bXCJ0b29sLmJlZm9yZVwiXSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgaG9va3NbXCJ0b29sLmJlZm9yZVwiXShob29rUGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGhvb2tSZXN1bHQgPz8ge307XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcz8uW1wiaG9vay50b29sLmJlZm9yZVwiXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGN1cnJlbnRQYXJhbXMgPSBwO1xuICAgICAgICBsZXQgbWVyZ2VkOiBIb29rVG9vbEJlZm9yZVJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/LihwKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0Py5vaykge1xuICAgICAgICAgIG1lcmdlZCA9IHsgLi4ubWVyZ2VkLCAuLi5vdmVycmlkZVJlc3VsdC5yZXN1bHQgfTtcbiAgICAgICAgICBpZiAobWVyZ2VkLnN0b3ApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogbWVyZ2VkIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvdmVycmlkZVJlc3VsdC5yZXN1bHQuaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3VycmVudFBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgLi4uY3VycmVudFBhcmFtcyxcbiAgICAgICAgICAgICAgaW5wdXQ6IG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5pbnB1dCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFJlc3VsdCA9IGF3YWl0IGRlZmF1bHRIYW5kbGVyKGN1cnJlbnRQYXJhbXMpO1xuICAgICAgICBtZXJnZWQgPSB7IC4uLm1lcmdlZCwgLi4uZGVmYXVsdFJlc3VsdCB9O1xuXG4gICAgICAgIHJldHVybiB7IHJlc3VsdDogbWVyZ2VkIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiSE9PS19FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcImhvb2sudG9vbC5hZnRlclwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIEhvb2tUb29sQWZ0ZXJQYXJhbXM7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gYXN5bmMgKFxuICAgICAgICBob29rUGFyYW1zOiBIb29rVG9vbEFmdGVyUGFyYW1zXG4gICAgICApOiBQcm9taXNlPEhvb2tUb29sQWZ0ZXJSZXN1bHQ+ID0+IHtcbiAgICAgICAgaWYgKCFob29rcz8uW1widG9vbC5hZnRlclwiXSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgaG9va3NbXCJ0b29sLmFmdGVyXCJdKGhvb2tQYXJhbXMpO1xuICAgICAgICByZXR1cm4gaG9va1Jlc3VsdCA/PyB7fTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJob29rLnRvb2wuYWZ0ZXJcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBjdXJyZW50UGFyYW1zID0gcDtcbiAgICAgICAgbGV0IG1lcmdlZDogSG9va1Rvb2xBZnRlclJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/LihwKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0Py5vaykge1xuICAgICAgICAgIG1lcmdlZCA9IHsgLi4ubWVyZ2VkLCAuLi5vdmVycmlkZVJlc3VsdC5yZXN1bHQgfTtcbiAgICAgICAgICBpZiAobWVyZ2VkLnN0b3ApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogbWVyZ2VkIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvdmVycmlkZVJlc3VsdC5yZXN1bHQucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbXMgPSB7XG4gICAgICAgICAgICAgIC4uLmN1cnJlbnRQYXJhbXMsXG4gICAgICAgICAgICAgIHJlc3VsdDogb3ZlcnJpZGVSZXN1bHQucmVzdWx0LnJlc3VsdCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFJlc3VsdCA9IGF3YWl0IGRlZmF1bHRIYW5kbGVyKGN1cnJlbnRQYXJhbXMpO1xuICAgICAgICBtZXJnZWQgPSB7IC4uLm1lcmdlZCwgLi4uZGVmYXVsdFJlc3VsdCB9O1xuXG4gICAgICAgIHJldHVybiB7IHJlc3VsdDogbWVyZ2VkIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiSE9PS19FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcImhvb2suc3RhdHVzXCI6IHtcbiAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgSG9va1N0YXR1c1BhcmFtcztcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGhvb2tzPy5zdGF0dXM/LihwLnN0YXR1cyk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdDoge30gfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIT09LX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwidG9vbHMuZXhlY3V0ZVwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFRvb2xzRXhlY3V0ZVBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSB0b29sc01hcFtwLm5hbWUgYXMga2V5b2YgdHlwZW9mIHRvb2xzTWFwXTtcbiAgICAgICAgaWYgKCF0b29sRGVmKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gdG9vbDogJHtwLm5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhlY3V0ZSA9ICh0b29sRGVmIGFzIFRvb2wpLmV4ZWN1dGU7XG4gICAgICAgIGlmICghZXhlY3V0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIk5PX0VYRUNVVEVcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFRvb2wgJHtwLm5hbWV9IGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuZGJveEluc3RhbmNlID0gZ2V0U2FuZGJveCh7XG4gICAgICAgICAgc2FuZGJveFJlY29yZDogcC5zYW5kYm94UmVjb3JkLFxuICAgICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICAgICAgcnBjLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0b29sQ29udGV4dDogVG9vbENvbnRleHQgPSB7XG4gICAgICAgICAgc2Vzc2lvbjogcC5zZXNzaW9uLFxuICAgICAgICAgIHNhbmRib3g6IHNhbmRib3hJbnN0YW5jZSxcbiAgICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgICBjb250ZXh0OiBwLmNvbnRleHQsXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRvb2xJbnB1dCA9IHAuaW5wdXQ7XG5cbiAgICAgICAgY29uc3QgYmVmb3JlUmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2goXG4gICAgICAgICAgXCJob29rLnRvb2wuYmVmb3JlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gYmVmb3JlUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGJlZm9yZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiZWZvcmVIb29rID0gYmVmb3JlUmVzdWx0LnJlc3VsdCBhcyBIb29rVG9vbEJlZm9yZVJlc3VsdDtcbiAgICAgICAgaWYgKGJlZm9yZUhvb2suc3RvcCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIkhPT0tfU1RPUFBFRFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInRvb2wuYmVmb3JlIGhvb2sgc3RvcHBlZCBleGVjdXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiZWZvcmVIb29rLmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0b29sSW5wdXQgPSBiZWZvcmVIb29rLmlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUodG9vbElucHV0IGFzIG5ldmVyLCB7XG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIHRvb2xDYWxsSWQ6IFwicnBjXCIsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhZnRlclJlc3VsdCA9IGF3YWl0IGRpc3BhdGNoKFxuICAgICAgICAgIFwiaG9vay50b29sLmFmdGVyXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gYWZ0ZXJSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gYWZ0ZXJSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWZ0ZXJIb29rID0gYWZ0ZXJSZXN1bHQucmVzdWx0IGFzIEhvb2tUb29sQWZ0ZXJSZXN1bHQ7XG4gICAgICAgIGlmIChhZnRlckhvb2suc3RvcCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIkhPT0tfU1RPUFBFRFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInRvb2wuYWZ0ZXIgaG9vayBzdG9wcGVkIGV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFmdGVySG9vay5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGFmdGVySG9vay5yZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5leGVjdXRlXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJFWEVDVVRFX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kIGFzIE1ldGhvZE5hbWU7XG4gICAgICBpZiAoIVNUT1JBR0VfUlBDX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJVTktOT1dOX01FVEhPRFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gUlBDIG1ldGhvZDogJHttZXRob2R9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jICgpOiBQcm9taXNlPFJwY1Jlc3VsdD4gPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlU3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICAgIGNvbmZpZzogc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0OiB7IG1ldGhvZCwgcGFyYW1zIH0sXG4gICAgICAgICAgbmFtZTogbmFtZSA/PyBzdG9yYWdlQ29uZmlnLm5hbWUgPz8gXCJkZWZhdWx0XCIsXG4gICAgICAgICAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bbWV0aG9kTmFtZV0gYXNcbiAgICAgICAgfCAoKHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTxBZ2VudFJwY1Jlc3VsdDx1bmtub3duPj4pXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocGFyYW1zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGhhbmRsZU92ZXJyaWRlUmVzdWx0KG92ZXJyaWRlUmVzdWx0KTtcbiAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWZhdWx0SGFuZGxlcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIlNUT1JBR0VfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJvdXRlcyBzdG9yYWdlIFJQQyByZXF1ZXN0cyBiYXNlZCBvbiBzdG9yYWdlIGNvbmZpZyB0eXBlLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVTdG9yYWdlUmVxdWVzdCh7XG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgbmFtZSxcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxufToge1xuICBjb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJlcXVlc3Q6IFJwY1JlcXVlc3Q7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG59KTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gYXdhaXQgZ2V0U3RvcmFnZUhhbmRsZXJzKG5hbWUpO1xuICAgICAgY29uc3QgeyBoYW5kbGVTdG9yYWdlUnBjIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvaGFuZGxlclwiKTtcbiAgICAgIHJldHVybiBoYW5kbGVTdG9yYWdlUnBjKHJlcXVlc3QsIGhhbmRsZXJzKTtcbiAgICB9XG4gICAgY2FzZSBcInZlcmNlbFwiOiB7XG4gICAgICBjb25zdCB7IGdldFZlcmNlbFN0b3JhZ2VDb25maWcgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuL3N0b3JhZ2UvYmluZGluZ3MvdmVyY2VsXCJcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldFZlcmNlbFN0b3JhZ2VDb25maWcoKTtcbiAgICAgIHJldHVybiBhd2FpdCBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgICAgICAgdXJsOiByZXNvbHZlZC51cmwsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ucmVzb2x2ZWQuaGVhZGVycywgXCJ4LWFnZW50LW5hbWVcIjogbmFtZSB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgXCJjdXN0b21cIjoge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb3h5U3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICB1cmw6IHJlc29sdmVBcGlVcmwoeyBhcGk6IGNvbmZpZy51cmwgfSksXG4gICAgICAgIGhlYWRlcnM6IHsgLi4uY29uZmlnLmhlYWRlcnMsIFwieC1hZ2VudC1uYW1lXCI6IG5hbWUgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25maWcgc2F0aXNmaWVzIG5ldmVyO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5rbm93biBzdG9yYWdlIHR5cGU6ICR7KGNvbmZpZyBhcyB7IHR5cGU6IHN0cmluZyB9KS50eXBlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJveGllcyBhIHN0b3JhZ2UgUlBDIHJlcXVlc3QgdG8gYW4gZXh0ZXJuYWwgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgdXJsLFxuICBoZWFkZXJzLFxuICByZXF1ZXN0LFxufToge1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlcXVlc3Q6IFJwY1JlcXVlc3Q7XG59KTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAuLi5oZWFkZXJzLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJQUk9YWV9FUlJPUlwiLFxuICAgICAgICBtZXNzYWdlOiBgU3RvcmFnZSBwcm94eSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxScGNSZXNwb25zZT47XG59XG5cbmZ1bmN0aW9uIHNjaGVtYVRvSnNvblNjaGVtYShzY2hlbWE6IHVua25vd24pOiBKU09OU2NoZW1hNyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgc2NoZW1hICE9PSBudWxsICYmXG4gICAgXCJfZGVmXCIgaW4gc2NoZW1hICYmXG4gICAgdHlwZW9mIChzY2hlbWEgYXMgei5ab2RUeXBlKS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHJldHVybiB6LnRvSlNPTlNjaGVtYShzY2hlbWEgYXMgei5ab2RUeXBlKSBhcyBKU09OU2NoZW1hNztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHMgPSBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBKU09OU2NoZW1hNztcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHNjaGVtYSAhPT0gbnVsbCAmJlxuICAgIChcInR5cGVcIiBpbiBzY2hlbWEgfHwgXCJwcm9wZXJ0aWVzXCIgaW4gc2NoZW1hKVxuICApIHtcbiAgICByZXR1cm4gc2NoZW1hIGFzIEpTT05TY2hlbWE3O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IFNlbmRJbnB1dCB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gIHNlc3Npb25JZCxcbiAgaWQsXG4gIGlucHV0LFxuICBkZWZhdWx0Um9sZSxcbn06IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbnB1dDogU2VuZElucHV0O1xuICBkZWZhdWx0Um9sZTogVUlNZXNzYWdlW1wicm9sZVwiXTtcbn0pOiB7IG1lc3NhZ2U6IE1lc3NhZ2U7IHBhcnRzOiBQYXJ0W10gfSB7XG4gIGxldCBtZXNzYWdlSWQgPSBpZCA/PyBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZToge1xuICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHJvbGU6IGRlZmF1bHRSb2xlLFxuICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgICAgaW50ZXJydXB0ZWRMYXN0UGFydDogbnVsbCxcbiAgICAgICAgdXNhZ2U6IG51bGwsXG4gICAgICB9LFxuICAgICAgcGFydHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgaWQ6IGBwYXJ0XyR7dWxpZCgpfWAsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgcGFydDogeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuICBpZiAoaW5wdXQuaWQpIHtcbiAgICBtZXNzYWdlSWQgPSBpbnB1dC5pZDtcbiAgfVxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoaW5wdXQuaWQpIHtcbiAgICBtZXNzYWdlSWQgPSBpbnB1dC5pZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2U6IHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkTGFzdFBhcnQ6IG51bGwsXG4gICAgICB1c2FnZTogbnVsbCxcbiAgICAgIHJvbGU6IGlucHV0LnJvbGUgPz8gZGVmYXVsdFJvbGUsXG4gICAgfSxcbiAgICBwYXJ0czogaW5wdXQucGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIG1lc3NhZ2VJZCxcbiAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgaW5kZXgsXG4gICAgICBwYXJ0LFxuICAgIH0pKSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUVhLG9CQU1QLFlBMkZPO0FBbkdiO0FBQUE7QUFBQTtBQUVPLElBQU0scUJBQXFCO0FBTWxDLElBQU0sYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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WUFBTSxTQUFTLFdBQVcsU0FBVSxPQUFPLFVBQVUsTUFBTztBQUM1RCxhQUFPLFNBQVM7QUFBQSxRQUNkLFdBQVcsU0FBUyxFQUFFLE9BQU8sT0FBTyxNQUFNLElBQUksRUFBRSxRQUFRLE9BQU8sT0FBTztBQUFBLFFBQ3RFLEVBQUUsT0FBTztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLEVBQUUsR0FBRyxjQUFjLEdBQUcsUUFBUSxNQUFNO0FBQUE7QUFBQSxJQUczQyxZQUFZO0FBQUE7QUFBQSxJQU9aLFlBQVksY0FBYyxRQUFRO0FBQUEsSUFFbEMsTUFBTSxNQUFNO0FBQ1YsWUFBTSxJQUFJO0FBQUEsUUFDUjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDs7O0FEbnJDQTtBQVdBOyIsCiAgIm5hbWVzIjogWyJvcHRzIiwgInBhdGgiLCAiZXJyb3JlIiwgInJlc3VsdCIsICJyZXNvbHZlIiwgInN0b3JhZ2UiLCAic2FuZGJveFJlY29yZCIsICJpbXBvcnRfem9kIiwgIlZlcmNlbFNhbmRib3hTREsiLCAiZ2V0U3RvcmFnZSIsICJwYXRoIiwgImltcG9ydF9zYW5kYm94IiwgImVycm9yZSIsICJnZXRUZXN0Q3JlZGVudGlhbHMiLCAic2FuZGJveCIsICJWZXJjZWxTYW5kYm94U0RLIiwgInJlc29sdmUiLCAic25hcHNob3RJZCIsICJnZXRTYW5kYm94IiwgInNhbmRib3hSZWNvcmQiLCAiaW5pdF9jbGllbnQiLCAiaW5pdF9jbGllbnQiLCAiaW5pdF92ZXJjZWwiLCAiZXF1YWwiLCAiaW1wb3J0X2FpIiwgImVycm9yZSIsICJpbXBvcnRfZmFzdF9kZWVwX2VxdWFsIiwgImltcG9ydF91bGlkIiwgImltcG9ydF9hcGkiLCAieiIsICJpbXBvcnRfd29ya2Zsb3ciLCAiaW1wb3J0X2FpIiwgImltcG9ydF91bGlkIiwgImltcG9ydF93b3JrZmxvdyIsICJkZWJ1ZyIsICJpbXBvcnRfYWkiLCAiaW1wb3J0X3pvZCIsICJwYXRoIiwgImNyZWF0ZVByb2Nlc3NNYW5hZ2VyIiwgImdldFN0b3JhZ2UiLCAicmVzb2x2ZSIsICJnZXRTYW5kYm94IiwgInNlc3Npb24iLCAic2FuZGJveFJlY29yZCIsICJzYW5kYm94IiwgInJlc3VsdCIsICJzdGFydCIsICJldmVudCIsICJyZXN1bHQiLCAiaW1wb3J0X3pvZCIsICJuYW1lIiwgInJlc3VsdCIsICJoYW5kbGVTdG9yYWdlUnBjIiwgImdldFZlcmNlbFN0b3JhZ2VDb25maWciLCAiaW1wb3J0X3VsaWQiLCAibm93IiwgImpvaW4iLCAiY3JlYXRlRmlsZXN5c3RlbUhhbmRsZXJzIiwgImVxdWFsIiwgInNlc3Npb24iLCAic2tpbGxzRGlyIl0KfQo=