@workflow/next 5.0.0-beta.17 → 5.0.0-beta.18

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.
@@ -13,6 +13,7 @@ const node_path_1 = require("node:path");
13
13
  const socket_server_js_1 = require("./socket-server.js");
14
14
  const ROUTE_STUB_FILE_MARKER = 'WORKFLOW_ROUTE_STUB_FILE';
15
15
  const ROUTE_STUB_MARKER_SCAN_BYTES = 4 * 1024;
16
+ const DEV_WORKFLOW_CODE_FILENAME = '__workflow_code.txt';
16
17
  let CachedNextBuilderDeferred;
17
18
  // Create the deferred Next builder dynamically by extending the ESM BaseBuilder.
18
19
  // Exported as getNextBuilderDeferred() to allow CommonJS modules to import from
@@ -455,7 +456,38 @@ async function getNextBuilderDeferred() {
455
456
  const stepManifest = await this.createDeferredStepManifest(stepAndSerdeFiles);
456
457
  const escapedVMCode = workflowVMCode.replace(/[\\`$]/g, '\\$&');
457
458
  const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode();
458
- const routeCode = `// biome-ignore-all lint: generated file
459
+ let routeCode;
460
+ if (this.config.watch) {
461
+ const workflowCodePath = (0, node_path_1.join)((0, node_path_1.dirname)(flowOutfile), DEV_WORKFLOW_CODE_FILENAME);
462
+ await this.writeFileIfChanged(workflowCodePath, workflowVMCode);
463
+ routeCode = `// biome-ignore-all lint: generated file
464
+ /* eslint-disable */
465
+ import 'workflow/internal/builtins';
466
+ ${stepImports}
467
+ import { readFile, stat } from 'node:fs/promises';
468
+ import { workflowEntrypoint } from 'workflow/runtime';
469
+
470
+ const workflowCodePath = ${JSON.stringify(workflowCodePath)};
471
+ let cachedWorkflowHandler;
472
+ let cachedWorkflowCodeSignature;
473
+
474
+ async function getWorkflowHandler() {
475
+ const workflowCodeStats = await stat(workflowCodePath);
476
+ const workflowCodeSignature = \`\${workflowCodeStats.size}:\${workflowCodeStats.mtimeMs}\`;
477
+ if (!cachedWorkflowHandler || cachedWorkflowCodeSignature !== workflowCodeSignature) {
478
+ const workflowCode = await readFile(workflowCodePath, 'utf8');
479
+ cachedWorkflowHandler = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCode});
480
+ cachedWorkflowCodeSignature = workflowCodeSignature;
481
+ }
482
+ return cachedWorkflowHandler;
483
+ }
484
+
485
+ export async function POST(req) {
486
+ return (await getWorkflowHandler())(req);
487
+ }`;
488
+ }
489
+ else {
490
+ routeCode = `// biome-ignore-all lint: generated file
459
491
  /* eslint-disable */
460
492
  import 'workflow/internal/builtins';
461
493
  ${stepImports}
@@ -464,6 +496,7 @@ import { workflowEntrypoint } from 'workflow/runtime';
464
496
  const workflowCode = \`${escapedVMCode}\`;
465
497
 
466
498
  export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCode});`;
499
+ }
467
500
  await this.writeFileIfChanged(flowOutfile, routeCode);
468
501
  return {
469
502
  manifest: {
@@ -550,7 +583,7 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
550
583
  continue;
551
584
  }
552
585
  const relativeFilepath = await this.getRelativeFilenameForSwc(file);
553
- const { workflowManifest } = await applySwcTransform(relativeFilepath, source, 'step', file, this.transformProjectRoot);
586
+ const { workflowManifest } = await applySwcTransform(relativeFilepath, source, 'step', file, this.transformProjectRoot, this.moduleSpecifierRoot);
554
587
  this.mergeWorkflowManifest(manifest, workflowManifest);
555
588
  }
556
589
  return manifest;
@@ -580,6 +613,7 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
580
613
  (0, node_path_1.join)(flowRouteDir, 'route.js.temp'),
581
614
  (0, node_path_1.join)(flowRouteDir, 'route.js.temp.debug.json'),
582
615
  (0, node_path_1.join)(flowRouteDir, 'route.js.debug.json'),
616
+ (0, node_path_1.join)(flowRouteDir, DEV_WORKFLOW_CODE_FILENAME),
583
617
  (0, node_path_1.join)(flowRouteDir, '__step_registrations.route.js.temp'),
584
618
  (0, node_path_1.join)(flowRouteDir, '__step_registrations.route.js.temp.debug.json'),
585
619
  // V2: clean up stale V1 step route directory
@@ -1398,7 +1432,7 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
1398
1432
  return;
1399
1433
  try {
1400
1434
  const relativeFilename = await this.getRelativeFilenameForSwc(filePath);
1401
- const { workflowManifest } = await applySwcTransform(relativeFilename, source, 'detect', filePath, projectRoot);
1435
+ const { workflowManifest } = await applySwcTransform(relativeFilename, source, 'detect', filePath, projectRoot, this.moduleSpecifierRoot);
1402
1436
  // Only include files that actually define serde classes
1403
1437
  const hasClasses = workflowManifest.classes &&
1404
1438
  Object.values(workflowManifest.classes).some((entries) => Object.keys(entries).length > 0);
@@ -1467,4 +1501,4 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
1467
1501
  CachedNextBuilderDeferred = NextDeferredBuilder;
1468
1502
  return NextDeferredBuilder;
1469
1503
  }
1470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1kZWZlcnJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWRlZmVycmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBd0NBLHdEQTIvREM7QUFuaUVELDZDQUF5QztBQUN6QyxxQ0FBOEQ7QUFDOUQsK0NBUzBCO0FBQzFCLDZDQUE0QztBQUM1QyxzREFBeUI7QUFDekIseUNBUW1CO0FBRW5CLHlEQU00QjtBQUU1QixNQUFNLHNCQUFzQixHQUFHLDBCQUEwQixDQUFDO0FBQzFELE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUU5QyxJQUFJLHlCQUE4QixDQUFDO0FBRW5DLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsb0VBQW9FO0FBQzdELEtBQUssVUFBVSxzQkFBc0I7SUFDMUMsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FBQzlCLE9BQU8seUJBQXlCLENBQUM7SUFDbkMsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLCtFQUErRTtJQUMvRSwyRUFBMkU7SUFDM0UseUNBQXlDO0lBQ3pDLE1BQU0sRUFDSixXQUFXLEVBQUUsZ0JBQWdCLEVBQzdCLHNCQUFzQixFQUN0QixtQ0FBbUMsRUFDbkMsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsZ0NBQWdDO0lBQ2hDLDRJQUE0STtNQUM3SSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQ2IsOEJBQThCLENBQy9CLENBQXdDLENBQUM7SUFFMUMsTUFBTSxtQkFBb0IsU0FBUSxnQkFBZ0I7UUFDeEMsUUFBUSxDQUFZO1FBQ1gsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUM1QyxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3hDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbEQsc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVB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SUFBSSxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNuQyx1REFBdUQ7Z0JBQ3ZELE1BQU0sSUFBQSxnQkFBSyxFQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixxSEFBcUgsQ0FDdEgsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUVELHlCQUF5QixHQUFHLG1CQUFtQixDQUFDO0lBQ2hELE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjb25zdGFudHMsIGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgYWNjZXNzLFxuICBta2RpcixcbiAgb3BlbixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICBzdGF0LFxuICB3cml0ZUZpbGUsXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBpc0Fic29sdXRlLFxuICBqb2luLFxuICByZWxhdGl2ZSxcbiAgcmVzb2x2ZSxcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNYW5pZmVzdCB9IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQge1xuICBjbGVhbnVwU3RhbGVTb2NrZXRJbmZvRmlsZXMsXG4gIGNyZWF0ZVNvY2tldFNlcnZlcixcbiAgU09DS0VUX0lORk9fRklMRU5BTUUsXG4gIHR5cGUgU29ja2V0SU8sXG4gIHR5cGUgU29ja2V0U2VydmVyQ29uZmlnLFxufSBmcm9tICcuL3NvY2tldC1zZXJ2ZXIuanMnO1xuXG5jb25zdCBST1VURV9TVFVCX0ZJTEVfTUFSS0VSID0gJ1dPUktGTE9XX1JPVVRFX1NUVUJfRklMRSc7XG5jb25zdCBST1VURV9TVFVCX01BUktFUl9TQ0FOX0JZVEVTID0gNCAqIDEwMjQ7XG5cbmxldCBDYWNoZWROZXh0QnVpbGRlckRlZmVycmVkOiBhbnk7XG5cbi8vIENyZWF0ZSB0aGUgZGVmZXJyZWQgTmV4dCBidWlsZGVyIGR5bmFtaWNhbGx5IGJ5IGV4dGVuZGluZyB0aGUgRVNNIEJhc2VCdWlsZGVyLlxuLy8gRXhwb3J0ZWQgYXMgZ2V0TmV4dEJ1aWxkZXJEZWZlcnJlZCgpIHRvIGFsbG93IENvbW1vbkpTIG1vZHVsZXMgdG8gaW1wb3J0IGZyb21cbi8vIHRoZSBFU00gQHdvcmtmbG93L2J1aWxkZXJzIHBhY2thZ2UgdmlhIGR5bmFtaWMgaW1wb3J0IGF0IHJ1bnRpbWUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dEJ1aWxkZXJEZWZlcnJlZCgpIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRGVmZXJyZWQpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJEZWZlcnJlZDtcbiAgfVxuXG4gIC8vIFYyOiBTVEVQX1FVRVVFX1RSSUdHRVIgYW5kIGVuaGFuY2VkLXJlc29sdmUgaW5mcmFzdHJ1Y3R1cmVcbiAgLy8gd2VyZSByZW1vdmVkIGJlY2F1c2UgdGhlIFYyIGNvbWJpbmVkIGhhbmRsZXIgZWxpbWluYXRlcyB0aGUgc2VwYXJhdGUgc3RlcFxuICAvLyByb3V0ZS90b3BpYy4gVGhlIHN0ZXAgY29weSBpbXBvcnQgcmV3cml0aW5nIChnZXRSZWxhdGl2ZUltcG9ydFNwZWNpZmllcixcbiAgLy8gZ2V0U3RlcENvcHlGaWxlTmFtZSwgcmV3cml0ZVJlbGF0aXZlSW1wb3J0c0ZvckNvcGllZFN0ZXApIGZyb20gbWFpbiB3YXMgYWxzb1xuICAvLyByZW1vdmVkIOKAlCBWMiBkb2Vzbid0IHVzZSBzdGVwIGNvcGllcy4gSWYgc3RlcCBjb3B5IHN1cHBvcnQgaXMgbmVlZGVkLCBpdFxuICAvLyBzaG91bGQgbGFuZCBhcyBhIGNvbXBsZXRlIGZlYXR1cmUgc2V0LlxuICBjb25zdCB7XG4gICAgQmFzZUJ1aWxkZXI6IEJhc2VCdWlsZGVyQ2xhc3MsXG4gICAgV09SS0ZMT1dfUVVFVUVfVFJJR0dFUixcbiAgICBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSxcbiAgICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zLFxuICAgIGFwcGx5U3djVHJhbnNmb3JtLFxuICAgIGdldEltcG9ydFBhdGgsXG4gICAgcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGgsXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOiBOZWVkIHRvIHVzZSBldmFsIGhlcmUgdG8gYXZvaWQgVHlwZVNjcmlwdCBmcm9tIHRyYW5zcGlsaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50IGludG8gYHJlcXVpcmUoKWBcbiAgfSA9IChhd2FpdCBldmFsKFxuICAgICdpbXBvcnQoXCJAd29ya2Zsb3cvYnVpbGRlcnNcIiknXG4gICkpIGFzIHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpO1xuXG4gIGNsYXNzIE5leHREZWZlcnJlZEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlckNsYXNzIHtcbiAgICBwcml2YXRlIHNvY2tldElPPzogU29ja2V0SU87XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJlZFN0ZXBGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJlZFNlcmRlRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHRyYWNrZWREZXBlbmRlbmN5RmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGRlZmVycmVkQnVpbGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHByaXZhdGUgY2FjaGVJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FjaGVXcml0ZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZGVmZXJyZWRSZWJ1aWxkVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBsYXN0RGVmZXJyZWRCdWlsZFNpZ25hdHVyZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVEaXNjb3ZlcnlTdGF0ZSgpO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwR2VuZXJhdGVkQXJ0aWZhY3RzT25Cb290KG91dHB1dERpcik7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVTdHViRmlsZXMob3V0cHV0RGlyKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlzY292ZXJ5U29ja2V0U2VydmVyKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25CZWZvcmVEZWZlcnJlZEVudHJpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVEaXNjb3ZlcnlTdGF0ZSgpO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURpc2NvdmVyZWRFbnRyeUZpbGVzKCk7XG4gICAgICBjb25zdCBpbXBsaWNpdFN0ZXBGaWxlcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUltcGxpY2l0U3RlcEZpbGVzKCk7XG5cbiAgICAgIGNvbnN0IHBlbmRpbmdCdWlsZCA9IHRoaXMuZGVmZXJyZWRCdWlsZFF1ZXVlLnRoZW4oKCkgPT5cbiAgICAgICAgdGhpcy5idWlsZERlZmVycmVkRW50cmllc1VudGlsU3RhYmxlKGltcGxpY2l0U3RlcEZpbGVzKVxuICAgICAgKTtcblxuICAgICAgLy8gS2VlcCB0aGUgcXVldWUgY2hhaW4gYWxpdmUgZXZlbiB3aGVuIHRoZSBjdXJyZW50IGJ1aWxkIGZhaWxzIHNvIGZ1dHVyZVxuICAgICAgLy8gY2FsbGJhY2tzIGNhbiBlbnF1ZXVlIGFub3RoZXIgYXR0ZW1wdCB3aXRob3V0IHRyaWdnZXJpbmcgdW5oYW5kbGVkXG4gICAgICAvLyByZWplY3Rpb24gd2FybmluZ3MuXG4gICAgICB0aGlzLmRlZmVycmVkQnVpbGRRdWV1ZSA9IHBlbmRpbmdCdWlsZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9yIGlzIHN1cmZhY2VkIHRocm91Z2ggYHBlbmRpbmdCdWlsZGAgYmVsb3cuXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgcGVuZGluZ0J1aWxkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudElucHV0RmlsZXMoaW1wbGljaXRTdGVwRmlsZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoW1xuICAgICAgICAgIC4uLnRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMsXG4gICAgICAgICAgLi4udGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnRoaXMuZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgICAgLi4uaW1wbGljaXRTdGVwRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkRGVmZXJyZWRFbnRyaWVzVW50aWxTdGFibGUoXG4gICAgICBpbXBsaWNpdFN0ZXBGaWxlczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIC8vIEEgc3VjY2Vzc2Z1bCBidWlsZCBjYW4gZGlzY292ZXIgYWRkaXRpb25hbCB0cmFuc2l0aXZlIGRlcGVuZGVuY3kgZmlsZXNcbiAgICAgIC8vICh2aWEgc291cmNlIG1hcHMpLCB3aGljaCBjaGFuZ2VzIHRoZSBzaWduYXR1cmUgYW5kIG1heSByZXF1aXJlIG9uZSBtb3JlXG4gICAgICAvLyBidWlsZCBwYXNzIHRvIGluY2x1ZGUgbmV3bHkgZGlzY292ZXJlZCBzZXJkZSBmaWxlcy5cbiAgICAgIGNvbnN0IG1heEJ1aWxkUGFzc2VzID0gMztcblxuICAgICAgZm9yIChsZXQgYnVpbGRQYXNzID0gMDsgYnVpbGRQYXNzIDwgbWF4QnVpbGRQYXNzZXM7IGJ1aWxkUGFzcysrKSB7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSB0aGlzLmdldEN1cnJlbnRJbnB1dEZpbGVzKGltcGxpY2l0U3RlcEZpbGVzKTtcbiAgICAgICAgY29uc3QgYnVpbGRTaWduYXR1cmUgPVxuICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGVmZXJyZWRCdWlsZFNpZ25hdHVyZShpbnB1dEZpbGVzKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkRm9yY2VCdWlsZEZvckdlbmVyYXRlZFJvdXRlcyA9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zaG91bGRGb3JjZUJ1aWxkRm9yR2VuZXJhdGVkUm91dGVzKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBidWlsZFNpZ25hdHVyZSA9PT0gdGhpcy5sYXN0RGVmZXJyZWRCdWlsZFNpZ25hdHVyZSAmJlxuICAgICAgICAgICFzaG91bGRGb3JjZUJ1aWxkRm9yR2VuZXJhdGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5idWlsZERpc2NvdmVyZWRGaWxlcyhpbnB1dEZpbGVzLCBpbXBsaWNpdFN0ZXBGaWxlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlRGlzY292ZXJlZEVudHJ5RmlsZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJlZElucHV0RmlsZXMgPVxuICAgICAgICAgICAgICB0aGlzLmdldEN1cnJlbnRJbnB1dEZpbGVzKGltcGxpY2l0U3RlcEZpbGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJlZFNpZ25hdHVyZSA9XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGVmZXJyZWRCdWlsZFNpZ25hdHVyZShyZWNvdmVyZWRJbnB1dEZpbGVzKTtcbiAgICAgICAgICAgIGlmIChyZWNvdmVyZWRTaWduYXR1cmUgIT09IGJ1aWxkU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIEEgZmlsZSB3YXMgYWRkZWQvcmVtb3ZlZCB3aGlsZSB0aGlzIGJ1aWxkIHdhcyBydW5uaW5nOyByZXRyeVxuICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSB3aXRoIHRoZSByZWZyZXNoZWQgZGlzY292ZXJlZC1lbnRyeSBzdGF0ZS5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdbd29ya2Zsb3ddIERlZmVycmVkIGVudHJpZXMgYnVpbGQgZmFpbGVkLiBXaWxsIHJldHJ5IG9ubHkgYWZ0ZXIgaW5wdXRzIGNoYW5nZS4nLFxuICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubGFzdERlZmVycmVkQnVpbGRTaWduYXR1cmUgPSBidWlsZFNpZ25hdHVyZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdERlZmVycmVkQnVpbGRTaWduYXR1cmUgPSBidWlsZFNpZ25hdHVyZTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICAgICAgLy8gUHJvZHVjdGlvbiBidWlsZHMgY2FuIHBlcnNpc3QgbmV3bHkgZGlzY292ZXJlZCBkZWZlcnJlZC1lbnRyeSBmaWxlcyB0b1xuICAgICAgICAgIC8vIHRoZSBjYWNoZSBhZnRlciB0aGUgZmlyc3QgcGFzcyBjb21wbGV0ZXMuIFJlbG9hZCB0aGF0IGNhY2hlIGJlZm9yZSB3ZVxuICAgICAgICAgIC8vIGRlY2lkZSB3aGV0aGVyIHRoZSBpbnB1dCBzaWduYXR1cmUgc3RhYmlsaXplZCBzbyBzdGFnZWQgdGFyYmFsbCBidWlsZHNcbiAgICAgICAgICAvLyBjYW4gaW1tZWRpYXRlbHkgcmVwbGF5IHdpdGggdGhlIGV4cGFuZGVkIHN0ZXAgc2V0LlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDI1MCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFdvcmtmbG93c0NhY2hlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3N0QnVpbGRJbnB1dEZpbGVzID1cbiAgICAgICAgICB0aGlzLmdldEN1cnJlbnRJbnB1dEZpbGVzKGltcGxpY2l0U3RlcEZpbGVzKTtcbiAgICAgICAgY29uc3QgcG9zdEJ1aWxkU2lnbmF0dXJlID1cbiAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURlZmVycmVkQnVpbGRTaWduYXR1cmUocG9zdEJ1aWxkSW5wdXRGaWxlcyk7XG4gICAgICAgIGlmIChwb3N0QnVpbGRTaWduYXR1cmUgPT09IGJ1aWxkU2lnbmF0dXJlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1t3b3JrZmxvd10gRGVmZXJyZWQgZW50cmllcyBidWlsZCBzaWduYXR1cmUgZGlkIG5vdCBzdGFiaWxpemUgYWZ0ZXIgMyBwYXNzZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVJbXBsaWNpdFN0ZXBGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCB3b3JrZmxvd1N0ZGxpYlBhdGggPSB0aGlzLnJlc29sdmVXb3JrZmxvd1N0ZGxpYlN0ZXBGaWxlUGF0aCgpO1xuICAgICAgcmV0dXJuIHdvcmtmbG93U3RkbGliUGF0aCA/IFt3b3JrZmxvd1N0ZGxpYlBhdGhdIDogW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzaG91bGRGb3JjZUJ1aWxkRm9yR2VuZXJhdGVkUm91dGVzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gYXdhaXQgdGhpcy5maW5kQXBwRGlyZWN0b3J5KCk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRSb3V0ZUZpbGVzID0gW1xuICAgICAgICBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cvcm91dGUuanMnKSxcbiAgICAgICAgam9pbihvdXRwdXREaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rL1t0b2tlbl0vcm91dGUuanMnKSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGVGaWxlUGF0aCBvZiBnZW5lcmF0ZWRSb3V0ZUZpbGVzKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU3RhdGUgPSBhd2FpdCB0aGlzLmdldEdlbmVyYXRlZFJvdXRlU3RhdGUocm91dGVGaWxlUGF0aCk7XG4gICAgICAgIGlmIChyb3V0ZVN0YXRlID09PSAnbWlzc2luZycgfHwgcm91dGVTdGF0ZSA9PT0gJ3N0dWInKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0R2VuZXJhdGVkUm91dGVTdGF0ZShcbiAgICAgIHJvdXRlRmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IFByb21pc2U8J21pc3NpbmcnIHwgJ3N0dWInIHwgJ2dlbmVyYXRlZCc+IHtcbiAgICAgIGxldCByb3V0ZVN0YXRzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHN0YXQ+PjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvdXRlU3RhdHMgPSBhd2FpdCBzdGF0KHJvdXRlRmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnbWlzc2luZyc7XG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlU3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICdtaXNzaW5nJztcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgcm91dGVGaWxlSGFuZGxlID0gYXdhaXQgb3Blbihyb3V0ZUZpbGVQYXRoLCAncicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1hcmtlclNjYW5CdWZmZXIgPSBCdWZmZXIuYWxsb2MoUk9VVEVfU1RVQl9NQVJLRVJfU0NBTl9CWVRFUyk7XG4gICAgICAgICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IHJvdXRlRmlsZUhhbmRsZS5yZWFkKFxuICAgICAgICAgICAgbWFya2VyU2NhbkJ1ZmZlcixcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBST1VURV9TVFVCX01BUktFUl9TQ0FOX0JZVEVTLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbWFya2VyU2NhblNvdXJjZSA9IG1hcmtlclNjYW5CdWZmZXIudG9TdHJpbmcoXG4gICAgICAgICAgICAndXRmOCcsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgYnl0ZXNSZWFkXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbWFya2VyU2NhblNvdXJjZS5pbmNsdWRlcyhST1VURV9TVFVCX0ZJTEVfTUFSS0VSKVxuICAgICAgICAgICAgPyAnc3R1YidcbiAgICAgICAgICAgIDogJ2dlbmVyYXRlZCc7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgcm91dGVGaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJ21pc3NpbmcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzb2x2ZVdvcmtmbG93U3RkbGliU3RlcEZpbGVQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgbGV0IHdvcmtmbG93Q2pzRW50cnk6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHdvcmtmbG93Q2pzRW50cnkgPSByZXF1aXJlLnJlc29sdmUoJ3dvcmtmbG93Jywge1xuICAgICAgICAgIHBhdGhzOiBbdGhpcy5jb25maWcud29ya2luZ0Rpcl0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0Rpc3REaXIgPSBkaXJuYW1lKHdvcmtmbG93Q2pzRW50cnkpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dTdGRsaWJQYXRoID0gdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoXG4gICAgICAgIGpvaW4od29ya2Zsb3dEaXN0RGlyLCAnc3RkbGliLmpzJylcbiAgICAgICk7XG4gICAgICByZXR1cm4gZXhpc3RzU3luYyh3b3JrZmxvd1N0ZGxpYlBhdGgpID8gd29ya2Zsb3dTdGRsaWJQYXRoIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZURpc2NvdmVyZWRFbnRyaWVzKHtcbiAgICAgIHdvcmtmbG93Q2FuZGlkYXRlcyxcbiAgICAgIHN0ZXBDYW5kaWRhdGVzLFxuICAgICAgc2VyZGVDYW5kaWRhdGVzLFxuICAgICAgdmFsaWRhdGVQYXR0ZXJucyxcbiAgICB9OiB7XG4gICAgICB3b3JrZmxvd0NhbmRpZGF0ZXM6IEl0ZXJhYmxlPHN0cmluZz47XG4gICAgICBzdGVwQ2FuZGlkYXRlczogSXRlcmFibGU8c3RyaW5nPjtcbiAgICAgIHNlcmRlQ2FuZGlkYXRlcz86IEl0ZXJhYmxlPHN0cmluZz47XG4gICAgICB2YWxpZGF0ZVBhdHRlcm5zOiBib29sZWFuO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgIHdvcmtmbG93RmlsZXM6IFNldDxzdHJpbmc+O1xuICAgICAgc3RlcEZpbGVzOiBTZXQ8c3RyaW5nPjtcbiAgICAgIHNlcmRlRmlsZXM6IFNldDxzdHJpbmc+O1xuICAgIH0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXNCeUZpbGUgPSBuZXcgTWFwPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIHtcbiAgICAgICAgICBoYXNXb3JrZmxvd0NhbmRpZGF0ZTogYm9vbGVhbjtcbiAgICAgICAgICBoYXNTdGVwQ2FuZGlkYXRlOiBib29sZWFuO1xuICAgICAgICAgIGhhc1NlcmRlQ2FuZGlkYXRlOiBib29sZWFuO1xuICAgICAgICB9XG4gICAgICA+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygd29ya2Zsb3dDYW5kaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGNhbmRpZGF0ZXNCeUZpbGUuZ2V0KG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgZXhpc3RpbmcuaGFzV29ya2Zsb3dDYW5kaWRhdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbmRpZGF0ZXNCeUZpbGUuc2V0KG5vcm1hbGl6ZWRQYXRoLCB7XG4gICAgICAgICAgICBoYXNXb3JrZmxvd0NhbmRpZGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1N0ZXBDYW5kaWRhdGU6IGZhbHNlLFxuICAgICAgICAgICAgaGFzU2VyZGVDYW5kaWRhdGU6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygc3RlcENhbmRpZGF0ZXMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gY2FuZGlkYXRlc0J5RmlsZS5nZXQobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBleGlzdGluZy5oYXNTdGVwQ2FuZGlkYXRlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYW5kaWRhdGVzQnlGaWxlLnNldChub3JtYWxpemVkUGF0aCwge1xuICAgICAgICAgICAgaGFzV29ya2Zsb3dDYW5kaWRhdGU6IGZhbHNlLFxuICAgICAgICAgICAgaGFzU3RlcENhbmRpZGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1NlcmRlQ2FuZGlkYXRlOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VyZGVDYW5kaWRhdGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygc2VyZGVDYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjYW5kaWRhdGVzQnlGaWxlLmdldChub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy5oYXNTZXJkZUNhbmRpZGF0ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXNCeUZpbGUuc2V0KG5vcm1hbGl6ZWRQYXRoLCB7XG4gICAgICAgICAgICAgIGhhc1dvcmtmbG93Q2FuZGlkYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgaGFzU3RlcENhbmRpZGF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgIGhhc1NlcmRlQ2FuZGlkYXRlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVFbnRyaWVzID0gQXJyYXkuZnJvbShjYW5kaWRhdGVzQnlGaWxlLmVudHJpZXMoKSkuc29ydChcbiAgICAgICAgKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYilcbiAgICAgICk7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRFbnRyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVFbnRyaWVzLm1hcChhc3luYyAoW2ZpbGVQYXRoLCBjYW5kaWRhdGVzXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlU3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGlmICghZmlsZVN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlUGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBoYXNVc2VXb3JrZmxvdzogY2FuZGlkYXRlcy5oYXNXb3JrZmxvd0NhbmRpZGF0ZSxcbiAgICAgICAgICAgICAgICBoYXNVc2VTdGVwOiBjYW5kaWRhdGVzLmhhc1N0ZXBDYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgaGFzU2VyZGU6IGNhbmRpZGF0ZXMuaGFzU2VyZGVDYW5kaWRhdGUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICAgIGhhc1VzZVdvcmtmbG93OiBwYXR0ZXJucy5oYXNVc2VXb3JrZmxvdyxcbiAgICAgICAgICAgICAgaGFzVXNlU3RlcDogcGF0dGVybnMuaGFzVXNlU3RlcCxcbiAgICAgICAgICAgICAgaGFzU2VyZGU6IHBhdHRlcm5zLmhhc1NlcmRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHN0ZXBGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3Qgc2VyZGVGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWxpZGF0ZWRFbnRyaWVzKSB7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuaGFzVXNlV29ya2Zsb3cpIHtcbiAgICAgICAgICB3b3JrZmxvd0ZpbGVzLmFkZChlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5Lmhhc1VzZVN0ZXApIHtcbiAgICAgICAgICBzdGVwRmlsZXMuYWRkKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuaGFzU2VyZGUpIHtcbiAgICAgICAgICBzZXJkZUZpbGVzLmFkZChlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgd29ya2Zsb3dGaWxlcywgc3RlcEZpbGVzLCBzZXJkZUZpbGVzIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZURpc2NvdmVyZWRFbnRyeUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd29ya2Zsb3dDYW5kaWRhdGVzID0gbmV3IFNldCh0aGlzLmRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVzKTtcbiAgICAgIGNvbnN0IHN0ZXBDYW5kaWRhdGVzID0gbmV3IFNldCh0aGlzLmRpc2NvdmVyZWRTdGVwRmlsZXMpO1xuICAgICAgY29uc3Qgc2VyZGVDYW5kaWRhdGVzID0gbmV3IFNldCh0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzKTtcbiAgICAgIGNvbnN0IHsgd29ya2Zsb3dGaWxlcywgc3RlcEZpbGVzLCBzZXJkZUZpbGVzIH0gPVxuICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZURpc2NvdmVyZWRFbnRyaWVzKHtcbiAgICAgICAgICB3b3JrZmxvd0NhbmRpZGF0ZXMsXG4gICAgICAgICAgc3RlcENhbmRpZGF0ZXMsXG4gICAgICAgICAgc2VyZGVDYW5kaWRhdGVzLFxuICAgICAgICAgIHZhbGlkYXRlUGF0dGVybnM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBSZWNvbmNpbGUgdmFsaWRhdGVkIGVudHJpZXMgYWdhaW5zdCB0aGUgc25hcHNob3Qgd2Ugc3RhcnRlZCB3aXRoIHNvXG4gICAgICAvLyBmaWxlIGRpc2NvdmVyaWVzIHRoYXQgYXJyaXZlIGR1cmluZyB2YWxpZGF0aW9uIGFyZSBwcmVzZXJ2ZWQuXG4gICAgICBsZXQgd29ya2Zsb3dzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgbGV0IHN0ZXBzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgbGV0IHNlcmRlQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdvcmtmbG93Q2FuZGlkYXRlcykge1xuICAgICAgICBpZiAoIXdvcmtmbG93RmlsZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHdvcmtmbG93c0NoYW5nZWQgPVxuICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcy5kZWxldGUoZmlsZVBhdGgpIHx8IHdvcmtmbG93c0NoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygd29ya2Zsb3dGaWxlcykge1xuICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuYWRkKGZpbGVQYXRoKTtcbiAgICAgICAgICB3b3JrZmxvd3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHN0ZXBDYW5kaWRhdGVzKSB7XG4gICAgICAgIGlmICghc3RlcEZpbGVzLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBzdGVwc0NoYW5nZWQgPVxuICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmRlbGV0ZShmaWxlUGF0aCkgfHwgc3RlcHNDaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHN0ZXBGaWxlcykge1xuICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFN0ZXBGaWxlcy5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgICAgICAgc3RlcHNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHNlcmRlQ2FuZGlkYXRlcykge1xuICAgICAgICBpZiAoIXNlcmRlRmlsZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHNlcmRlQ2hhbmdlZCA9XG4gICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmRlbGV0ZShmaWxlUGF0aCkgfHwgc2VyZGVDaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHNlcmRlRmlsZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgICAgICAgc2VyZGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAod29ya2Zsb3dzQ2hhbmdlZCB8fCBzdGVwc0NoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmtmbG93c0NhY2hlV3JpdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkRGlzY292ZXJlZEZpbGVzKFxuICAgICAgaW5wdXRGaWxlczogc3RyaW5nW10sXG4gICAgICBpbXBsaWNpdFN0ZXBGaWxlczogc3RyaW5nW11cbiAgICApIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG4gICAgICBjb25zdCBjYWNoZURpciA9IGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgdGhpcy5nZXREaXN0RGlyKCksICdjYWNoZScpO1xuICAgICAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc3QgbWFuaWZlc3RCdWlsZERpciA9IGpvaW4oY2FjaGVEaXIsICd3b3JrZmxvdy1nZW5lcmF0ZWQtbWFuaWZlc3QnKTtcbiAgICAgIGNvbnN0IHRlbXBSb3V0ZUZpbGVOYW1lID0gJ3JvdXRlLmpzLnRlbXAnO1xuICAgICAgY29uc3QgdHJhY2tlZERpc2NvdmVyZWRFbnRyaWVzID1cbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0VHJhY2tlZERpc2NvdmVyZWRFbnRyaWVzKCk7XG4gICAgICBjb25zdCBkaXNjb3ZlcmVkU3RlcEZpbGVDYW5kaWRhdGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4udGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnRyYWNrZWREaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU3RlcHMsXG4gICAgICAgICAgLi4uaW1wbGljaXRTdGVwRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVDYW5kaWRhdGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4udGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcyxcbiAgICAgICAgICAuLi50cmFja2VkRGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFdvcmtmbG93cyxcbiAgICAgICAgXSlcbiAgICAgICkuc29ydCgpO1xuICAgICAgY29uc3QgZGlzY292ZXJlZFNlcmRlRmlsZUNhbmRpZGF0ZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAuLi50aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLFxuICAgICAgICAgIC4uLnRyYWNrZWREaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgICAgICAgXSlcbiAgICAgICkuc29ydCgpO1xuICAgICAgY29uc3QgZGlzY292ZXJlZFdvcmtmbG93RmlsZXMgPSBhd2FpdCB0aGlzLmZpbHRlckV4aXN0aW5nRmlsZXMoXG4gICAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVDYW5kaWRhdGVzXG4gICAgICApO1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGVwRmlsZUNhbmRpZGF0ZXMgPSBhd2FpdCB0aGlzLmZpbHRlckV4aXN0aW5nRmlsZXMoXG4gICAgICAgIGRpc2NvdmVyZWRTdGVwRmlsZUNhbmRpZGF0ZXNcbiAgICAgICk7XG4gICAgICBjb25zdCBkaXNjb3ZlcmVkU3RlcEZpbGVzID0gYXdhaXQgdGhpcy5jb2xsZWN0VHJhbnNpdGl2ZVN0ZXBGaWxlcyh7XG4gICAgICAgIGVudHJ5RmlsZXM6IFsuLi5leGlzdGluZ1N0ZXBGaWxlQ2FuZGlkYXRlcywgLi4uZGlzY292ZXJlZFdvcmtmbG93RmlsZXNdLFxuICAgICAgICBzdGVwRmlsZXM6IGV4aXN0aW5nU3RlcEZpbGVDYW5kaWRhdGVzLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleGlzdGluZ1NlcmRlRmlsZUNhbmRpZGF0ZXMgPSBhd2FpdCB0aGlzLmZpbHRlckV4aXN0aW5nRmlsZXMoXG4gICAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVDYW5kaWRhdGVzXG4gICAgICApO1xuICAgICAgY29uc3QgZGlzY292ZXJlZFNlcmRlRmlsZXMgPSBhd2FpdCB0aGlzLmNvbGxlY3RUcmFuc2l0aXZlU2VyZGVGaWxlcyh7XG4gICAgICAgIGVudHJ5RmlsZXM6IFsuLi5kaXNjb3ZlcmVkU3RlcEZpbGVzLCAuLi5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlc10sXG4gICAgICAgIHNlcmRlRmlsZXM6IGV4aXN0aW5nU2VyZGVGaWxlQ2FuZGlkYXRlcyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhpc3RpbmdJbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5maWx0ZXJFeGlzdGluZ0ZpbGVzKGlucHV0RmlsZXMpO1xuICAgICAgY29uc3QgYnVpbGRJbnB1dEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4uZXhpc3RpbmdJbnB1dEZpbGVzLFxuICAgICAgICAgIC4uLmRpc2NvdmVyZWRTdGVwRmlsZXMsXG4gICAgICAgICAgLi4uZGlzY292ZXJlZFdvcmtmbG93RmlsZXMsXG4gICAgICAgICAgLi4uZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyZWRFbnRyaWVzID0ge1xuICAgICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQoZGlzY292ZXJlZFN0ZXBGaWxlcyksXG4gICAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IG5ldyBTZXQoZGlzY292ZXJlZFdvcmtmbG93RmlsZXMpLFxuICAgICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldChkaXNjb3ZlcmVkU2VyZGVGaWxlcyksXG4gICAgICB9O1xuXG4gICAgICAvLyBFbnN1cmUgb3V0cHV0IGRpcmVjdG9yaWVzIGV4aXN0XG4gICAgICBhd2FpdCBta2Rpcih3b3JrZmxvd0dlbmVyYXRlZERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLFxuICAgICAgICAnKidcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRzY29uZmlnUGF0aCA9IGF3YWl0IHRoaXMuZmluZFRzQ29uZmlnUGF0aCgpO1xuXG4gICAgICBjb25zdCBmbG93Um91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdycpO1xuICAgICAgYXdhaXQgbWtkaXIoZmxvd1JvdXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgY29tYmluZWRSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZURlZmVycmVkRmxvd1JvdXRlKHtcbiAgICAgICAgaW5wdXRGaWxlczogYnVpbGRJbnB1dEZpbGVzLFxuICAgICAgICBmbG93T3V0ZmlsZTogam9pbihmbG93Um91dGVEaXIsIHRlbXBSb3V0ZUZpbGVOYW1lKSxcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFdlYmhvb2tSb3V0ZSh7XG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICByb3V0ZUZpbGVOYW1lOiB0ZW1wUm91dGVGaWxlTmFtZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVHJhY2tlZERlcGVuZGVuY3lGaWxlcyhcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgIHRlbXBSb3V0ZUZpbGVOYW1lXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICAgICAgc3RlcHM6IHsgLi4uY29tYmluZWRSZXN1bHQ/Lm1hbmlmZXN0Py5zdGVwcyB9LFxuICAgICAgICB3b3JrZmxvd3M6IHsgLi4uY29tYmluZWRSZXN1bHQ/Lm1hbmlmZXN0Py53b3JrZmxvd3MgfSxcbiAgICAgICAgY2xhc3NlczogeyAuLi5jb21iaW5lZFJlc3VsdD8ubWFuaWZlc3Q/LmNsYXNzZXMgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmlmZXN0RmlsZVBhdGggPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnbWFuaWZlc3QuanNvbicpO1xuICAgICAgY29uc3QgbWFuaWZlc3RCdWlsZFBhdGggPSBqb2luKG1hbmlmZXN0QnVpbGREaXIsICdtYW5pZmVzdC5qc29uJyk7XG4gICAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgYGZsb3cvJHt0ZW1wUm91dGVGaWxlTmFtZX1gXG4gICAgICApO1xuICAgICAgY29uc3QgbWFuaWZlc3RKc29uID0gYXdhaXQgdGhpcy5jcmVhdGVNYW5pZmVzdCh7XG4gICAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgICAgbWFuaWZlc3REaXI6IG1hbmlmZXN0QnVpbGREaXIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgfSk7XG4gICAgICBpZiAobWFuaWZlc3RKc29uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmV3cml0ZUpzb25GaWxlV2l0aFN0YWJsZUtleU9yZGVyKG1hbmlmZXN0QnVpbGRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZUlmQ2hhbmdlZChtYW5pZmVzdEJ1aWxkUGF0aCwgbWFuaWZlc3RGaWxlUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBybShtYW5pZmVzdEJ1aWxkUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcm0obWFuaWZlc3RGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXIpO1xuXG4gICAgICAvLyBWMjogQ29tYmluZWQgcm91dGUgKGZsb3cpIOKAlCBzdGVwIHJlZ2lzdHJhdGlvbnMgYWxyZWFkeSBhdCBmaW5hbCBwYXRoXG4gICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCBgZmxvdy8ke3RlbXBSb3V0ZUZpbGVOYW1lfWApLFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdy9yb3V0ZS5qcycpXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZUlmQ2hhbmdlZChcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgYHdlYmhvb2svW3Rva2VuXS8ke3RlbXBSb3V0ZUZpbGVOYW1lfWApLFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnd2ViaG9vay9bdG9rZW5dL3JvdXRlLmpzJylcbiAgICAgICk7XG5cbiAgICAgIC8vIEV4cG9zZSBtYW5pZmVzdCBhcyBhIHN0YXRpYyBmaWxlIHdoZW4gV09SS0ZMT1dfUFVCTElDX01BTklGRVNUPTEuXG4gICAgICAvLyBOZXh0LmpzIHNlcnZlcyBmaWxlcyBmcm9tIHB1YmxpYy8gYXQgdGhlIHJvb3QgVVJMLlxuICAgICAgaWYgKHRoaXMuc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QgJiYgbWFuaWZlc3RKc29uKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY01hbmlmZXN0RGlyID0gam9pbihcbiAgICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEnXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IG1rZGlyKHB1YmxpY01hbmlmZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlRmlsZUlmQ2hhbmdlZChcbiAgICAgICAgICAgIGpvaW4ocHVibGljTWFuaWZlc3REaXIsICcuZ2l0aWdub3JlJyksXG4gICAgICAgICAgICAnKidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVJZkNoYW5nZWQoXG4gICAgICAgICAgbWFuaWZlc3RGaWxlUGF0aCxcbiAgICAgICAgICBqb2luKHB1YmxpY01hbmlmZXN0RGlyLCAnbWFuaWZlc3QuanNvbicpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdGlmeSBkZWZlcnJlZCBlbnRyeSBsb2FkZXJzIHdhaXRpbmcgb24gcm91dGUuanMgc3R1YnMuXG4gICAgICB0aGlzLnNvY2tldElPPy5lbWl0KCdidWlsZC1jb21wbGV0ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRGVmZXJyZWRGbG93Um91dGUoe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIGZsb3dPdXRmaWxlLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgfToge1xuICAgICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgICBmbG93T3V0ZmlsZTogc3RyaW5nO1xuICAgICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgICAgZGlzY292ZXJlZEVudHJpZXM6IHtcbiAgICAgICAgZGlzY292ZXJlZFN0ZXBzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogU2V0PHN0cmluZz47XG4gICAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVzOiBTZXQ8c3RyaW5nPjtcbiAgICAgIH07XG4gICAgfSk6IFByb21pc2U8eyBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCB9PiB7XG4gICAgICBjb25zdCB3b3JrZmxvd1Jlc3VsdCA9IGF3YWl0IHRoaXMuY3JlYXRlV29ya2Zsb3dzQnVuZGxlKHtcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgb3V0ZmlsZTogYCR7Zmxvd091dGZpbGV9Ll9fd2ZfdG1wLmpzYCxcbiAgICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93Vk1Db2RlID0gd29ya2Zsb3dSZXN1bHQuaW50ZXJpbUJ1bmRsZVRleHQ7XG4gICAgICBpZiAoIXdvcmtmbG93Vk1Db2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGRpZCBub3QgcmV0dXJuIGludGVyaW1CdW5kbGVUZXh0J1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBybShgJHtmbG93T3V0ZmlsZX0uX193Zl90bXAuanNgLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9ycy5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RlcEFuZFNlcmRlRmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU3RlcHMsXG4gICAgICAgICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IHN0ZXBJbXBvcnRzID0gYXdhaXQgdGhpcy5jcmVhdGVEZWZlcnJlZFN0ZXBTaWRlRWZmZWN0SW1wb3J0cyhcbiAgICAgICAgc3RlcEFuZFNlcmRlRmlsZXMsXG4gICAgICAgIGRpcm5hbWUoZmxvd091dGZpbGUpXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RlcE1hbmlmZXN0ID1cbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVEZWZlcnJlZFN0ZXBNYW5pZmVzdChzdGVwQW5kU2VyZGVGaWxlcyk7XG4gICAgICBjb25zdCBlc2NhcGVkVk1Db2RlID0gd29ya2Zsb3dWTUNvZGUucmVwbGFjZSgvW1xcXFxgJF0vZywgJ1xcXFwkJicpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgPVxuICAgICAgICBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSgpO1xuICAgICAgY29uc3Qgcm91dGVDb2RlID0gYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJztcbiR7c3RlcEltcG9ydHN9XG5pbXBvcnQgeyB3b3JrZmxvd0VudHJ5cG9pbnQgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztcblxuY29uc3Qgd29ya2Zsb3dDb2RlID0gXFxgJHtlc2NhcGVkVk1Db2RlfVxcYDtcblxuZXhwb3J0IGNvbnN0IFBPU1QgPSB3b3JrZmxvd0VudHJ5cG9pbnQod29ya2Zsb3dDb2RlJHt3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZX0pO2A7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKGZsb3dPdXRmaWxlLCByb3V0ZUNvZGUpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgIC4uLnN0ZXBNYW5pZmVzdCxcbiAgICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICAgIC4uLnN0ZXBNYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgICAgICAuLi53b3JrZmxvd1Jlc3VsdC5tYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgICAuLi5zdGVwTWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgICAgICAgIC4uLndvcmtmbG93UmVzdWx0Lm1hbmlmZXN0LmNsYXNzZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVEZWZlcnJlZFN0ZXBTaWRlRWZmZWN0SW1wb3J0cyhcbiAgICAgIGZpbGVzOiBzdHJpbmdbXSxcbiAgICAgIHJvdXRlRGlyOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgaW1wb3J0U3BlY2lmaWVycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoKGZpbGUpID0+XG4gICAgICAgICAgdGhpcy5nZXREZWZlcnJlZFJvdXRlSW1wb3J0U3BlY2lmaWVyKGZpbGUsIHJvdXRlRGlyKVxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gaW1wb3J0U3BlY2lmaWVyc1xuICAgICAgICAubWFwKChzcGVjaWZpZXIpID0+IGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfTtgKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXREZWZlcnJlZFJvdXRlSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgZmlsZTogc3RyaW5nLFxuICAgICAgcm91dGVEaXI6IHN0cmluZ1xuICAgICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICAgKTtcblxuICAgICAgaWYgKGlzUGFja2FnZSkge1xuICAgICAgICByZXR1cm4gaW1wb3J0UGF0aDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlRGVmZXJyZWRSb3V0ZUltcG9ydEZpbGVQYXRoKFxuICAgICAgICByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGltcG9ydFBhdGgpXG4gICAgICApO1xuICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKHJvdXRlRGlyLCBhYnNvbHV0ZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVEZWZlcnJlZFJvdXRlSW1wb3J0RmlsZVBhdGgoXG4gICAgICBmaWxlUGF0aDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXN0UGF0aCA9XG4gICAgICAgIHRoaXMucmVzb2x2ZVBhY2thZ2VTb3VyY2VEaXN0RmlsZVBhdGhGb3JSb3V0ZUltcG9ydChmaWxlUGF0aCk7XG4gICAgICBpZiAocGFja2FnZURpc3RQYXRoKSB7XG4gICAgICAgIHJldHVybiBwYWNrYWdlRGlzdFBhdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQYWNrYWdlU291cmNlRGlzdEZpbGVQYXRoRm9yUm91dGVJbXBvcnQoXG4gICAgICBmaWxlUGF0aDogc3RyaW5nXG4gICAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICBjb25zdCByZWxhdGl2ZVRvV29ya2luZ0RpciA9IHJlbGF0aXZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlbGF0aXZlVG9Xb3JraW5nRGlyLnN0YXJ0c1dpdGgoJy4uJykgJiZcbiAgICAgICAgIWlzQWJzb2x1dGUocmVsYXRpdmVUb1dvcmtpbmdEaXIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VSb290ID0gdGhpcy5maW5kUGFja2FnZVJvb3RGb3JSb3V0ZUltcG9ydFNvdXJjZShmaWxlUGF0aCk7XG4gICAgICBpZiAoIXBhY2thZ2VSb290KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGl2ZVRvUGFja2FnZVJvb3QgPSByZWxhdGl2ZShwYWNrYWdlUm9vdCwgZmlsZVBhdGgpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHNyY1ByZWZpeCA9ICdzcmMvJztcbiAgICAgIGlmICghcmVsYXRpdmVUb1BhY2thZ2VSb290LnN0YXJ0c1dpdGgoc3JjUHJlZml4KSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShyZWxhdGl2ZVRvUGFja2FnZVJvb3QpO1xuICAgICAgY29uc3Qgb3V0cHV0RXh0ZW5zaW9uID1cbiAgICAgICAgZXh0ZW5zaW9uID09PSAnLm10cycgPyAnLm1qcycgOiBleHRlbnNpb24gPT09ICcuY3RzJyA/ICcuY2pzJyA6ICcuanMnO1xuICAgICAgY29uc3Qgd2l0aG91dEV4dGVuc2lvbiA9IHJlbGF0aXZlVG9QYWNrYWdlUm9vdC5zbGljZShcbiAgICAgICAgc3JjUHJlZml4Lmxlbmd0aCxcbiAgICAgICAgcmVsYXRpdmVUb1BhY2thZ2VSb290Lmxlbmd0aCAtIGV4dGVuc2lvbi5sZW5ndGhcbiAgICAgICk7XG4gICAgICBjb25zdCBkaXN0UGF0aCA9IGpvaW4oXG4gICAgICAgIHBhY2thZ2VSb290LFxuICAgICAgICAnZGlzdCcsXG4gICAgICAgIGAke3dpdGhvdXRFeHRlbnNpb259JHtvdXRwdXRFeHRlbnNpb259YFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGV4aXN0c1N5bmMoZGlzdFBhdGgpID8gZGlzdFBhdGggOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFBhY2thZ2VSb290Rm9yUm91dGVJbXBvcnRTb3VyY2UoXG4gICAgICBmaWxlUGF0aDogc3RyaW5nXG4gICAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICBsZXQgY3VycmVudERpciA9IGRpcm5hbWUoZmlsZVBhdGgpO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhqb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudERpciA9IGRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICAgIGlmIChwYXJlbnREaXIgPT09IGN1cnJlbnREaXIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RGlyID0gcGFyZW50RGlyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRGVmZXJyZWRTdGVwTWFuaWZlc3QoXG4gICAgICBmaWxlczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPFdvcmtmbG93TWFuaWZlc3Q+IHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgICBjb25zdCBtYW5pZmVzdEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4uZmlsZXMsXG4gICAgICAgICAgLi4uKGF3YWl0IHRoaXMucmVzb2x2ZUJ1aWx0SW5TdGVwRmlsZXNGb3JNYW5pZmVzdCgpKSxcbiAgICAgICAgXSlcbiAgICAgICkuc29ydCgpO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbWFuaWZlc3RGaWxlcykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShmaWxlLCAndXRmOCcpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGl2ZUZpbGVwYXRoID0gYXdhaXQgdGhpcy5nZXRSZWxhdGl2ZUZpbGVuYW1lRm9yU3djKGZpbGUpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93TWFuaWZlc3QgfSA9IGF3YWl0IGFwcGx5U3djVHJhbnNmb3JtKFxuICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGgsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgICdzdGVwJyxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3RcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZXJnZVdvcmtmbG93TWFuaWZlc3QobWFuaWZlc3QsIHdvcmtmbG93TWFuaWZlc3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlQnVpbHRJblN0ZXBGaWxlc0Zvck1hbmlmZXN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93UmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoXG4gICAgICAgICAgam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAncGFja2FnZS5qc29uJylcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChcbiAgICAgICAgICAgIHdvcmtmbG93UmVxdWlyZS5yZXNvbHZlKCd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucycpXG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZXJnZVdvcmtmbG93TWFuaWZlc3QoXG4gICAgICB0YXJnZXQ6IFdvcmtmbG93TWFuaWZlc3QsXG4gICAgICBzb3VyY2U6IFdvcmtmbG93TWFuaWZlc3RcbiAgICApOiB2b2lkIHtcbiAgICAgIHRhcmdldC53b3JrZmxvd3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICB0YXJnZXQud29ya2Zsb3dzIHx8IHt9LFxuICAgICAgICBzb3VyY2Uud29ya2Zsb3dzXG4gICAgICApO1xuICAgICAgdGFyZ2V0LnN0ZXBzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQuc3RlcHMgfHwge30sIHNvdXJjZS5zdGVwcyk7XG4gICAgICB0YXJnZXQuY2xhc3NlcyA9IE9iamVjdC5hc3NpZ24odGFyZ2V0LmNsYXNzZXMgfHwge30sIHNvdXJjZS5jbGFzc2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBHZW5lcmF0ZWRBcnRpZmFjdHNPbkJvb3QoXG4gICAgICBvdXRwdXREaXI6IHN0cmluZ1xuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG4gICAgICBjb25zdCBmbG93Um91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdycpO1xuICAgICAgY29uc3Qgc3RlcFJvdXRlRGlyID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ3N0ZXAnKTtcbiAgICAgIGNvbnN0IHdlYmhvb2tSb3V0ZURpciA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICd3ZWJob29rL1t0b2tlbl0nKTtcblxuICAgICAgY29uc3Qgc3RhbGVBcnRpZmFjdFBhdGhzID0gW1xuICAgICAgICBqb2luKGZsb3dSb3V0ZURpciwgJ3JvdXRlLmpzLnRlbXAnKSxcbiAgICAgICAgam9pbihmbG93Um91dGVEaXIsICdyb3V0ZS5qcy50ZW1wLmRlYnVnLmpzb24nKSxcbiAgICAgICAgam9pbihmbG93Um91dGVEaXIsICdyb3V0ZS5qcy5kZWJ1Zy5qc29uJyksXG4gICAgICAgIGpvaW4oZmxvd1JvdXRlRGlyLCAnX19zdGVwX3JlZ2lzdHJhdGlvbnMucm91dGUuanMudGVtcCcpLFxuICAgICAgICBqb2luKGZsb3dSb3V0ZURpciwgJ19fc3RlcF9yZWdpc3RyYXRpb25zLnJvdXRlLmpzLnRlbXAuZGVidWcuanNvbicpLFxuICAgICAgICAvLyBWMjogY2xlYW4gdXAgc3RhbGUgVjEgc3RlcCByb3V0ZSBkaXJlY3RvcnlcbiAgICAgICAgc3RlcFJvdXRlRGlyLFxuICAgICAgICBqb2luKHdlYmhvb2tSb3V0ZURpciwgJ3JvdXRlLmpzLnRlbXAnKSxcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ21hbmlmZXN0Lmpzb24nKSxcbiAgICAgIF07XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uc3RhbGVBcnRpZmFjdFBhdGhzLm1hcCgoc3RhbGVQYXRoKSA9PlxuICAgICAgICAgIHJtKHN0YWxlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICAgICksXG4gICAgICAgIGNsZWFudXBTdGFsZVNvY2tldEluZm9GaWxlcyhcbiAgICAgICAgICBqb2luKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHRoaXMuZ2V0RGlzdERpcigpKVxuICAgICAgICApLFxuICAgICAgICB0aGlzLnJlbW92ZVN0YWxlRGVmZXJyZWRUZW1wRmlsZXMoZmxvd1JvdXRlRGlyKSxcbiAgICAgICAgdGhpcy5yZW1vdmVTdGFsZURlZmVycmVkVGVtcEZpbGVzKHdlYmhvb2tSb3V0ZURpciksXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlbW92ZVN0YWxlRGVmZXJyZWRUZW1wRmlsZXMoXG4gICAgICByb3V0ZURpcjogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCByb3V0ZUVudHJpZXMgPSBhd2FpdCByZWFkZGlyKHJvdXRlRGlyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICB9KS5jYXRjaCgoKSA9PiBbXSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcm91dGVFbnRyaWVzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChlbnRyeSkgPT5cbiAgICAgICAgICAgICAgZW50cnkuaXNGaWxlKCkgJiZcbiAgICAgICAgICAgICAgZW50cnkubmFtZS5zdGFydHNXaXRoKCdyb3V0ZS5qcy4nKSAmJlxuICAgICAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudG1wJylcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgICBybShqb2luKHJvdXRlRGlyLCBlbnRyeS5uYW1lKSwge1xuICAgICAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZURpc2NvdmVyeVNvY2tldFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICh0aGlzLnNvY2tldElPIHx8IHByb2Nlc3MuZW52LldPUktGTE9XX1NPQ0tFVF9QT1JUKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09DS0VUX0lORk9fUEFUSCA9IHRoaXMuZ2V0U29ja2V0SW5mb0ZpbGVQYXRoKCk7XG4gICAgICBjb25zdCBjb25maWc6IFNvY2tldFNlcnZlckNvbmZpZyA9IHtcbiAgICAgICAgaXNEZXZTZXJ2ZXI6IEJvb2xlYW4odGhpcy5jb25maWcud2F0Y2gpLFxuICAgICAgICBzb2NrZXRJbmZvRmlsZVBhdGg6IHRoaXMuZ2V0U29ja2V0SW5mb0ZpbGVQYXRoKCksXG4gICAgICAgIG9uRmlsZURpc2NvdmVyZWQ6IChcbiAgICAgICAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICAgIGhhc1dvcmtmbG93OiBib29sZWFuLFxuICAgICAgICAgIGhhc1N0ZXA6IGJvb2xlYW4sXG4gICAgICAgICAgaGFzU2VyZGU6IGJvb2xlYW5cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgICAgIGxldCBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgY29uc3Qgd2FzVHJhY2tlZERlcGVuZGVuY3kgPVxuICAgICAgICAgICAgdGhpcy50cmFja2VkRGVwZW5kZW5jeUZpbGVzLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpO1xuXG4gICAgICAgICAgaWYgKGhhc1dvcmtmbG93KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcy5hZGQobm9ybWFsaXplZEZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc0RlbGV0ZWQgPVxuICAgICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVzLmRlbGV0ZShub3JtYWxpemVkRmlsZVBhdGgpO1xuICAgICAgICAgICAgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZSA9IHdhc0RlbGV0ZWQgfHwgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzU3RlcCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2NvdmVyZWRTdGVwRmlsZXMuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmFkZChub3JtYWxpemVkRmlsZVBhdGgpO1xuICAgICAgICAgICAgICBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2FzRGVsZXRlZCA9XG4gICAgICAgICAgICAgIHRoaXMuZGlzY292ZXJlZFN0ZXBGaWxlcy5kZWxldGUobm9ybWFsaXplZEZpbGVQYXRoKTtcbiAgICAgICAgICAgIGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2UgPSB3YXNEZWxldGVkIHx8IGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1NlcmRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFNlcmRlRmlsZXMuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmFkZChub3JtYWxpemVkRmlsZVBhdGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3YXNEZWxldGVkID1cbiAgICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcy5kZWxldGUobm9ybWFsaXplZEZpbGVQYXRoKTtcbiAgICAgICAgICAgIGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2UgPSB3YXNEZWxldGVkIHx8IGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrZmxvd3NDYWNoZVdyaXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaGFzV29ya2Zsb3cgfHxcbiAgICAgICAgICAgIGhhc1N0ZXAgfHxcbiAgICAgICAgICAgIGhhc1NlcmRlIHx8XG4gICAgICAgICAgICBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlIHx8XG4gICAgICAgICAgICB3YXNUcmFja2VkRGVwZW5kZW5jeVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZURlZmVycmVkUmVidWlsZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25UcmlnZ2VyQnVpbGQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlRGVmZXJyZWRSZWJ1aWxkKCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNvY2tldElPID0gYXdhaXQgY3JlYXRlU29ja2V0U2VydmVyKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRGlzY292ZXJ5U3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAodGhpcy5jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5sb2FkV29ya2Zsb3dzQ2FjaGUoKTtcbiAgICAgIC8vIERlZmVycmVkIG1vZGUgbXVzdCBub3QgcnVuIGVhZ2VyIGlucHV0LWdyYXBoIGRpc2NvdmVyeTsgZW50cmllcyBhcmVcbiAgICAgIC8vIGRpc2NvdmVyZWQgdmlhIGxvYWRlci0+c29ja2V0IG5vdGlmaWNhdGlvbnMgZHVyaW5nIE5leHQncyBidWlsZC5cbiAgICAgIHRoaXMuY2FjaGVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREaXN0RGlyKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gKHRoaXMuY29uZmlnIGFzIHsgZGlzdERpcj86IHN0cmluZyB9KS5kaXN0RGlyIHx8ICcubmV4dCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXb3JrZmxvd3NDYWNoZUZpbGVQYXRoKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gam9pbihcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgdGhpcy5nZXREaXN0RGlyKCksXG4gICAgICAgICdjYWNoZScsXG4gICAgICAgICd3b3JrZmxvd3MuanNvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb2NrZXRJbmZvRmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBqb2luKFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICB0aGlzLmdldERpc3REaXIoKSxcbiAgICAgICAgU09DS0VUX0lORk9fRklMRU5BTUVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kUGFja2FnZUpzb25QYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gZGlybmFtZShmaWxlUGF0aCk7XG4gICAgICBsZXQgcHJldmlvdXNEaXIgPSAnJztcblxuICAgICAgd2hpbGUgKGN1cnJlbnREaXIgIT09IHByZXZpb3VzRGlyKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0RpciA9IGN1cnJlbnREaXI7XG4gICAgICAgIGN1cnJlbnREaXIgPSBkaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3VsZFByZWZlclNvdXJjZUJhY2tlZFBhY2thZ2VQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gT25seSBwcmVmZXIgc291cmNlIGZvciB3b3Jrc3BhY2UgcGFja2FnZXMgKG5vdCBpbiBub2RlX21vZHVsZXMpLlxuICAgICAgLy8gRm9yIHRhcmJhbGwtaW5zdGFsbGVkIHBhY2thZ2VzLCB1c2luZyBzb3VyY2UtYmFja2VkIHBhdGhzIGNhdXNlc1xuICAgICAgLy8gZXNidWlsZCB0byBidW5kbGUgdGhlIGZ1bGwgc291cmNlIHRyZWUgKGluY2x1ZGluZyB3b3JsZC50cyB3aXRoXG4gICAgICAvLyBwcm9jZXNzLmN3ZCgpKSBpbnN0ZWFkIG9mIGV4dGVybmFsaXppbmcgcHJvcGVybHkuXG4gICAgICBpZiAoXG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvcGFja2FnZXMvJykgJiZcbiAgICAgICAgIW5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSB0aGlzLmZpbmRQYWNrYWdlSnNvblBhdGgoZmlsZVBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvblBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JylcbiAgICAgICAgKSBhcyB7IG5hbWU/OiB1bmtub3duIH07XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcGFja2FnZUpzb24ubmFtZSA9PT0gJ3dvcmtmbG93JyB8fFxuICAgICAgICAgICh0eXBlb2YgcGFja2FnZUpzb24ubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIHBhY2thZ2VKc29uLm5hbWUuc3RhcnRzV2l0aCgnQHdvcmtmbG93LycpKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBpc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgICA/IGZpbGVQYXRoXG4gICAgICAgIDogcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBmaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaWx0ZXJFeGlzdGluZ0ZpbGVzKGZpbGVQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICBmaWxlUGF0aHMubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplRGlzY292ZXJlZEZpbGVQYXRoKGZpbGVQYXRoKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zb3J0KCk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbm9ybWFsaXplZEZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVTdGF0cy5pc0ZpbGUoKSA/IGZpbGVQYXRoIDogbnVsbDtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBleGlzdGluZ0ZpbGVzLmZpbHRlcigoZmlsZVBhdGgpOiBmaWxlUGF0aCBpcyBzdHJpbmcgPT5cbiAgICAgICAgQm9vbGVhbihmaWxlUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVEZWZlcnJlZEJ1aWxkU2lnbmF0dXJlKFxuICAgICAgaW5wdXRGaWxlczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4uaW5wdXRGaWxlcy5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoZmlsZVBhdGgpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi50aGlzLnRyYWNrZWREZXBlbmRlbmN5RmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcblxuICAgICAgY29uc3Qgc2lnbmF0dXJlUGFydHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbm9ybWFsaXplZEZpbGVzLm1hcChhc3luYyAoZmlsZVBhdGgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgc3RhdChmaWxlUGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gYCR7ZmlsZVBhdGh9OiR7ZmlsZVN0YXRzLnNpemV9OiR7TWF0aC50cnVuYyhmaWxlU3RhdHMubXRpbWVNcyl9YDtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtmaWxlUGF0aH06bWlzc2luZ2A7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2lnbmF0dXJlSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICAgICAgZm9yIChjb25zdCBzaWduYXR1cmVQYXJ0IG9mIHNpZ25hdHVyZVBhcnRzKSB7XG4gICAgICAgIHNpZ25hdHVyZUhhc2gudXBkYXRlKHNpZ25hdHVyZVBhcnQpO1xuICAgICAgICBzaWduYXR1cmVIYXNoLnVwZGF0ZSgnXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzaWduYXR1cmVIYXNoLmRpZ2VzdCgnaGV4Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0VHJhY2tlZERpc2NvdmVyZWRFbnRyaWVzKCk6IFByb21pc2U8e1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBzdHJpbmdbXTtcbiAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IHN0cmluZ1tdO1xuICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IHN0cmluZ1tdO1xuICAgIH0+IHtcbiAgICAgIGlmICh0aGlzLnRyYWNrZWREZXBlbmRlbmN5RmlsZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpc2NvdmVyZWRTdGVwczogW10sXG4gICAgICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogW10sXG4gICAgICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IFtdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHdvcmtmbG93RmlsZXMsIHN0ZXBGaWxlcywgc2VyZGVGaWxlcyB9ID1cbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVEaXNjb3ZlcmVkRW50cmllcyh7XG4gICAgICAgICAgd29ya2Zsb3dDYW5kaWRhdGVzOiB0aGlzLnRyYWNrZWREZXBlbmRlbmN5RmlsZXMsXG4gICAgICAgICAgc3RlcENhbmRpZGF0ZXM6IHRoaXMudHJhY2tlZERlcGVuZGVuY3lGaWxlcyxcbiAgICAgICAgICBzZXJkZUNhbmRpZGF0ZXM6IHRoaXMudHJhY2tlZERlcGVuZGVuY3lGaWxlcyxcbiAgICAgICAgICB2YWxpZGF0ZVBhdHRlcm5zOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzY292ZXJlZFN0ZXBzOiBBcnJheS5mcm9tKHN0ZXBGaWxlcykuc29ydCgpLFxuICAgICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBBcnJheS5mcm9tKHdvcmtmbG93RmlsZXMpLnNvcnQoKSxcbiAgICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IEFycmF5LmZyb20oc2VyZGVGaWxlcykuc29ydCgpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUcmFja2VkRGVwZW5kZW5jeUZpbGVzKFxuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZyxcbiAgICAgIHJvdXRlRmlsZU5hbWU6IHN0cmluZ1xuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgYnVuZGxlRmlsZXMgPSBbXG4gICAgICAgIGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsIGBzdGVwLyR7cm91dGVGaWxlTmFtZX1gKSxcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgYGZsb3cvJHtyb3V0ZUZpbGVOYW1lfWApLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHRyYWNrZWRGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IGJ1bmRsZUZpbGUgb2YgYnVuZGxlRmlsZXMpIHtcbiAgICAgICAgY29uc3QgYnVuZGxlU291cmNlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEJ1bmRsZVNvdXJjZUZpbGVzKGJ1bmRsZUZpbGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgYnVuZGxlU291cmNlcykge1xuICAgICAgICAgIHRyYWNrZWRGaWxlcy5hZGQoc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRyYWNrZWRGaWxlcy5zaXplID4gMCkge1xuICAgICAgICB0aGlzLnRyYWNrZWREZXBlbmRlbmN5RmlsZXMgPSB0cmFja2VkRmlsZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleHRyYWN0QnVuZGxlU291cmNlRmlsZXMoXG4gICAgICBidW5kbGVGaWxlUGF0aDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgbGV0IGJ1bmRsZUNvbnRlbnRzOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBidW5kbGVDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKGJ1bmRsZUZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VEaXJlY3RvcnkgPSBkaXJuYW1lKGJ1bmRsZUZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGxvY2FsU291cmNlRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgLy8gRXh0cmFjdCBpbmxpbmUgYmFzZTY0IHNvdXJjZW1hcHMgdmlhIHN0cmluZyBzY2FubmluZy4gQSBwcmV2aW91c1xuICAgICAgLy8gaW1wbGVtZW50YXRpb24gdXNlZCBgYnVuZGxlQ29udGVudHMubWF0Y2hBbGwoLy4uLltBLVphLXowLTkrLz1dKy4uLi9nKWBcbiAgICAgIC8vIHdoaWNoIG92ZXJmbG93cyBWOCdzIHJlZ2V4IHN0YWNrXG4gICAgICAvLyAoYFJhbmdlRXJyb3I6IE1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkIGF0IFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLm5leHRgKVxuICAgICAgLy8gb24gYnVuZGxlcyB3aXRoIGxhcmdlIGlubGluZSBzb3VyY2VtYXBzIOKAlCBWOCdzIGlycmVnZXhwIHVzZXNcbiAgICAgIC8vIHJlY3Vyc2lvbiBmb3IgZ3JlZWR5IGNoYXJhY3Rlci1jbGFzcyBxdWFudGlmaWVycyBhbmQgY2VydGFpbiBsb25nXG4gICAgICAvLyBiYXNlNjQgaW5wdXRzIGV4aGF1c3QgdGhlIGNhbGwgc3RhY2suXG4gICAgICBjb25zdCBzb3VyY2VNYXBQcmVmaXggPSAnLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uJztcbiAgICAgIGNvbnN0IGJhc2U2NE1hcmtlciA9ICc7YmFzZTY0LCc7XG4gICAgICBjb25zdCBzb3VyY2VNYXBNYXRjaGVzOiBBcnJheTx7IGJhc2U2NFZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgIGxldCBzY2FuRnJvbSA9IDA7XG4gICAgICB3aGlsZSAoc2NhbkZyb20gPCBidW5kbGVDb250ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcHJlZml4SWR4ID0gYnVuZGxlQ29udGVudHMuaW5kZXhPZihzb3VyY2VNYXBQcmVmaXgsIHNjYW5Gcm9tKTtcbiAgICAgICAgaWYgKHByZWZpeElkeCA9PT0gLTEpIGJyZWFrO1xuICAgICAgICBjb25zdCBiYXNlNjRTdGFydCA9IGJ1bmRsZUNvbnRlbnRzLmluZGV4T2YoXG4gICAgICAgICAgYmFzZTY0TWFya2VyLFxuICAgICAgICAgIHByZWZpeElkeCArIHNvdXJjZU1hcFByZWZpeC5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGJhc2U2NFN0YXJ0ID09PSAtMSkge1xuICAgICAgICAgIHNjYW5Gcm9tID0gcHJlZml4SWR4ICsgc291cmNlTWFwUHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCYWlsIGlmIGEgY29tbWEgYXBwZWFycyBiZWZvcmUgYDtiYXNlNjQsYCDigJQgdGhhdCBtZWFucyB0aGlzXG4gICAgICAgIC8vIHdhc24ndCBhIGBkYXRhOmFwcGxpY2F0aW9uL2pzb25bO3BhcmFtc107YmFzZTY0LC4uLmAgVVJMIGFmdGVyXG4gICAgICAgIC8vIGFsbCAodGhlIGNvbW1hIHdvdWxkIHRlcm1pbmF0ZSB0aGUgZGF0YSBVUkwgcGFyYW1ldGVycykuXG4gICAgICAgIGNvbnN0IGNvbW1hQmVmb3JlID0gYnVuZGxlQ29udGVudHMuaW5kZXhPZignLCcsIHByZWZpeElkeCk7XG4gICAgICAgIGlmIChjb21tYUJlZm9yZSAhPT0gLTEgJiYgY29tbWFCZWZvcmUgPCBiYXNlNjRTdGFydCkge1xuICAgICAgICAgIHNjYW5Gcm9tID0gYmFzZTY0U3RhcnQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVTdGFydCA9IGJhc2U2NFN0YXJ0ICsgYmFzZTY0TWFya2VyLmxlbmd0aDtcbiAgICAgICAgLy8gQmFzZTY0IHBheWxvYWQgdGVybWluYXRlcyBhdCBmaXJzdCBub24tYmFzZTY0IGNoYXIgKG5ld2xpbmUsXG4gICAgICAgIC8vIGNsb3NpbmcgYCovYCwgZXRjLikuIFNjYW5uaW5nIGEgc21hbGwgYWxwaGFiZXQgYnkgY2hhciBpcyBmYXJcbiAgICAgICAgLy8gY2hlYXBlciB0aGFuIGJhY2t0cmFja2luZyBhIHJlZ2V4IG92ZXIgYSBtdWx0aS1NQiBjYXB0dXJlLlxuICAgICAgICBsZXQgdmFsdWVFbmQgPSB2YWx1ZVN0YXJ0O1xuICAgICAgICB3aGlsZSAodmFsdWVFbmQgPCBidW5kbGVDb250ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBjb2RlID0gYnVuZGxlQ29udGVudHMuY2hhckNvZGVBdCh2YWx1ZUVuZCk7XG4gICAgICAgICAgLy8gQS1aIDB4NDEtMHg1QSwgYS16IDB4NjEtMHg3QSwgMC05IDB4MzAtMHgzOSwgJysnIDB4MkIsXG4gICAgICAgICAgLy8gJy8nIDB4MkYsICc9JyAweDNEXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgKGNvZGUgPj0gMHg0MSAmJiBjb2RlIDw9IDB4NWEpIHx8XG4gICAgICAgICAgICAgIChjb2RlID49IDB4NjEgJiYgY29kZSA8PSAweDdhKSB8fFxuICAgICAgICAgICAgICAoY29kZSA+PSAweDMwICYmIGNvZGUgPD0gMHgzOSkgfHxcbiAgICAgICAgICAgICAgY29kZSA9PT0gMHgyYiB8fFxuICAgICAgICAgICAgICBjb2RlID09PSAweDJmIHx8XG4gICAgICAgICAgICAgIGNvZGUgPT09IDB4M2RcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZUVuZCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZUVuZCA+IHZhbHVlU3RhcnQpIHtcbiAgICAgICAgICBzb3VyY2VNYXBNYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgYmFzZTY0VmFsdWU6IGJ1bmRsZUNvbnRlbnRzLnNsaWNlKHZhbHVlU3RhcnQsIHZhbHVlRW5kKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzY2FuRnJvbSA9IHZhbHVlRW5kO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNvdXJjZU1hcE1hdGNoZXMpIHtcbiAgICAgICAgY29uc3QgYmFzZTY0VmFsdWUgPSBtYXRjaC5iYXNlNjRWYWx1ZTtcbiAgICAgICAgaWYgKCFiYXNlNjRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNvdXJjZU1hcDogeyBzb3VyY2VSb290PzogdW5rbm93bjsgc291cmNlcz86IHVua25vd24gfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgQnVmZmVyLmZyb20oYmFzZTY0VmFsdWUsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKVxuICAgICAgICAgICkgYXMgeyBzb3VyY2VSb290PzogdW5rbm93bjsgc291cmNlcz86IHVua25vd24gfTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VSb290ID1cbiAgICAgICAgICB0eXBlb2Ygc291cmNlTWFwLnNvdXJjZVJvb3QgPT09ICdzdHJpbmcnID8gc291cmNlTWFwLnNvdXJjZVJvb3QgOiAnJztcbiAgICAgICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoc291cmNlTWFwLnNvdXJjZXMpXG4gICAgICAgICAgPyBzb3VyY2VNYXAuc291cmNlcy5maWx0ZXIoXG4gICAgICAgICAgICAgIChzb3VyY2UpOiBzb3VyY2UgaXMgc3RyaW5nID0+IHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKCd3ZWJwYWNrOi8vJykgfHwgc291cmNlLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHJlc29sdmVkU291cmNlUGF0aDogc3RyaW5nO1xuICAgICAgICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXNvbHZlZFNvdXJjZVBhdGggPSBkZWNvZGVVUklDb21wb25lbnQobmV3IFVSTChzb3VyY2UpLnBhdGhuYW1lKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQWJzb2x1dGUoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRTb3VyY2VQYXRoID0gc291cmNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlZFNvdXJjZVBhdGggPSByZXNvbHZlKGJhc2VEaXJlY3RvcnksIHNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNvdXJjZVBhdGggPVxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgocmVzb2x2ZWRTb3VyY2VQYXRoKTtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkU291cmNlUGF0aEZvckNoZWNrID0gbm9ybWFsaXplZFNvdXJjZVBhdGgucmVwbGFjZShcbiAgICAgICAgICAgIC9cXFxcL2csXG4gICAgICAgICAgICAnLydcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGlzU291cmNlQmFja2VkUGFja2FnZVBhdGggPVxuICAgICAgICAgICAgdGhpcy5zaG91bGRQcmVmZXJTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aChub3JtYWxpemVkU291cmNlUGF0aCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9ybWFsaXplZFNvdXJjZVBhdGhGb3JDaGVjay5pbmNsdWRlcygnLy53ZWxsLWtub3duL3dvcmtmbG93LycpIHx8XG4gICAgICAgICAgICAoIWlzU291cmNlQmFja2VkUGFja2FnZVBhdGggJiZcbiAgICAgICAgICAgICAgbm9ybWFsaXplZFNvdXJjZVBhdGhGb3JDaGVjay5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSkgfHxcbiAgICAgICAgICAgICghaXNTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aCAmJlxuICAgICAgICAgICAgICBub3JtYWxpemVkU291cmNlUGF0aEZvckNoZWNrLmluY2x1ZGVzKCcvLnBucG0vJykpIHx8XG4gICAgICAgICAgICBub3JtYWxpemVkU291cmNlUGF0aEZvckNoZWNrLmluY2x1ZGVzKCcvLm5leHQvJykgfHxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRTb3VyY2VQYXRoRm9yQ2hlY2suZW5kc1dpdGgoJy92aXJ0dWFsLWVudHJ5LmpzJylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvY2FsU291cmNlRmlsZXMuYWRkKG5vcm1hbGl6ZWRTb3VyY2VQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShsb2NhbFNvdXJjZUZpbGVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjaGVkdWxlV29ya2Zsb3dzQ2FjaGVXcml0ZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmNhY2hlV3JpdGVUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jYWNoZVdyaXRlVGltZXIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlV3JpdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhY2hlV3JpdGVUaW1lciA9IG51bGw7XG4gICAgICAgIHZvaWQgdGhpcy53cml0ZVdvcmtmbG93c0NhY2hlKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gd3JpdGUgd29ya2Zsb3cgZGlzY292ZXJ5IGNhY2hlJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIDUwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjaGVkdWxlRGVmZXJyZWRSZWJ1aWxkKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuZGVmZXJyZWRSZWJ1aWxkVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVmZXJyZWRSZWJ1aWxkVGltZXIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRlZmVycmVkUmVidWlsZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVmZXJyZWRSZWJ1aWxkVGltZXIgPSBudWxsO1xuICAgICAgICB2b2lkIHRoaXMub25CZWZvcmVEZWZlcnJlZEVudHJpZXMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnW3dvcmtmbG93XSBEZWZlcnJlZCByZWJ1aWxkIGFmdGVyIHNvdXJjZSB1cGRhdGUgZmFpbGVkLicsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgNzUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZFdvcmtmbG93c0NhY2hlKCk6IFByb21pc2U8e1xuICAgICAgd29ya2Zsb3dGaWxlczogc3RyaW5nW107XG4gICAgICBzdGVwRmlsZXM6IHN0cmluZ1tdO1xuICAgIH0gfCBudWxsPiB7XG4gICAgICBjb25zdCBjYWNoZUZpbGVQYXRoID0gdGhpcy5nZXRXb3JrZmxvd3NDYWNoZUZpbGVQYXRoKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhY2hlQ29udGVudHMgPSBhd2FpdCByZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZUNvbnRlbnRzKSBhcyB7XG4gICAgICAgICAgd29ya2Zsb3dGaWxlcz86IHVua25vd247XG4gICAgICAgICAgc3RlcEZpbGVzPzogdW5rbm93bjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQud29ya2Zsb3dGaWxlcylcbiAgICAgICAgICA/IHBhcnNlZC53b3JrZmxvd0ZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuICAgICAgICBjb25zdCBzdGVwRmlsZXMgPSBBcnJheS5pc0FycmF5KHBhcnNlZC5zdGVwRmlsZXMpXG4gICAgICAgICAgPyBwYXJzZWQuc3RlcEZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICAgIHJldHVybiB7IHdvcmtmbG93RmlsZXMsIHN0ZXBGaWxlcyB9O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFdvcmtmbG93c0NhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IHRoaXMucmVhZFdvcmtmbG93c0NhY2hlKCk7XG4gICAgICBpZiAoIWNhY2hlZERhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB3b3JrZmxvd0ZpbGVzLCBzdGVwRmlsZXMsIHNlcmRlRmlsZXMgfSA9XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlRGlzY292ZXJlZEVudHJpZXMoe1xuICAgICAgICAgIHdvcmtmbG93Q2FuZGlkYXRlczogY2FjaGVkRGF0YS53b3JrZmxvd0ZpbGVzLFxuICAgICAgICAgIHN0ZXBDYW5kaWRhdGVzOiBjYWNoZWREYXRhLnN0ZXBGaWxlcyxcbiAgICAgICAgICBzZXJkZUNhbmRpZGF0ZXM6IHRoaXMuZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgICAgdmFsaWRhdGVQYXR0ZXJuczogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuY2xlYXIoKTtcbiAgICAgIHRoaXMuZGlzY292ZXJlZFN0ZXBGaWxlcy5jbGVhcigpO1xuICAgICAgdGhpcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcy5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiB3b3JrZmxvd0ZpbGVzKSB7XG4gICAgICAgIHRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuYWRkKGZpbGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygc3RlcEZpbGVzKSB7XG4gICAgICAgIHRoaXMuZGlzY292ZXJlZFN0ZXBGaWxlcy5hZGQoZmlsZVBhdGgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBzZXJkZUZpbGVzKSB7XG4gICAgICAgIHRoaXMuZGlzY292ZXJlZFNlcmRlRmlsZXMuYWRkKGZpbGVQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlV29ya2Zsb3dzQ2FjaGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBjYWNoZUZpbGVQYXRoID0gdGhpcy5nZXRXb3JrZmxvd3NDYWNoZUZpbGVQYXRoKCk7XG4gICAgICBjb25zdCBjYWNoZURpciA9IGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgdGhpcy5nZXREaXN0RGlyKCksICdjYWNoZScpO1xuICAgICAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBjb25zdCBjYWNoZURhdGEgPSB7XG4gICAgICAgIHdvcmtmbG93RmlsZXM6IEFycmF5LmZyb20odGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcykuc29ydCgpLFxuICAgICAgICBzdGVwRmlsZXM6IEFycmF5LmZyb20odGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzKS5zb3J0KCksXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGVEYXRhLCBudWxsLCAyKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZVN0dWJGaWxlcyhvdXRwdXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgLy8gVHVyYm9wYWNrIGN1cnJlbnRseSBoYXMgYSB3b3JrZXItY29uY3VycmVuY3kgbGltaXRhdGlvbiBmb3IgcGVuZGluZ1xuICAgICAgLy8gdmlydHVhbCBlbnRyaWVzLiBXYXJuIGlmIHBhcmFsbGVsaXNtIGlzIHRvbyBsb3cgdG8gcmVsaWFibHkgZGlzY292ZXIuXG4gICAgICBjb25zdCBwYXJhbGxlbGlzbUNvdW50ID0gb3MuYXZhaWxhYmxlUGFyYWxsZWxpc20oKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5UVVJCT1BBQ0sgJiYgcGFyYWxsZWxpc21Db3VudCA8IDQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBBdmFpbGFibGUgcGFyYWxsZWxpc20gb2YgJHtwYXJhbGxlbGlzbUNvdW50fSBpcyBsZXNzIHRoYW4gbmVlZGVkIDQuIFRoaXMgY2FuIGNhdXNlIHdvcmtmbG93cy9zdGVwcyB0byBmYWlsIHRvIGRpc2NvdmVyIHByb3Blcmx5IGluIHR1cmJvcGFja2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVTdHViQ29udGVudCA9IFtcbiAgICAgICAgYC8vICR7Uk9VVEVfU1RVQl9GSUxFX01BUktFUn1gLFxuICAgICAgICAnZXhwb3J0IGNvbnN0IF9fd29ya2Zsb3dSb3V0ZVN0dWIgPSB0cnVlOycsXG4gICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG5cbiAgICAgIGF3YWl0IG1rZGlyKGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgbWtkaXIoam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ3dlYmhvb2svW3Rva2VuXScpLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlRmlsZUlmQ2hhbmdlZChcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgJyonXG4gICAgICApO1xuXG4gICAgICAvLyBWMjogT25seSBmbG93ICsgd2ViaG9vayBzdHVicyBuZWVkZWQgKG5vIHNlcGFyYXRlIHN0ZXAgcm91dGUpLlxuICAgICAgLy8gU3R1YnMgYXJlIHJlcGxhY2VkIGJ5IGdlbmVyYXRlZCBvdXRwdXQgb25jZSBkaXNjb3ZlcnkgZmluaXNoZXMuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlRmlsZUlmQ2hhbmdlZChcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cvcm91dGUuanMnKSxcbiAgICAgICAgcm91dGVTdHViQ29udGVudFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnd2ViaG9vay9bdG9rZW5dL3JvdXRlLmpzJyksXG4gICAgICAgIHJvdXRlU3R1YkNvbnRlbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldElucHV0RmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgLy8gUmVhZCBOZXh0LmpzJ3MgYXBwLXBhdGhzLW1hbmlmZXN0Lmpzb24gZnJvbSBhIHByZXZpb3VzIGJ1aWxkIHRvXG4gICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggZmlsZXMgYXJlIGFjdHVhbCByb3V0ZSBlbnRyeXBvaW50cy4gVGhpcyBhdm9pZHNcbiAgICAgIC8vIHByZWRpY3RpbmcgTmV4dC5qcyBjb252ZW50aW9ucyB3aXRoIHJlZ2V4ZXMgYW5kIGluc3RlYWQgcmVhZHNcbiAgICAgIC8vIGZyb20gTmV4dC5qcydzIG93biBvdXRwdXQuXG4gICAgICBjb25zdCBuZXh0RGlyID0gam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnLm5leHQnKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4obmV4dERpciwgJ2FwcC1wYXRocy1tYW5pZmVzdC5qc29uJyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdENvbnRlbnQgPSByZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKG1hbmlmZXN0Q29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgLy8gVGhlIG1hbmlmZXN0IG1hcHMgcm91dGUgcGF0aHMgdG8gdGhlaXIgc291cmNlIGZpbGVzLlxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBzb3VyY2UgZmlsZSBwYXRocyBhbmQgcmVzb2x2ZSB0aGVtLlxuICAgICAgICBjb25zdCBtYW5pZmVzdEZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBPYmplY3QudmFsdWVzKG1hbmlmZXN0KSkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShuZXh0RGlyLCAnc2VydmVyJywgc291cmNlUGF0aCk7XG4gICAgICAgICAgLy8gVGhlIG1hbmlmZXN0IHBvaW50cyB0byBidWlsdCBvdXRwdXQ7IGZpbmQgdGhlIHNvdXJjZSBmaWxlXG4gICAgICAgICAgLy8gYnkgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgYmFzZSBidWlsZGVyJ3MgZnVsbCBmaWxlIGxpc3QuXG4gICAgICAgICAgbWFuaWZlc3RGaWxlcy5hZGQocmVzb2x2ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHRoZSBtYW5pZmVzdCByb3V0ZSBwYXRocyB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzLlxuICAgICAgICAvLyBBIGZpbGUgaXMgaW5jbHVkZWQgaWYgaXQgbWF0Y2hlcyBhIGtub3duIHJvdXRlIHNlZ21lbnQgZnJvbVxuICAgICAgICAvLyB0aGUgbWFuaWZlc3QgKGUuZy4sIGFwcC9hcGkvcm91dGUgY29udGFpbnMgJ2FwcC9hcGkvcm91dGUnKS5cbiAgICAgICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHN1cGVyLmdldElucHV0RmlsZXMoKTtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IE9iamVjdC5rZXlzKG1hbmlmZXN0KS5tYXAoKHJvdXRlKSA9PlxuICAgICAgICAgIHJvdXRlLnJlcGxhY2UoL15cXC8vLCAnJykucmVwbGFjZSgvXFwvcm91dGUkLywgJycpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBpbnB1dEZpbGVzLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgICByb3V0ZVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGl0ZW0uaW5jbHVkZXMoc2VnbWVudCkpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm8gbWFuaWZlc3QgZnJvbSBhIHByZXZpb3VzIGJ1aWxkIOKAlCBmYWxsIGJhY2sgdG8gdGhlIGJhc2VcbiAgICAgICAgLy8gYnVpbGRlcidzIGZ1bGwgZmlsZSBzY2FuLiBUaGlzIGlzIHNhZmUgYnV0IHNsb3dlcjsgc3Vic2VxdWVudFxuICAgICAgICAvLyBidWlsZHMgd2lsbCB1c2UgdGhlIG1hbmlmZXN0LlxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVGdW5jdGlvbnNDb25maWcob3V0cHV0RGlyOiBzdHJpbmcpIHtcbiAgICAgIC8vIHdlIGRvbid0IHJ1biB0aGlzIGluIGRldmVsb3BtZW50IG1vZGUgYXMgaXQncyBub3QgbmVlZGVkXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVjI6IFNpbmdsZSBjb21iaW5lZCB0cmlnZ2VyIGhhbmRsZXMgYm90aCB3b3JrZmxvdyBhbmQgc3RlcCBleGVjdXRpb25cbiAgICAgIGNvbnN0IGdlbmVyYXRlZENvbmZpZyA9IHtcbiAgICAgICAgdmVyc2lvbjogJzAnLFxuICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtXT1JLRkxPV19RVUVVRV9UUklHR0VSXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2NvbmZpZy5qc29uJyksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGdlbmVyYXRlZENvbmZpZywgbnVsbCwgMilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUZpbGVJZkNoYW5nZWQoXG4gICAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgICAgY29udGVudHM6IHN0cmluZyB8IEJ1ZmZlclxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgbmV4dEJ1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50cylcbiAgICAgICAgPyBjb250ZW50c1xuICAgICAgICA6IEJ1ZmZlci5mcm9tKGNvbnRlbnRzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIuZXF1YWxzKG5leHRCdWZmZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmlsZSBkb2VzIG5vdCBleGlzdCB5ZXQgb3IgY2Fubm90IGJlIHJlYWQ7IHdyaXRlIGEgZnJlc2ggY29weS5cbiAgICAgIH1cblxuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBuZXh0QnVmZmVyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUZpbGVJZkNoYW5nZWQoXG4gICAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZ1xuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3Qgc291cmNlQ29udGVudHMgPSBhd2FpdCByZWFkRmlsZShzb3VyY2VQYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLndyaXRlRmlsZUlmQ2hhbmdlZChkZXN0aW5hdGlvblBhdGgsIHNvdXJjZUNvbnRlbnRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNvcnRKc29uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLnNvcnRKc29uVmFsdWUoaXRlbSkpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgIC5tYXAoKFtrZXksIGVudHJ5VmFsdWVdKSA9PiBba2V5LCB0aGlzLnNvcnRKc29uVmFsdWUoZW50cnlWYWx1ZSldKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhzb3J0ZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJld3JpdGVKc29uRmlsZVdpdGhTdGFibGVLZXlPcmRlcihcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyB1bmtub3duO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5zb3J0SnNvblZhbHVlKHBhcnNlZCk7XG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWQsIG51bGwsIDIpfVxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBNYW5pZmVzdCBtYXkgbm90IGV4aXN0IChlLmcuIG1hbmlmZXN0IGdlbmVyYXRpb24gZmFpbGVkKTsgaWdub3JlLlxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdFJlbGF0aXZlSW1wb3J0U3BlY2lmaWVycyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RJbXBvcnRTcGVjaWZpZXJzKHNvdXJjZSkuZmlsdGVyKChzcGVjaWZpZXIpID0+XG4gICAgICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0U3BlY2lmaWVycyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlU3BlY2lmaWVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3QgaW1wb3J0UGF0dGVybnMgPSBbXG4gICAgICAgIC9mcm9tXFxzK1snXCJdKFteJ1wiXSspWydcIl0vZyxcbiAgICAgICAgL2ltcG9ydFxccytbJ1wiXShbXidcIl0rKVsnXCJdL2csXG4gICAgICAgIC9pbXBvcnRcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccypcXCkvZyxcbiAgICAgICAgL3JlcXVpcmVcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccypcXCkvZyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgaW1wb3J0UGF0dGVybiBvZiBpbXBvcnRQYXR0ZXJucykge1xuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNvdXJjZS5tYXRjaEFsbChpbXBvcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIGNvbnN0IHNwZWNpZmllciA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgICAgICAgIHJlbGF0aXZlU3BlY2lmaWVycy5hZGQoc3BlY2lmaWVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEFycmF5LmZyb20ocmVsYXRpdmVTcGVjaWZpZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldFJlbGF0aXZlRmlsZW5hbWVGb3JTd2MoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCB3b3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0RpcjtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gd29ya2luZ0RpclxuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCAnLycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVwYXRoID0gZmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgICAvLyBXaW5kb3dzIGZpeDogVXNlIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiB0byB3b3JrIGFyb3VuZCBkcml2ZSBsZXR0ZXIgY2FzaW5nIGlzc3Vlcy5cbiAgICAgIGNvbnN0IGxvd2VyV2QgPSBub3JtYWxpemVkV29ya2luZ0Rpci50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgbG93ZXJQYXRoID0gbm9ybWFsaXplZEZpbGVwYXRoLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGxldCByZWxhdGl2ZUZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICBpZiAobG93ZXJQYXRoLnN0YXJ0c1dpdGgoYCR7bG93ZXJXZH0vYCkpIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IG5vcm1hbGl6ZWRGaWxlcGF0aC5zdWJzdHJpbmcoXG4gICAgICAgICAgbm9ybWFsaXplZFdvcmtpbmdEaXIubGVuZ3RoICsgMVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChsb3dlclBhdGggPT09IGxvd2VyV2QpIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9ICcuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSByZWxhdGl2ZSh3b3JraW5nRGlyLCBmaWxlUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBpZiAocmVsYXRpdmVGaWxlbmFtZS5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICAgIGNvbnN0IGFsaWFzZWRSZWxhdGl2ZVBhdGggPSBhd2FpdCByZXNvbHZlV29ya2Zsb3dBbGlhc1JlbGF0aXZlUGF0aChcbiAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgd29ya2luZ0RpclxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGFsaWFzZWRSZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBhbGlhc2VkUmVsYXRpdmVQYXRoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWxhdGl2ZUZpbGVuYW1lID0gcmVsYXRpdmVGaWxlbmFtZVxuICAgICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSAnLi4nKVxuICAgICAgICAgICAgICAuam9pbignLycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVsYXRpdmVGaWxlbmFtZS5pbmNsdWRlcygnOicpIHx8IHJlbGF0aXZlRmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBiYXNlbmFtZShub3JtYWxpemVkRmlsZXBhdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVsYXRpdmVGaWxlbmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVJbXBvcnRUYXJnZXRXaXRoRXh0ZW5zaW9uRmFsbGJhY2tzKFxuICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIGlmIChleGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRQYXRoO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb25NYXRjaCA9IHRhcmdldFBhdGgubWF0Y2goLyhcXC5bXi4vXFxcXF0rKSQvKTtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbk1hdGNoPy5bMV0/LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoIWV4dGVuc2lvbikge1xuICAgICAgICByZXR1cm4gdGFyZ2V0UGF0aDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uRmFsbGJhY2tzID1cbiAgICAgICAgZXh0ZW5zaW9uID09PSAnLmpzJ1xuICAgICAgICAgID8gWycudHMnLCAnLnRzeCcsICcubXRzJywgJy5jdHMnXVxuICAgICAgICAgIDogZXh0ZW5zaW9uID09PSAnLm1qcydcbiAgICAgICAgICAgID8gWycubXRzJ11cbiAgICAgICAgICAgIDogZXh0ZW5zaW9uID09PSAnLmNqcydcbiAgICAgICAgICAgICAgPyBbJy5jdHMnXVxuICAgICAgICAgICAgICA6IGV4dGVuc2lvbiA9PT0gJy5qc3gnXG4gICAgICAgICAgICAgICAgPyBbJy50c3gnXVxuICAgICAgICAgICAgICAgIDogW107XG5cbiAgICAgIGlmIChleHRlbnNpb25GYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRQYXRoO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRXaXRob3V0RXh0ZW5zaW9uID0gdGFyZ2V0UGF0aC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCk7XG4gICAgICBmb3IgKGNvbnN0IGZhbGxiYWNrRXh0ZW5zaW9uIG9mIGV4dGVuc2lvbkZhbGxiYWNrcykge1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBgJHt0YXJnZXRXaXRob3V0RXh0ZW5zaW9ufSR7ZmFsbGJhY2tFeHRlbnNpb259YDtcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoZmFsbGJhY2tQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFja1BhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldFBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRTa2lwVHJhbnNpdGl2ZVN0ZXBGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3QgaXNTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aCA9XG4gICAgICAgIHRoaXMuc2hvdWxkUHJlZmVyU291cmNlQmFja2VkUGFja2FnZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy8ud2VsbC1rbm93bi93b3JrZmxvdy8nKSB8fFxuICAgICAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy5uZXh0LycpIHx8XG4gICAgICAgICghaXNTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aCAmJlxuICAgICAgICAgIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy8ucG5wbS8nKSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRyYW5zaXRpdmVTdGVwSW1wb3J0VGFyZ2V0UGF0aChcbiAgICAgIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICBzcGVjaWZpZXI6IHN0cmluZ1xuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgY29uc3Qgc3BlY2lmaWVyTWF0Y2ggPSBzcGVjaWZpZXIubWF0Y2goL14oW14/I10rKSguKikkLyk7XG4gICAgICBjb25zdCBpbXBvcnRQYXRoID0gc3BlY2lmaWVyTWF0Y2g/LlsxXSA/PyBzcGVjaWZpZXI7XG5cbiAgICAgIGlmICghaW1wb3J0UGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgaWYgKGltcG9ydFBhdGggIT09ICd3b3JrZmxvdycgJiYgIWltcG9ydFBhdGguc3RhcnRzV2l0aCgnQHdvcmtmbG93LycpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgICAgICAgICBjcmVhdGVSZXF1aXJlKHNvdXJjZUZpbGVQYXRoKS5yZXNvbHZlKGltcG9ydFBhdGgpO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggPVxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICBpZiAodGhpcy5zaG91bGRTa2lwVHJhbnNpdGl2ZVN0ZXBGaWxlKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmaWxlU3RhdHMgPSBhd2FpdCBzdGF0KG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpO1xuICAgICAgICAgIHJldHVybiBmaWxlU3RhdHMuaXNGaWxlKCkgPyBub3JtYWxpemVkUmVzb2x2ZWRQYXRoIDogbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYWJzb2x1dGVUYXJnZXRQYXRoID0gcmVzb2x2ZShkaXJuYW1lKHNvdXJjZUZpbGVQYXRoKSwgaW1wb3J0UGF0aCk7XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgICAgdGhpcy5yZXNvbHZlSW1wb3J0VGFyZ2V0V2l0aEV4dGVuc2lvbkZhbGxiYWNrcyhhYnNvbHV0ZVRhcmdldFBhdGgpLFxuICAgICAgXSk7XG5cbiAgICAgIGlmICghZXh0bmFtZShhYnNvbHV0ZVRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbkNhbmRpZGF0ZXMgPSBbXG4gICAgICAgICAgJy50cycsXG4gICAgICAgICAgJy50c3gnLFxuICAgICAgICAgICcubXRzJyxcbiAgICAgICAgICAnLmN0cycsXG4gICAgICAgICAgJy5qcycsXG4gICAgICAgICAgJy5qc3gnLFxuICAgICAgICAgICcubWpzJyxcbiAgICAgICAgICAnLmNqcycsXG4gICAgICAgIF07XG4gICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uQ2FuZGlkYXRlIG9mIGV4dGVuc2lvbkNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICBjYW5kaWRhdGVQYXRocy5hZGQoYCR7YWJzb2x1dGVUYXJnZXRQYXRofSR7ZXh0ZW5zaW9uQ2FuZGlkYXRlfWApO1xuICAgICAgICAgIGNhbmRpZGF0ZVBhdGhzLmFkZChcbiAgICAgICAgICAgIGpvaW4oYWJzb2x1dGVUYXJnZXRQYXRoLCBgaW5kZXgke2V4dGVuc2lvbkNhbmRpZGF0ZX1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGVQYXRoIG9mIGNhbmRpZGF0ZVBhdGhzKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgICAgICAgdGhpcy5yZXNvbHZlSW1wb3J0VGFyZ2V0V2l0aEV4dGVuc2lvbkZhbGxiYWNrcyhjYW5kaWRhdGVQYXRoKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgocmVzb2x2ZWRQYXRoKTtcblxuICAgICAgICBpZiAodGhpcy5zaG91bGRTa2lwVHJhbnNpdGl2ZVN0ZXBGaWxlKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgaWYgKGZpbGVTdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBUcnkgdGhlIG5leHQgY2FuZGlkYXRlIHBhdGguXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0VHJhbnNpdGl2ZVN0ZXBGaWxlcyh7XG4gICAgICBlbnRyeUZpbGVzLFxuICAgICAgc3RlcEZpbGVzLFxuICAgIH06IHtcbiAgICAgIGVudHJ5RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgc3RlcEZpbGVzOiBzdHJpbmdbXTtcbiAgICB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEVudHJ5RmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgIGVudHJ5RmlsZXMubWFwKChlbnRyeUZpbGUpID0+XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChlbnRyeUZpbGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGVwU2VlZEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICBzdGVwRmlsZXMubWFwKChzdGVwRmlsZSkgPT5cbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplRGlzY292ZXJlZEZpbGVQYXRoKHN0ZXBGaWxlKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zb3J0KCk7XG4gICAgICBjb25zdCBkaXNjb3ZlcmVkU3RlcEZpbGVzID0gbmV3IFNldDxzdHJpbmc+KG5vcm1hbGl6ZWRTdGVwU2VlZEZpbGVzKTtcbiAgICAgIGNvbnN0IHF1ZXVlZEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbLi4ubm9ybWFsaXplZEVudHJ5RmlsZXMsIC4uLm5vcm1hbGl6ZWRTdGVwU2VlZEZpbGVzXSlcbiAgICAgICk7XG4gICAgICBjb25zdCB2aXNpdGVkRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG4gICAgICBjb25zdCBwYXR0ZXJuQ2FjaGUgPSBuZXcgTWFwPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGRldGVjdFdvcmtmbG93UGF0dGVybnM+IHwgbnVsbFxuICAgICAgPigpO1xuXG4gICAgICBjb25zdCBnZXRTb3VyY2UgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgICBpZiAoc291cmNlQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBzb3VyY2VDYWNoZS5nZXQoZmlsZVBhdGgpID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgc291cmNlQ2FjaGUuc2V0KGZpbGVQYXRoLCBzb3VyY2UpO1xuICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHNvdXJjZUNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldFBhdHRlcm5zID0gYXN5bmMgKFxuICAgICAgICBmaWxlUGF0aDogc3RyaW5nXG4gICAgICApOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGRldGVjdFdvcmtmbG93UGF0dGVybnM+IHwgbnVsbD4gPT4ge1xuICAgICAgICBpZiAocGF0dGVybkNhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gcGF0dGVybkNhY2hlLmdldChmaWxlUGF0aCkgPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBnZXRTb3VyY2UoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgcGF0dGVybkNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG4gICAgICAgIHBhdHRlcm5DYWNoZS5zZXQoZmlsZVBhdGgsIHBhdHRlcm5zKTtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm5zO1xuICAgICAgfTtcblxuICAgICAgd2hpbGUgKHF1ZXVlZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBxdWV1ZWRGaWxlcy5wb3AoKTtcbiAgICAgICAgaWYgKCFjdXJyZW50RmlsZSB8fCB2aXNpdGVkRmlsZXMuaGFzKGN1cnJlbnRGaWxlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWRGaWxlcy5hZGQoY3VycmVudEZpbGUpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2UgPSBhd2FpdCBnZXRTb3VyY2UoY3VycmVudEZpbGUpO1xuICAgICAgICBpZiAoY3VycmVudFNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW1wb3J0U3BlY2lmaWVycyA9IHRoaXMuZXh0cmFjdEltcG9ydFNwZWNpZmllcnMoY3VycmVudFNvdXJjZSk7XG4gICAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGltcG9ydFNwZWNpZmllcnMpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZEltcG9ydFBhdGggPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlVHJhbnNpdGl2ZVN0ZXBJbXBvcnRUYXJnZXRQYXRoKFxuICAgICAgICAgICAgICBjdXJyZW50RmlsZSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmICghcmVzb2x2ZWRJbXBvcnRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXZpc2l0ZWRGaWxlcy5oYXMocmVzb2x2ZWRJbXBvcnRQYXRoKSkge1xuICAgICAgICAgICAgcXVldWVkRmlsZXMucHVzaChyZXNvbHZlZEltcG9ydFBhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGltcG9ydFBhdHRlcm5zID0gYXdhaXQgZ2V0UGF0dGVybnMocmVzb2x2ZWRJbXBvcnRQYXRoKTtcbiAgICAgICAgICBpZiAoaW1wb3J0UGF0dGVybnM/Lmhhc1VzZVN0ZXApIHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRTdGVwRmlsZXMuYWRkKHJlc29sdmVkSW1wb3J0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGRpc2NvdmVyZWRTdGVwRmlsZXMpLnNvcnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbGxlY3RUcmFuc2l0aXZlU2VyZGVGaWxlcyh7XG4gICAgICBlbnRyeUZpbGVzLFxuICAgICAgc2VyZGVGaWxlcyxcbiAgICB9OiB7XG4gICAgICBlbnRyeUZpbGVzOiBzdHJpbmdbXTtcbiAgICAgIHNlcmRlRmlsZXM6IHN0cmluZ1tdO1xuICAgIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRW50cnlGaWxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoXG4gICAgICAgICAgZW50cnlGaWxlcy5tYXAoKGVudHJ5RmlsZSkgPT5cbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplRGlzY292ZXJlZEZpbGVQYXRoKGVudHJ5RmlsZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc29ydCgpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFNlcmRlU2VlZEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICBzZXJkZUZpbGVzLm1hcCgoc2VyZGVGaWxlKSA9PlxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoc2VyZGVGaWxlKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zb3J0KCk7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IHJlLXZhbGlkYXRlIHNlcmRlIHNlZWRzIGFnYWluc3Qgc291cmNlIHBhdHRlcm5zLlxuICAgICAgLy8gVGhpcyBrZWVwcyBwcmV2aW91c2x5IGRpc2NvdmVyZWQvbWFudWFsIHNlZWQgZW50cmllcyBmcm9tIHN0aWNraW5nIHdoZW5cbiAgICAgIC8vIGZpbGVzIG5vIGxvbmdlciBtYXRjaCBzZXJkZSBwYXR0ZXJucy5cbiAgICAgIGNvbnN0IGRpc2NvdmVyZWRTZXJkZUZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBxdWV1ZWRGaWxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoWy4uLm5vcm1hbGl6ZWRFbnRyeUZpbGVzLCAuLi5ub3JtYWxpemVkU2VyZGVTZWVkRmlsZXNdKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZpc2l0ZWRGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcbiAgICAgIGNvbnN0IHBhdHRlcm5DYWNoZSA9IG5ldyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucz4gfCBudWxsXG4gICAgICA+KCk7XG5cbiAgICAgIGNvbnN0IGdldFNvdXJjZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgICAgIGlmIChzb3VyY2VDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlLmdldChmaWxlUGF0aCkgPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBzb3VyY2VDYWNoZS5zZXQoZmlsZVBhdGgsIHNvdXJjZSk7XG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgc291cmNlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0UGF0dGVybnMgPSBhc3luYyAoXG4gICAgICAgIGZpbGVQYXRoOiBzdHJpbmdcbiAgICAgICk6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucz4gfCBudWxsPiA9PiB7XG4gICAgICAgIGlmIChwYXR0ZXJuQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBwYXR0ZXJuQ2FjaGUuZ2V0KGZpbGVQYXRoKSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGdldFNvdXJjZShmaWxlUGF0aCk7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICBwYXR0ZXJuQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICAgICAgcGF0dGVybkNhY2hlLnNldChmaWxlUGF0aCwgcGF0dGVybnMpO1xuICAgICAgICByZXR1cm4gcGF0dGVybnM7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHNlcmRlU2VlZEZpbGUgb2Ygbm9ybWFsaXplZFNlcmRlU2VlZEZpbGVzKSB7XG4gICAgICAgIGNvbnN0IHNlZWRQYXR0ZXJucyA9IGF3YWl0IGdldFBhdHRlcm5zKHNlcmRlU2VlZEZpbGUpO1xuICAgICAgICBpZiAoc2VlZFBhdHRlcm5zPy5oYXNTZXJkZSkge1xuICAgICAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVzLmFkZChzZXJkZVNlZWRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAocXVldWVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IHF1ZXVlZEZpbGVzLnBvcCgpO1xuICAgICAgICBpZiAoIWN1cnJlbnRGaWxlIHx8IHZpc2l0ZWRGaWxlcy5oYXMoY3VycmVudEZpbGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRlZEZpbGVzLmFkZChjdXJyZW50RmlsZSk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZSA9IGF3YWl0IGdldFNvdXJjZShjdXJyZW50RmlsZSk7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGl2ZUltcG9ydFNwZWNpZmllcnMgPVxuICAgICAgICAgIHRoaXMuZXh0cmFjdFJlbGF0aXZlSW1wb3J0U3BlY2lmaWVycyhjdXJyZW50U291cmNlKTtcbiAgICAgICAgZm9yIChjb25zdCBzcGVjaWZpZXIgb2YgcmVsYXRpdmVJbXBvcnRTcGVjaWZpZXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRJbXBvcnRQYXRoID1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVRyYW5zaXRpdmVTdGVwSW1wb3J0VGFyZ2V0UGF0aChcbiAgICAgICAgICAgICAgY3VycmVudEZpbGUsXG4gICAgICAgICAgICAgIHNwZWNpZmllclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXJlc29sdmVkSW1wb3J0UGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF2aXNpdGVkRmlsZXMuaGFzKHJlc29sdmVkSW1wb3J0UGF0aCkpIHtcbiAgICAgICAgICAgIHF1ZXVlZEZpbGVzLnB1c2gocmVzb2x2ZWRJbXBvcnRQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbXBvcnRQYXR0ZXJucyA9IGF3YWl0IGdldFBhdHRlcm5zKHJlc29sdmVkSW1wb3J0UGF0aCk7XG4gICAgICAgICAgaWYgKGltcG9ydFBhdHRlcm5zPy5oYXNTZXJkZSkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXMuYWRkKHJlc29sdmVkSW1wb3J0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFTVC1sZXZlbCB2ZXJpZmljYXRpb246IHJ1biBTV0MgZGV0ZWN0IG1vZGUgb24gcmVnZXgtbWF0Y2hlZCBjYW5kaWRhdGVzXG4gICAgICAvLyB0byBjb25maXJtIHRoZXkgYWN0dWFsbHkgZGVmaW5lIHNlcmRlIGNsYXNzZXMuIFRoaXMgcHJldmVudHMgU0RLIGludGVybmFsXG4gICAgICAvLyBmaWxlcyAod2hpY2ggbWF0Y2ggc2VyZGUgcmVnZXggcGF0dGVybnMgYnV0IGRlZmluZSBubyBjbGFzc2VzKSBmcm9tIGJlaW5nXG4gICAgICAvLyBidW5kbGVkIGludG8gdGhlIHdvcmtmbG93IHNhbmRib3guXG4gICAgICBjb25zdCBwcm9qZWN0Um9vdCA9IHRoaXMuY29uZmlnLnByb2plY3RSb290IHx8IHRoaXMuY29uZmlnLndvcmtpbmdEaXI7XG4gICAgICBjb25zdCB2ZXJpZmllZFNlcmRlRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgQXJyYXkuZnJvbShkaXNjb3ZlcmVkU2VyZGVGaWxlcykubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGdldFNvdXJjZShmaWxlUGF0aCk7XG4gICAgICAgICAgaWYgKCFzb3VyY2UpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVGaWxlbmFtZSA9XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0UmVsYXRpdmVGaWxlbmFtZUZvclN3YyhmaWxlUGF0aCk7XG4gICAgICAgICAgICBjb25zdCB7IHdvcmtmbG93TWFuaWZlc3QgfSA9IGF3YWl0IGFwcGx5U3djVHJhbnNmb3JtKFxuICAgICAgICAgICAgICByZWxhdGl2ZUZpbGVuYW1lLFxuICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICdkZXRlY3QnLFxuICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgcHJvamVjdFJvb3RcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgZmlsZXMgdGhhdCBhY3R1YWxseSBkZWZpbmUgc2VyZGUgY2xhc3Nlc1xuICAgICAgICAgICAgY29uc3QgaGFzQ2xhc3NlcyA9XG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyAmJlxuICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHdvcmtmbG93TWFuaWZlc3QuY2xhc3Nlcykuc29tZShcbiAgICAgICAgICAgICAgICAoZW50cmllcykgPT4gT2JqZWN0LmtleXMoZW50cmllcykubGVuZ3RoID4gMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhhc0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgdmVyaWZpZWRTZXJkZUZpbGVzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWYgZGV0ZWN0IGZhaWxzLCBpbmNsdWRlIHRoZSBmaWxlIHRvIGJlIHNhZmVcbiAgICAgICAgICAgIHZlcmlmaWVkU2VyZGVGaWxlcy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdmVyaWZpZWRTZXJkZUZpbGVzLnNvcnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkV2ViaG9va1JvdXRlKHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgcm91dGVGaWxlTmFtZSA9ICdyb3V0ZS5qcycsXG4gICAgfToge1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHJvdXRlRmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd2ViaG9va1JvdXRlRmlsZSA9IGpvaW4oXG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICBgd2ViaG9vay9bdG9rZW5dLyR7cm91dGVGaWxlTmFtZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXZWJob29rQnVuZGxlKHtcbiAgICAgICAgb3V0ZmlsZTogd2ViaG9va1JvdXRlRmlsZSxcbiAgICAgICAgYnVuZGxlOiBmYWxzZSwgLy8gTmV4dC5qcyBkb2Vzbid0IG5lZWQgYnVuZGxpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmluZEFwcERpcmVjdG9yeSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgYXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnYXBwJyk7XG4gICAgICBjb25zdCBzcmNBcHBEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvYXBwJyk7XG4gICAgICBjb25zdCBwYWdlc0RpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3BhZ2VzJyk7XG4gICAgICBjb25zdCBzcmNQYWdlc0RpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3NyYy9wYWdlcycpO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjY2VzcyhwYXRoLCBjb25zdGFudHMuRl9PSyk7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgICAgICAgIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5OiAke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBhIGRpcmVjdG9yeScpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIENoZWNrIGlmIGFwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkoYXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gYXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzcmMvYXBwIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNBcHBEaXIpKSB7XG4gICAgICAgIHJldHVybiBzcmNBcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGFwcCBkaXJlY3RvcnkgZXhpc3RzLCBjaGVjayBmb3IgcGFnZXMgZGlyZWN0b3J5IGFuZCBjcmVhdGUgYXBwIG5leHQgdG8gaXRcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShwYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFwcCBkaXJlY3RvcnkgbmV4dCB0byBwYWdlcyBkaXJlY3RvcnlcbiAgICAgICAgYXdhaXQgbWtkaXIoYXBwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHNyY1BhZ2VzRGlyKSkge1xuICAgICAgICAvLyBDcmVhdGUgc3JjL2FwcCBkaXJlY3RvcnkgbmV4dCB0byBzcmMvcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKHNyY0FwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBzcmNBcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIE5leHQuanMgYXBwIG9yIHBhZ2VzIGRpcmVjdG9yeS4gRXhwZWN0ZWQgb25lIG9mOiBcImFwcFwiLCBcInNyYy9hcHBcIiwgXCJwYWdlc1wiLCBvciBcInNyYy9wYWdlc1wiIHRvIGV4aXN0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQ2FjaGVkTmV4dEJ1aWxkZXJEZWZlcnJlZCA9IE5leHREZWZlcnJlZEJ1aWxkZXI7XG4gIHJldHVybiBOZXh0RGVmZXJyZWRCdWlsZGVyO1xufVxuIl19
1504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1kZWZlcnJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWRlZmVycmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBeUNBLHdEQWlpRUM7QUExa0VELDZDQUF5QztBQUN6QyxxQ0FBOEQ7QUFDOUQsK0NBUzBCO0FBQzFCLDZDQUE0QztBQUM1QyxzREFBeUI7QUFDekIseUNBUW1CO0FBRW5CLHlEQU00QjtBQUU1QixNQUFNLHNCQUFzQixHQUFHLDBCQUEwQixDQUFDO0FBQzFELE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLDBCQUEwQixHQUFHLHFCQUFxQixDQUFDO0FBRXpELElBQUkseUJBQThCLENBQUM7QUFFbkMsaUZBQWlGO0FBQ2pGLGdGQUFnRjtBQUNoRixvRUFBb0U7QUFDN0QsS0FBSyxVQUFVLHNCQUFzQjtJQUMxQyxJQUFJLHlCQUF5QixFQUFFLENBQUM7UUFDOUIsT0FBTyx5QkFBeUIsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsK0VBQStFO0lBQy9FLDJFQUEyRTtJQUMzRSx5Q0FBeUM7SUFDekMsTUFBTSxFQUNKLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0Isc0JBQXNCLEVBQ3RCLG1DQUFtQyxFQUNuQyxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixnQ0FBZ0M7SUFDaEMsNElBQTRJO01BQzdJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FDYiw4QkFBOEIsQ0FDL0IsQ0FBd0MsQ0FBQztJQUUxQyxNQUFNLG1CQUFvQixTQUFRLGdCQUFnQjtRQUN4QyxRQUFRLENBQVk7UUFDWCx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzVDLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNsRCxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzNDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsZUFBZSxHQUEwQixJQUFJLENBQUM7UUFDOUMsb0JBQW9CLEdBQTBCLElBQUksQ0FBQztRQUNuRCwwQkFBMEIsR0FBa0IsSUFBSSxDQUFDO1FBRXpELEtBQUssQ0FBQyxLQUFLO1lBQ1QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUVoRCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXRELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFFRCxLQUFLLENBQUMsdUJBQXVCO1lBQzNCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUMxQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFFaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDckQsSUFBSSxDQUFDLCtCQUErQixDQUFDLGlCQUFpQixDQUFDLENBQ3hELENBQUM7WUFFRix5RUFBeUU7WUFDekUscUVBQXFFO1lBQ3JFLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hELGtEQUFrRDtZQUNwRCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sWUFBWSxDQUFDO1FBQ3JCLENBQUM7UUFFTyxvQkFBb0IsQ0FBQyxpQkFBMkI7WUFDdEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUNmLElBQUksR0FBRyxDQUFDO2dCQUNOLEdBQUcsSUFBSSxDQUFDLHVCQUF1QjtnQkFDL0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CO2dCQUMzQixHQUFHLElBQUksQ0FBQyxvQkFBb0I7Z0JBQzVCLEdBQUcsaUJBQWlCO2FBQ3JCLENBQUMsQ0FDSCxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVPLEtBQUssQ0FBQywrQkFBK0IsQ0FDM0MsaUJBQTJCO1lBRTNCLHlFQUF5RTtZQUN6RSwwRUFBMEU7WUFDMUUsc0RBQXNEO1lBQ3RELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztZQUV6QixLQUFLLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsY0FBYyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLGNBQWMsR0FDbEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sa0NBQWtDLEdBQ3RDLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7Z0JBQ2xELElBQ0UsY0FBYyxLQUFLLElBQUksQ0FBQywwQkFBMEI7b0JBQ2xELENBQUMsa0NBQWtDLEVBQ25DLENBQUM7b0JBQ0QsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDakUsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQzt3QkFDMUMsTUFBTSxtQkFBbUIsR0FDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQy9DLE1BQU0sa0JBQWtCLEdBQ3RCLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQy9ELElBQUksa0JBQWtCLEtBQUssY0FBYyxFQUFFLENBQUM7NEJBQzFDLCtEQUErRDs0QkFDL0QseURBQXlEOzRCQUN6RCxTQUFTO3dCQUNYLENBQUM7d0JBQ0QsT0FBTyxDQUFDLElBQUksQ0FDVixnRkFBZ0YsRUFDaEYsS0FBSyxDQUNOLENBQUM7d0JBQ0YsSUFBSSxDQUFDLDBCQUEwQixHQUFHLGNBQWMsQ0FBQzt3QkFDakQsT0FBTztvQkFDVCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxLQUFLLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxjQUFjLENBQUM7Z0JBRWpELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUN2Qix5RUFBeUU7b0JBQ3pFLHdFQUF3RTtvQkFDeEUseUVBQXlFO29CQUN6RSxxREFBcUQ7b0JBQ3JELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDekQsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDbEMsQ0FBQztnQkFFRCxNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxrQkFBa0IsR0FDdEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxrQkFBa0IsS0FBSyxjQUFjLEVBQUUsQ0FBQztvQkFDMUMsT0FBTztnQkFDVCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0VBQStFLENBQ2hGLENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLHdCQUF3QjtZQUNwQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBQ3BFLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hELENBQUM7UUFFTyxLQUFLLENBQUMsa0NBQWtDO1lBQzlDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDaEQsTUFBTSxtQkFBbUIsR0FBRztnQkFDMUIsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSx1Q0FBdUMsQ0FBQztnQkFDeEQsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxrREFBa0QsQ0FBQzthQUNwRSxDQUFDO1lBRUYsS0FBSyxNQUFNLGFBQWEsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDdEQsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQ2xDLGFBQXFCO1lBRXJCLElBQUksVUFBNEMsQ0FBQztZQUNqRCxJQUFJLENBQUM7Z0JBQ0gsVUFBVSxHQUFHLE1BQU0sSUFBQSxlQUFJLEVBQUMsYUFBYSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUN6QixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBQSxlQUFJLEVBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ3BFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQzlDLGdCQUFnQixFQUNoQixDQUFDLEVBQ0QsNEJBQTRCLEVBQzVCLENBQUMsQ0FDRixDQUFDO29CQUNGLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUNoRCxNQUFNLEVBQ04sQ0FBQyxFQUNELFNBQVMsQ0FDVixDQUFDO29CQUNGLE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO3dCQUN0RCxDQUFDLENBQUMsTUFBTTt3QkFDUixDQUFDLENBQUMsV0FBVyxDQUFDO2dCQUNsQixDQUFDO3dCQUFTLENBQUM7b0JBQ1QsTUFBTSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRU8saUNBQWlDO1lBQ3ZDLElBQUksZ0JBQXdCLENBQUM7WUFDN0IsSUFBSSxDQUFDO2dCQUNILGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUM3QyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztpQkFDaEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFBLG1CQUFPLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNsRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDekQsSUFBQSxnQkFBSSxFQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FDbkMsQ0FBQztZQUNGLE9BQU8sSUFBQSxvQkFBVSxFQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDcEUsQ0FBQztRQUVPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUN2QyxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsR0FNakI7WUFLQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQU83QixDQUFDO1lBRUosS0FBSyxNQUFNLFFBQVEsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixRQUFRLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO2dCQUN2QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRTt3QkFDbkMsb0JBQW9CLEVBQUUsSUFBSTt3QkFDMUIsZ0JBQWdCLEVBQUUsS0FBSzt3QkFDdkIsaUJBQWlCLEVBQUUsS0FBSztxQkFDekIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsRSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3RELElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDbkMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUU7d0JBQ25DLG9CQUFvQixFQUFFLEtBQUs7d0JBQzNCLGdCQUFnQixFQUFFLElBQUk7d0JBQ3RCLGlCQUFpQixFQUFFLEtBQUs7cUJBQ3pCLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssTUFBTSxRQUFRLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbEUsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUNiLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7b0JBQ3BDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFOzRCQUNuQyxvQkFBb0IsRUFBRSxLQUFLOzRCQUMzQixnQkFBZ0IsRUFBRSxLQUFLOzRCQUN2QixpQkFBaUIsRUFBRSxJQUFJO3lCQUN4QixDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzdELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUNqQyxDQUFDO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9DLElBQUksQ0FBQztvQkFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsZUFBSSxFQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7d0JBQ3hCLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQ3RCLE9BQU87NEJBQ0wsUUFBUTs0QkFDUixjQUFjLEVBQUUsVUFBVSxDQUFDLG9CQUFvQjs0QkFDL0MsVUFBVSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7NEJBQ3ZDLFFBQVEsRUFBRSxVQUFVLENBQUMsaUJBQWlCO3lCQUN2QyxDQUFDO29CQUNKLENBQUM7b0JBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNqRCxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDaEQsT0FBTzt3QkFDTCxRQUFRO3dCQUNSLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYzt3QkFDdkMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO3dCQUMvQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7cUJBQzVCLENBQUM7Z0JBQ0osQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUNyQyxLQUFLLE1BQU0sS0FBSyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3pCLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNyQixTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDbkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDbEQsQ0FBQztRQUVPLEtBQUssQ0FBQyw0QkFBNEI7WUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNqRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzRCxNQUFNLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FDNUMsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3BDLGtCQUFrQjtnQkFDbEIsY0FBYztnQkFDZCxlQUFlO2dCQUNmLGdCQUFnQixFQUFFLElBQUk7YUFDdkIsQ0FBQyxDQUFDO1lBRUwsc0VBQXNFO1lBQ3RFLGdFQUFnRTtZQUNoRSxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBRXpCLEtBQUssTUFBTSxRQUFRLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDakMsZ0JBQWdCO3dCQUNkLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksZ0JBQWdCLENBQUM7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0MsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssTUFBTSxRQUFRLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzdCLFlBQVk7d0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUM7Z0JBQzlELENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDdEIsQ0FBQztZQUNILENBQUM7WUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM5QixZQUFZO3dCQUNWLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksWUFBWSxDQUFDO2dCQUMvRCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3hDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxnQkFBZ0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQ2hDLFVBQW9CLEVBQ3BCLGlCQUEyQjtZQUUzQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hELE1BQU0sb0JBQW9CLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQUksRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUUsTUFBTSxJQUFBLGdCQUFLLEVBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLGdCQUFJLEVBQUMsUUFBUSxFQUFFLDZCQUE2QixDQUFDLENBQUM7WUFDdkUsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUM7WUFDMUMsTUFBTSx3QkFBd0IsR0FDNUIsTUFBTSxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLDRCQUE0QixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQzdDLElBQUksR0FBRyxDQUFDO2dCQUNOLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjtnQkFDM0IsR0FBRyx3QkFBd0IsQ0FBQyxlQUFlO2dCQUMzQyxHQUFHLGlCQUFpQjthQUNyQixDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sZ0NBQWdDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDakQsSUFBSSxHQUFHLENBQUM7Z0JBQ04sR0FBRyxJQUFJLENBQUMsdUJBQXVCO2dCQUMvQixHQUFHLHdCQUF3QixDQUFDLG1CQUFtQjthQUNoRCxDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUMsSUFBSSxHQUFHLENBQUM7Z0JBQ04sR0FBRyxJQUFJLENBQUMsb0JBQW9CO2dCQUM1QixHQUFHLHdCQUF3QixDQUFDLG9CQUFvQjthQUNqRCxDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQzVELGdDQUFnQyxDQUNqQyxDQUFDO1lBQ0YsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDL0QsNEJBQTRCLENBQzdCLENBQUM7WUFDRixNQUFNLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDO2dCQUNoRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLDBCQUEwQixFQUFFLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ3ZFLFNBQVMsRUFBRSwwQkFBMEI7YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FDaEUsNkJBQTZCLENBQzlCLENBQUM7WUFDRixNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDO2dCQUNsRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ2hFLFVBQVUsRUFBRSwyQkFBMkI7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNoQyxJQUFJLEdBQUcsQ0FBQztnQkFDTixHQUFHLGtCQUFrQjtnQkFDckIsR0FBRyxtQkFBbUI7Z0JBQ3RCLEdBQUcsdUJBQXVCO2dCQUMxQixHQUFHLG9CQUFvQjthQUN4QixDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0saUJBQWlCLEdBQUc7Z0JBQ3hCLGVBQWUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDN0MsbUJBQW1CLEVBQUUsSUFBSSxHQUFHLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3JELG9CQUFvQixFQUFFLElBQUksR0FBRyxDQUFDLG9CQUFvQixDQUFDO2FBQ3BELENBQUM7WUFFRixrQ0FBa0M7WUFDbEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsb0JBQW9CLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV2RCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDM0IsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxFQUN4QyxHQUFHLENBQ0osQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFbkQsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sSUFBQSxnQkFBSyxFQUFDLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRS9DLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDO2dCQUN4RCxVQUFVLEVBQUUsZUFBZTtnQkFDM0IsV0FBVyxFQUFFLElBQUEsZ0JBQUksRUFBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7Z0JBQ2xELFlBQVk7Z0JBQ1osaUJBQWlCO2FBQ2xCLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUMzQixvQkFBb0I7Z0JBQ3BCLGFBQWEsRUFBRSxpQkFBaUI7YUFDakMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQ3RDLG9CQUFvQixFQUNwQixpQkFBaUIsQ0FDbEIsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmLEtBQUssRUFBRSxFQUFFLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBQzdDLFNBQVMsRUFBRSxFQUFFLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3JELE9BQU8sRUFBRSxFQUFFLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7YUFDbEQsQ0FBQztZQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0saUJBQWlCLEdBQUcsSUFBQSxnQkFBSSxFQUFDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsSUFBQSxnQkFBSSxFQUM3QixvQkFBb0IsRUFDcEIsUUFBUSxpQkFBaUIsRUFBRSxDQUM1QixDQUFDO1lBQ0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUM3QyxrQkFBa0I7Z0JBQ2xCLFdBQVcsRUFBRSxnQkFBZ0I7Z0JBQzdCLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFDSCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUEsYUFBRSxFQUFDLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sSUFBQSxhQUFFLEVBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFM0MsdUVBQXVFO1lBQ3ZFLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUMxQixJQUFBLGdCQUFJLEVBQUMsb0JBQW9CLEVBQUUsUUFBUSxpQkFBaUIsRUFBRSxDQUFDLEVBQ3ZELElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxlQUFlLENBQUMsQ0FDNUMsQ0FBQztZQUNGLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUMxQixJQUFBLGdCQUFJLEVBQUMsb0JBQW9CLEVBQUUsbUJBQW1CLGlCQUFpQixFQUFFLENBQUMsRUFDbEUsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLDBCQUEwQixDQUFDLENBQ3ZELENBQUM7WUFFRixvRUFBb0U7WUFDcEUscURBQXFEO1lBQ3JELElBQUksSUFBSSxDQUFDLDBCQUEwQixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNwRCxNQUFNLGlCQUFpQixHQUFHLElBQUEsZ0JBQUksRUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ3RCLGdDQUFnQyxDQUNqQyxDQUFDO2dCQUNGLE1BQU0sSUFBQSxnQkFBSyxFQUFDLGlCQUFpQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3BELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQzNCLElBQUEsZ0JBQUksRUFBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsRUFDckMsR0FBRyxDQUNKLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FDMUIsZ0JBQWdCLEVBQ2hCLElBQUEsZ0JBQUksRUFBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FDekMsQ0FBQztZQUNKLENBQUM7WUFFRCwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQ3BDLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLGlCQUFpQixHQVVsQjtZQUNDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDO2dCQUN0RCxVQUFVO2dCQUNWLE9BQU8sRUFBRSxHQUFHLFdBQVcsY0FBYztnQkFDckMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsaUJBQWlCLEVBQUUsS0FBSztnQkFDeEIsWUFBWTtnQkFDWixpQkFBaUI7YUFDbEIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDO1lBQ3hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDYix3REFBd0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFBLGFBQUUsRUFBQyxHQUFHLFdBQVcsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCx5QkFBeUI7WUFDM0IsQ0FBQztZQUVELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDbEMsSUFBSSxHQUFHLENBQUM7Z0JBQ04sR0FBRyxpQkFBaUIsQ0FBQyxlQUFlO2dCQUNwQyxHQUFHLGlCQUFpQixDQUFDLG9CQUFvQjthQUMxQyxDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUNoRSxpQkFBaUIsRUFDakIsSUFBQSxtQkFBTyxFQUFDLFdBQVcsQ0FBQyxDQUNyQixDQUFDO1lBQ0YsTUFBTSxZQUFZLEdBQ2hCLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0QsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEUsTUFBTSw2QkFBNkIsR0FDakMsbUNBQW1DLEVBQUUsQ0FBQztZQUN4QyxJQUFJLFNBQWlCLENBQUM7WUFFdEIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QixNQUFNLGdCQUFnQixHQUFHLElBQUEsZ0JBQUksRUFDM0IsSUFBQSxtQkFBTyxFQUFDLFdBQVcsQ0FBQyxFQUNwQiwwQkFBMEIsQ0FDM0IsQ0FBQztnQkFDRixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDaEUsU0FBUyxHQUFHOzs7RUFHbEIsV0FBVzs7OzsyQkFJYyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7Ozs7NkRBU0UsNkJBQTZCOzs7Ozs7OztFQVF4RixDQUFDO1lBQ0csQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFNBQVMsR0FBRzs7O0VBR2xCLFdBQVc7Ozt5QkFHWSxhQUFhOztxREFFZSw2QkFBNkIsSUFBSSxDQUFDO1lBQ2pGLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFdEQsT0FBTztnQkFDTCxRQUFRLEVBQUU7b0JBQ1IsR0FBRyxZQUFZO29CQUNmLFNBQVMsRUFBRTt3QkFDVCxHQUFHLFlBQVksQ0FBQyxTQUFTO3dCQUN6QixHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUztxQkFDckM7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLEdBQUcsWUFBWSxDQUFDLE9BQU87d0JBQ3ZCLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPO3FCQUNuQztpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLG1DQUFtQyxDQUMvQyxLQUFlLEVBQ2YsUUFBZ0I7WUFFaEIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNqQixJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUNyRCxDQUNGLENBQUM7WUFFRixPQUFPLGdCQUFnQjtpQkFDcEIsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztpQkFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFFTyxLQUFLLENBQUMsK0JBQStCLENBQzNDLElBQVksRUFDWixRQUFnQjtZQUVoQixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsQ0FDN0MsSUFBSSxFQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1lBRUYsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsa0NBQWtDLENBQ2hFLElBQUEsbUJBQU8sRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FDNUMsQ0FBQztZQUNGLElBQUksWUFBWSxHQUFHLElBQUEsb0JBQVEsRUFBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFTyxLQUFLLENBQUMsa0NBQWtDLENBQzlDLFFBQWdCO1lBRWhCLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsOENBQThDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEUsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxlQUFlLENBQUM7WUFDekIsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTyw4Q0FBOEMsQ0FDcEQsUUFBZ0I7WUFFaEIsTUFBTSxvQkFBb0IsR0FBRyxJQUFBLG9CQUFRLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEUsSUFDRSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RDLENBQUMsSUFBQSxzQkFBVSxFQUFDLG9CQUFvQixDQUFDLEVBQ2pDLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFBLG9CQUFRLEVBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FDbkUsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQkFBTyxFQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDakQsTUFBTSxlQUFlLEdBQ25CLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQ2xELFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUNoRCxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUNuQixXQUFXLEVBQ1gsTUFBTSxFQUNOLEdBQUcsZ0JBQWdCLEdBQUcsZUFBZSxFQUFFLENBQ3hDLENBQUM7WUFFRixPQUFPLElBQUEsb0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEQsQ0FBQztRQUVPLG1DQUFtQyxDQUN6QyxRQUFnQjtZQUVoQixJQUFJLFVBQVUsR0FBRyxJQUFBLG1CQUFPLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDWixJQUFJLElBQUEsb0JBQVUsRUFBQyxJQUFBLGdCQUFJLEVBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDakQsT0FBTyxVQUFVLENBQUM7Z0JBQ3BCLENBQUM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQkFBTyxFQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDN0IsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRU8sS0FBSyxDQUFDLDBCQUEwQixDQUN0QyxLQUFlO1lBRWYsTUFBTSxRQUFRLEdBQXFCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUM5QixJQUFJLEdBQUcsQ0FBQztnQkFDTixHQUFHLEtBQUs7Z0JBQ1IsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7YUFDckQsQ0FBQyxDQUNILENBQUMsSUFBSSxFQUFFLENBQUM7WUFFVCxLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsbUJBQVEsRUFBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osU0FBUztnQkFDWCxDQUFDO2dCQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0saUJBQWlCLENBQ2xELGdCQUFnQixFQUNoQixNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztnQkFDRixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTyxLQUFLLENBQUMsa0NBQWtDO1lBQzlDLElBQUksQ0FBQztnQkFDSCxNQUFNLGVBQWUsR0FBRyxJQUFBLDJCQUFhLEVBQ25DLElBQUEsZ0JBQUksRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FDN0MsQ0FBQztnQkFDRixPQUFPO29CQUNMLElBQUksQ0FBQywyQkFBMkIsQ0FDOUIsZUFBZSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUN0RDtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBRU8scUJBQXFCLENBQzNCLE1BQXdCLEVBQ3hCLE1BQXdCO1lBRXhCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDOUIsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxTQUFTLENBQ2pCLENBQUM7WUFDRixNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVPLEtBQUssQ0FBQywrQkFBK0IsQ0FDM0MsU0FBaUI7WUFFakIsTUFBTSxvQkFBb0IsR0FBRyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLHlCQUF5QixDQUFDLENBQUM7WUFDeEUsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sWUFBWSxHQUFHLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4RCxNQUFNLGVBQWUsR0FBRyxJQUFBLGdCQUFJLEVBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUV0RSxNQUFNLGtCQUFrQixHQUFHO2dCQUN6QixJQUFBLGdCQUFJLEVBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQztnQkFDbkMsSUFBQSxnQkFBSSxFQUFDLFlBQVksRUFBRSwwQkFBMEIsQ0FBQztnQkFDOUMsSUFBQSxnQkFBSSxFQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQztnQkFDekMsSUFBQSxnQkFBSSxFQUFDLFlBQVksRUFBRSwwQkFBMEIsQ0FBQztnQkFDOUMsSUFBQSxnQkFBSSxFQUFDLFlBQVksRUFBRSxvQ0FBb0MsQ0FBQztnQkFDeEQsSUFBQSxnQkFBSSxFQUFDLFlBQVksRUFBRSwrQ0FBK0MsQ0FBQztnQkFDbkUsNkNBQTZDO2dCQUM3QyxZQUFZO2dCQUNaLElBQUEsZ0JBQUksRUFBQyxlQUFlLEVBQUUsZUFBZSxDQUFDO2dCQUN0QyxJQUFBLGdCQUFJLEVBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDO2FBQzVDLENBQUM7WUFFRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ2hCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDdEMsSUFBQSxhQUFFLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDaEQ7Z0JBQ0QsSUFBQSw4Q0FBMkIsRUFDekIsSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUNoRDtnQkFDRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsZUFBZSxDQUFDO2FBQ25ELENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTyxLQUFLLENBQUMsNEJBQTRCLENBQ3hDLFFBQWdCO1lBRWhCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxrQkFBTyxFQUFDLFFBQVEsRUFBRTtnQkFDM0MsYUFBYSxFQUFFLElBQUk7YUFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsWUFBWTtpQkFDVCxNQUFNLENBQ0wsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO2dCQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDOUI7aUJBQ0EsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDYixJQUFBLGFBQUUsRUFBQyxJQUFBLGdCQUFJLEVBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0IsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQ0gsQ0FDSixDQUFDO1FBQ0osQ0FBQztRQUVPLEtBQUssQ0FBQywyQkFBMkI7WUFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDdEQsT0FBTztZQUNULENBQUM7WUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sTUFBTSxHQUF1QjtnQkFDakMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDdkMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUNoRCxnQkFBZ0IsRUFBRSxDQUNoQixRQUFnQixFQUNoQixXQUFvQixFQUNwQixPQUFnQixFQUNoQixRQUFpQixFQUNqQixFQUFFO29CQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN0RSxJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztvQkFDbkMsTUFBTSxvQkFBb0IsR0FDeEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUV0RCxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7NEJBQzFELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQzs0QkFDckQsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO3dCQUNoQyxDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQzFELHNCQUFzQixHQUFHLFVBQVUsSUFBSSxzQkFBc0IsQ0FBQztvQkFDaEUsQ0FBQztvQkFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO3dCQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQzs0QkFDdEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOzRCQUNqRCxzQkFBc0IsR0FBRyxJQUFJLENBQUM7d0JBQ2hDLENBQUM7b0JBQ0gsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sVUFBVSxHQUNkLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDdEQsc0JBQXNCLEdBQUcsVUFBVSxJQUFJLHNCQUFzQixDQUFDO29CQUNoRSxDQUFDO29CQUVELElBQUksUUFBUSxFQUFFLENBQUM7d0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDOzRCQUN2RCxzQkFBc0IsR0FBRyxJQUFJLENBQUM7d0JBQ2hDLENBQUM7d0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUNwRCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxVQUFVLEdBQ2QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUN2RCxzQkFBc0IsR0FBRyxVQUFVLElBQUksc0JBQXNCLENBQUM7b0JBQ2hFLENBQUM7b0JBRUQsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztvQkFDckMsQ0FBQztvQkFFRCxJQUNFLFdBQVc7d0JBQ1gsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLHNCQUFzQjt3QkFDdEIsb0JBQW9CLEVBQ3BCLENBQUM7d0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7b0JBQ2pDLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxjQUFjLEVBQUUsR0FBRyxFQUFFO29CQUNuQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDakMsQ0FBQzthQUNGLENBQUM7WUFFRixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sSUFBQSxxQ0FBa0IsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRU8sS0FBSyxDQUFDLHdCQUF3QjtZQUNwQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDaEMsc0VBQXNFO1lBQ3RFLG1FQUFtRTtZQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUM7UUFFTyxVQUFVO1lBQ2hCLE9BQVEsSUFBSSxDQUFDLE1BQStCLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztRQUNsRSxDQUFDO1FBRU8seUJBQXlCO1lBQy9CLE9BQU8sSUFBQSxnQkFBSSxFQUNULElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ2pCLE9BQU8sRUFDUCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNKLENBQUM7UUFFTyxxQkFBcUI7WUFDM0IsT0FBTyxJQUFBLGdCQUFJLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDakIsdUNBQW9CLENBQ3JCLENBQUM7UUFDSixDQUFDO1FBRU8sbUJBQW1CLENBQUMsUUFBZ0I7WUFDMUMsSUFBSSxVQUFVLEdBQUcsSUFBQSxtQkFBTyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUVyQixPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxlQUFlLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxJQUFBLG9CQUFVLEVBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsT0FBTyxlQUFlLENBQUM7Z0JBQ3pCLENBQUM7Z0JBQ0QsV0FBVyxHQUFHLFVBQVUsQ0FBQztnQkFDekIsVUFBVSxHQUFHLElBQUEsbUJBQU8sRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU8sbUNBQW1DLENBQUMsUUFBZ0I7WUFDMUQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEQsbUVBQW1FO1lBQ25FLG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsb0RBQW9EO1lBQ3BELElBQ0UsY0FBYyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7Z0JBQ3JDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMxQyxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDL0MsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzVCLElBQUEsc0JBQVksRUFBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQ2pCLENBQUM7Z0JBQ3hCLE9BQU8sQ0FDTCxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVU7b0JBQy9CLENBQUMsT0FBTyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVE7d0JBQ25DLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQzdDLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFTywyQkFBMkIsQ0FBQyxRQUFnQjtZQUNsRCxPQUFPLElBQUEsc0JBQVUsRUFBQyxRQUFRLENBQUM7Z0JBQ3pCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFtQjtZQUNuRCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ3BDLElBQUksR0FBRyxDQUNMLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN6QixJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQzNDLENBQ0YsQ0FDRixDQUFDLElBQUksRUFBRSxDQUFDO1lBRVQsTUFBTSxhQUFhLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNyQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLGVBQUksRUFBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkMsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM5QyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBc0IsRUFBRSxDQUMzRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQ2xCLENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLDRCQUE0QixDQUN4QyxVQUFvQjtZQUVwQixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNoQyxJQUFJLEdBQUcsQ0FBQztnQkFDTixHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUM3QixJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQzNDO2dCQUNELEdBQUcsSUFBSSxDQUFDLHNCQUFzQjthQUMvQixDQUFDLENBQ0gsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVULE1BQU0sY0FBYyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDdEMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQztvQkFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsZUFBSSxFQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2QyxPQUFPLEdBQUcsUUFBUSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDMUUsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsT0FBTyxHQUFHLFFBQVEsVUFBVSxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLE1BQU0sYUFBYSxHQUFHLElBQUEsd0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxLQUFLLE1BQU0sYUFBYSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUMzQyxhQUFhLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNwQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFFRCxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVPLEtBQUssQ0FBQywrQkFBK0I7WUFLM0MsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxPQUFPO29CQUNMLGVBQWUsRUFBRSxFQUFFO29CQUNuQixtQkFBbUIsRUFBRSxFQUFFO29CQUN2QixvQkFBb0IsRUFBRSxFQUFFO2lCQUN6QixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUM1QyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQztnQkFDcEMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtnQkFDL0MsY0FBYyxFQUFFLElBQUksQ0FBQyxzQkFBc0I7Z0JBQzNDLGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCO2dCQUM1QyxnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZCLENBQUMsQ0FBQztZQUVMLE9BQU87Z0JBQ0wsZUFBZSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUM3QyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDckQsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUU7YUFDcEQsQ0FBQztRQUNKLENBQUM7UUFFTyxLQUFLLENBQUMsNkJBQTZCLENBQ3pDLG9CQUE0QixFQUM1QixhQUFxQjtZQUVyQixNQUFNLFdBQVcsR0FBRztnQkFDbEIsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLFFBQVEsYUFBYSxFQUFFLENBQUM7Z0JBQ25ELElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxRQUFRLGFBQWEsRUFBRSxDQUFDO2FBQ3BELENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBRXZDLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RSxLQUFLLE1BQU0sVUFBVSxJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUN2QyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUVPLEtBQUssQ0FBQyx3QkFBd0IsQ0FDcEMsY0FBc0I7WUFFdEIsSUFBSSxjQUFzQixDQUFDO1lBQzNCLElBQUksQ0FBQztnQkFDSCxjQUFjLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUUzQyxtRUFBbUU7WUFDbkUsMEVBQTBFO1lBQzFFLG1DQUFtQztZQUNuQyxnRkFBZ0Y7WUFDaEYsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSx3Q0FBd0M7WUFDeEMsTUFBTSxlQUFlLEdBQUcsNENBQTRDLENBQUM7WUFDckUsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDO1lBQ2hDLE1BQU0sZ0JBQWdCLEdBQW1DLEVBQUUsQ0FBQztZQUM1RCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsT0FBTyxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDO29CQUFFLE1BQU07Z0JBQzVCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQ3hDLFlBQVksRUFDWixTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FDbkMsQ0FBQztnQkFDRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2QixRQUFRLEdBQUcsU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7b0JBQzlDLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCw4REFBOEQ7Z0JBQzlELGlFQUFpRTtnQkFDakUsMkRBQTJEO2dCQUMzRCxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLElBQUksV0FBVyxHQUFHLFdBQVcsRUFBRSxDQUFDO29CQUNwRCxRQUFRLEdBQUcsV0FBVyxDQUFDO29CQUN2QixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7Z0JBQ3JELCtEQUErRDtnQkFDL0QsZ0VBQWdFO2dCQUNoRSw2REFBNkQ7Z0JBQzdELElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQztnQkFDMUIsT0FBTyxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNqRCx5REFBeUQ7b0JBQ3pELHFCQUFxQjtvQkFDckIsSUFDRSxDQUFDLENBQ0MsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUM7d0JBQzlCLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDO3dCQUM5QixDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQzt3QkFDOUIsSUFBSSxLQUFLLElBQUk7d0JBQ2IsSUFBSSxLQUFLLElBQUk7d0JBQ2IsSUFBSSxLQUFLLElBQUksQ0FDZCxFQUNELENBQUM7d0JBQ0QsTUFBTTtvQkFDUixDQUFDO29CQUNELFFBQVEsRUFBRSxDQUFDO2dCQUNiLENBQUM7Z0JBQ0QsSUFBSSxRQUFRLEdBQUcsVUFBVSxFQUFFLENBQUM7b0JBQzFCLGdCQUFnQixDQUFDLElBQUksQ0FBQzt3QkFDcEIsV0FBVyxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQztxQkFDeEQsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN0QixDQUFDO1lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLFNBQXNELENBQUM7Z0JBQzNELElBQUksQ0FBQztvQkFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUNOLENBQUM7Z0JBQ25ELENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLFVBQVUsR0FDZCxPQUFPLFNBQVMsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN0QixDQUFDLE1BQU0sRUFBb0IsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FDekQ7b0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFFUCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUM3QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM5RCxTQUFTO29CQUNYLENBQUM7b0JBRUQsSUFBSSxrQkFBMEIsQ0FBQztvQkFDL0IsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQ2pDLElBQUksQ0FBQzs0QkFDSCxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDcEUsQ0FBQzt3QkFBQyxNQUFNLENBQUM7NEJBQ1AsU0FBUzt3QkFDWCxDQUFDO29CQUNILENBQUM7eUJBQU0sSUFBSSxJQUFBLHNCQUFVLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDOUIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO29CQUM5QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sa0JBQWtCLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ2xFLENBQUM7b0JBRUQsTUFBTSxvQkFBb0IsR0FDeEIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQ3ZELE1BQU0sNEJBQTRCLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUMvRCxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7b0JBQ0YsTUFBTSx5QkFBeUIsR0FDN0IsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ2pFLElBQ0UsNEJBQTRCLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDO3dCQUMvRCxDQUFDLENBQUMseUJBQXlCOzRCQUN6Qiw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDMUQsQ0FBQyxDQUFDLHlCQUF5Qjs0QkFDekIsNEJBQTRCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNuRCw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO3dCQUNoRCw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFDMUQsQ0FBQzt3QkFDRCxTQUFTO29CQUNYLENBQUM7b0JBRUQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVPLDJCQUEyQjtZQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDNUIsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxDQUFDO1FBRU8sdUJBQXVCO1lBQzdCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQ1YseURBQXlELEVBQ3pELEtBQUssQ0FDTixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQztRQUVPLEtBQUssQ0FBQyxrQkFBa0I7WUFJOUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFFdkQsSUFBSSxDQUFDO2dCQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBQSxtQkFBUSxFQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBR3RDLENBQUM7Z0JBRUYsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO29CQUN2RCxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQ3pCLENBQUMsSUFBSSxFQUFrQixFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUNuRDtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDL0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUNyQixDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FDbkQ7b0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFFUCxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVPLEtBQUssQ0FBQyxrQkFBa0I7WUFDOUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQzVDLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDO2dCQUNwQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsYUFBYTtnQkFDNUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTO2dCQUNwQyxlQUFlLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtnQkFDMUMsZ0JBQWdCLEVBQUUsSUFBSTthQUN2QixDQUFDLENBQUM7WUFFTCxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO1FBRU8sS0FBSyxDQUFDLG1CQUFtQjtZQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN2RCxNQUFNLFFBQVEsR0FBRyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFFLE1BQU0sSUFBQSxnQkFBSyxFQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixhQUFhLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQzlELFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTthQUN2RCxDQUFDO1lBRUYsTUFBTSxJQUFBLG9CQUFTLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQWlCO1lBQzVDLHNFQUFzRTtZQUN0RSx3RUFBd0U7WUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbkQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsT0FBTyxDQUFDLElBQUksQ0FDViw0QkFBNEIsZ0JBQWdCLGtHQUFrRyxDQUMvSSxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLE1BQU0sc0JBQXNCLEVBQUU7Z0JBQzlCLDBDQUEwQzthQUMzQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNiLE1BQU0sb0JBQW9CLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBRXhFLE1BQU0sSUFBQSxnQkFBSyxFQUFDLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sSUFBQSxnQkFBSyxFQUFDLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO2dCQUN6RCxTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDM0IsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxFQUN4QyxHQUFHLENBQ0osQ0FBQztZQUVGLGlFQUFpRTtZQUNqRSxrRUFBa0U7WUFDbEUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQzNCLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxlQUFlLENBQUMsRUFDM0MsZ0JBQWdCLENBQ2pCLENBQUM7WUFDRixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDM0IsSUFBQSxnQkFBSSxFQUFDLG9CQUFvQixFQUFFLDBCQUEwQixDQUFDLEVBQ3RELGdCQUFnQixDQUNqQixDQUFDO1FBQ0osQ0FBQztRQUVTLEtBQUssQ0FBQyxhQUFhO1lBQzNCLGtFQUFrRTtZQUNsRSxrRUFBa0U7WUFDbEUsZ0VBQWdFO1lBQ2hFLDZCQUE2QjtZQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQkFBSSxFQUFDLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQztnQkFDSCxNQUFNLGVBQWUsR0FBRyxJQUFBLHNCQUFZLEVBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBMkIsQ0FBQztnQkFDdkUsdURBQXVEO2dCQUN2RCxrREFBa0Q7Z0JBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0JBQ3hDLEtBQUssTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFBLG1CQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDeEQsNERBQTREO29CQUM1RCx5REFBeUQ7b0JBQ3pELGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7Z0JBRUQsMERBQTBEO2dCQUMxRCw4REFBOEQ7Z0JBQzlELCtEQUErRDtnQkFDL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FDakQsQ0FBQztnQkFDRixPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNoQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQ3hELENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLDREQUE0RDtnQkFDNUQsZ0VBQWdFO2dCQUNoRSxnQ0FBZ0M7Z0JBQ2hDLE9BQU8sS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQWlCO1lBQ2xELDJEQUEyRDtZQUMzRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUMzQyxPQUFPO1lBQ1QsQ0FBQztZQUNELHVFQUF1RTtZQUN2RSxNQUFNLGVBQWUsR0FBRztnQkFDdEIsT0FBTyxFQUFFLEdBQUc7Z0JBQ1osU0FBUyxFQUFFO29CQUNULFdBQVcsRUFBRSxLQUFLO29CQUNsQixvQkFBb0IsRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUMvQzthQUNGLENBQUM7WUFFRixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDM0IsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxxQ0FBcUMsQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3pDLENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUM5QixRQUFnQixFQUNoQixRQUF5QjtZQUV6QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQ1YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFMUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBQSxtQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsaUVBQWlFO1lBQ25FLENBQUM7WUFFRCxNQUFNLElBQUEsZ0JBQUssRUFBQyxJQUFBLG1CQUFPLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUEsb0JBQVMsRUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUM3QixVQUFrQixFQUNsQixlQUF1QjtZQUV2QixNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUEsbUJBQVEsRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVPLGFBQWEsQ0FBQyxLQUFjO1lBQ2xDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0MsQ0FBQztxQkFDbkUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRU8sS0FBSyxDQUFDLGlDQUFpQyxDQUM3QyxRQUFnQjtZQUVoQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBWSxDQUFDO2dCQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDM0IsUUFBUSxFQUNSLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzNDLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLG9FQUFvRTtZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUVPLCtCQUErQixDQUFDLE1BQWM7WUFDcEQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDL0QsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FDMUIsQ0FBQztRQUNKLENBQUM7UUFFTyx1QkFBdUIsQ0FBQyxNQUFjO1lBQzVDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUM3QyxNQUFNLGNBQWMsR0FBRztnQkFDckIsMEJBQTBCO2dCQUMxQiw0QkFBNEI7Z0JBQzVCLG1DQUFtQztnQkFDbkMsb0NBQW9DO2FBQ3JDLENBQUM7WUFFRixLQUFLLE1BQU0sYUFBYSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUMzQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQixJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUNkLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDcEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUMsUUFBZ0I7WUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDMUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVO2lCQUNwQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztpQkFDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRXhELDBGQUEwRjtZQUMxRixNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVuRCxJQUFJLGdCQUF3QixDQUFDO1lBQzdCLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUM3QyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUNoQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDakMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixnQkFBZ0IsR0FBRyxJQUFBLG9CQUFRLEVBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxnQ0FBZ0MsQ0FDaEUsUUFBUSxFQUNSLFVBQVUsQ0FDWCxDQUFDO29CQUNGLElBQUksbUJBQW1CLEVBQUUsQ0FBQzt3QkFDeEIsZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7b0JBQ3pDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixnQkFBZ0IsR0FBRyxnQkFBZ0I7NkJBQ2hDLEtBQUssQ0FBQyxHQUFHLENBQUM7NkJBQ1YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDOzZCQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2YsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxnQkFBZ0IsR0FBRyxJQUFBLG9CQUFRLEVBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsT0FBTyxnQkFBZ0IsQ0FBQztRQUMxQixDQUFDO1FBRU8seUNBQXlDLENBQy9DLFVBQWtCO1lBRWxCLElBQUksSUFBQSxvQkFBVSxFQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUM7WUFFRCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1lBRUQsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxLQUFLLEtBQUs7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDakMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNO29CQUNwQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ1YsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNO3dCQUNwQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7d0JBQ1YsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNOzRCQUNwQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7NEJBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVmLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1lBRUQsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RSxLQUFLLE1BQU0saUJBQWlCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxZQUFZLEdBQUcsR0FBRyxzQkFBc0IsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyRSxJQUFJLElBQUEsb0JBQVUsRUFBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUM3QixPQUFPLFlBQVksQ0FBQztnQkFDdEIsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBRU8sNEJBQTRCLENBQUMsUUFBZ0I7WUFDbkQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEQsTUFBTSx5QkFBeUIsR0FDN0IsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sQ0FDTCxjQUFjLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDO2dCQUNqRCxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLHlCQUF5QjtvQkFDekIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO3dCQUN4QyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQztRQUNKLENBQUM7UUFFTyxLQUFLLENBQUMscUNBQXFDLENBQ2pELGNBQXNCLEVBQ3RCLFNBQWlCO1lBRWpCLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxNQUFNLFVBQVUsR0FBRyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7WUFFcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxVQUFVLEtBQUssVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUN0RSxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUVELElBQUksQ0FBQztvQkFDSCxNQUFNLFlBQVksR0FDaEIsSUFBQSwyQkFBYSxFQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDcEQsTUFBTSxzQkFBc0IsR0FDMUIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNqRCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7d0JBQzlELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLGVBQUksRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUNyRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDNUQsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUEsbUJBQU8sRUFBQyxJQUFBLG1CQUFPLEVBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFeEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQVM7Z0JBQ3JDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxrQkFBa0IsQ0FBQzthQUNuRSxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsSUFBQSxtQkFBTyxFQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxtQkFBbUIsR0FBRztvQkFDMUIsS0FBSztvQkFDTCxNQUFNO29CQUNOLE1BQU07b0JBQ04sTUFBTTtvQkFDTixLQUFLO29CQUNMLE1BQU07b0JBQ04sTUFBTTtvQkFDTixNQUFNO2lCQUNQLENBQUM7Z0JBQ0YsS0FBSyxNQUFNLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLENBQUM7b0JBQ3JELGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7b0JBQ2pFLGNBQWMsQ0FBQyxHQUFHLENBQ2hCLElBQUEsZ0JBQUksRUFBQyxrQkFBa0IsRUFBRSxRQUFRLGtCQUFrQixFQUFFLENBQUMsQ0FDdkQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssTUFBTSxhQUFhLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMseUNBQXlDLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sc0JBQXNCLEdBQzFCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFakQsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO29CQUM5RCxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxlQUFJLEVBQUMsc0JBQXNCLENBQUMsQ0FBQztvQkFDckQsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzt3QkFDdkIsT0FBTyxzQkFBc0IsQ0FBQztvQkFDaEMsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCwrQkFBK0I7Z0JBQ2pDLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU8sS0FBSyxDQUFDLDBCQUEwQixDQUFDLEVBQ3ZDLFVBQVUsRUFDVixTQUFTLEdBSVY7WUFDQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ3JDLElBQUksR0FBRyxDQUNMLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUMzQixJQUFJLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQzVDLENBQ0YsQ0FDRixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTSx1QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUN4QyxJQUFJLEdBQUcsQ0FDTCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDekIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUMzQyxDQUNGLENBQ0YsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQVMsdUJBQXVCLENBQUMsQ0FBQztZQUNyRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUM1QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQy9ELENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1lBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUd6QixDQUFDO1lBRUosTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLFFBQWdCLEVBQTBCLEVBQUU7Z0JBQ25FLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM5QixPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUMzQyxDQUFDO2dCQUNELElBQUksQ0FBQztvQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsbUJBQVEsRUFBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2pELFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNsQyxPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2hDLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQ3ZCLFFBQWdCLEVBQzJDLEVBQUU7Z0JBQzdELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMvQixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUM1QyxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDcEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2pDLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hELFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDLENBQUM7WUFFRixPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUU5QixNQUFNLGFBQWEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQzNCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDckUsS0FBSyxNQUFNLFNBQVMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUN6QyxNQUFNLGtCQUFrQixHQUN0QixNQUFNLElBQUksQ0FBQyxxQ0FBcUMsQ0FDOUMsV0FBVyxFQUNYLFNBQVMsQ0FDVixDQUFDO29CQUNKLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3dCQUN4QixTQUFTO29CQUNYLENBQUM7b0JBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO3dCQUMxQyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQ3ZDLENBQUM7b0JBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUM7d0JBQy9CLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUM5QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsQ0FBQztRQUVPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxFQUN4QyxVQUFVLEVBQ1YsVUFBVSxHQUlYO1lBQ0MsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNyQyxJQUFJLEdBQUcsQ0FDTCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUM1QyxDQUNGLENBQ0YsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDekMsSUFBSSxHQUFHLENBQ0wsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQzNCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FDNUMsQ0FDRixDQUNGLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVCxpRUFBaUU7WUFDakUsMEVBQTBFO1lBQzFFLHdDQUF3QztZQUN4QyxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFDL0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDNUIsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUNoRSxDQUFDO1lBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztZQUNyRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFHekIsQ0FBQztZQUVKLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxRQUFnQixFQUEwQixFQUFFO2dCQUNuRSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztnQkFDM0MsQ0FBQztnQkFDRCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNqRCxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDbEMsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNoQyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUN2QixRQUFnQixFQUMyQyxFQUFFO2dCQUM3RCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztnQkFDNUMsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNqQyxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUNELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDckMsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQyxDQUFDO1lBRUYsS0FBSyxNQUFNLGFBQWEsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUM7b0JBQzNCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xELFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUU5QixNQUFNLGFBQWEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQzNCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLHdCQUF3QixHQUM1QixJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3RELEtBQUssTUFBTSxTQUFTLElBQUksd0JBQXdCLEVBQUUsQ0FBQztvQkFDakQsTUFBTSxrQkFBa0IsR0FDdEIsTUFBTSxJQUFJLENBQUMscUNBQXFDLENBQzlDLFdBQVcsRUFDWCxTQUFTLENBQ1YsQ0FBQztvQkFDSixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDeEIsU0FBUztvQkFDWCxDQUFDO29CQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQzt3QkFDMUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO29CQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQzdELElBQUksY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUM3QixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDL0MsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsNEVBQTRFO1lBQzVFLHFDQUFxQztZQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUN0RSxNQUFNLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPO2dCQUNwQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxnQkFBZ0IsR0FDcEIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2pELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0saUJBQWlCLENBQ2xELGdCQUFnQixFQUNoQixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixXQUFXLEVBQ1gsSUFBSSxDQUFDLG1CQUFtQixDQUN6QixDQUFDO29CQUNGLHdEQUF3RDtvQkFDeEQsTUFBTSxVQUFVLEdBQ2QsZ0JBQWdCLENBQUMsT0FBTzt3QkFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQzdDLENBQUM7b0JBQ0osSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsK0NBQStDO29CQUMvQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBRUYsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQzlCLG9CQUFvQixFQUNwQixhQUFhLEdBQUcsVUFBVSxHQUkzQjtZQUNDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxnQkFBSSxFQUMzQixvQkFBb0IsRUFDcEIsbUJBQW1CLGFBQWEsRUFBRSxDQUNuQyxDQUFDO1lBQ0YsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3pCLE1BQU0sRUFBRSxLQUFLLEVBQUUsZ0NBQWdDO2FBQ2hELENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTyxLQUFLLENBQUMsZ0JBQWdCO1lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUEsbUJBQU8sRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxNQUFNLFNBQVMsR0FBRyxJQUFBLG1CQUFPLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBQSxtQkFBTyxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsbUJBQU8sRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVqRSxzREFBc0Q7WUFDdEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBb0IsRUFBRTtnQkFDM0QsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBQSxpQkFBTSxFQUFDLElBQUksRUFBRSxtQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsZUFBSSxFQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7d0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pFLENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7d0JBQ2hFLE1BQU0sQ0FBQyxDQUFDO29CQUNWLENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUMsQ0FBQztZQUVGLGdDQUFnQztZQUNoQyxJQUFJLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxvQ0FBb0M7WUFDcEMsSUFBSSxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsa0ZBQWtGO1lBQ2xGLElBQUksTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsK0NBQStDO2dCQUMvQyxNQUFNLElBQUEsZ0JBQUssRUFBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDekMsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELElBQUksTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsdURBQXVEO2dCQUN2RCxNQUFNLElBQUEsZ0JBQUssRUFBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDNUMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IscUhBQXFILENBQ3RILENBQUM7UUFDSixDQUFDO0tBQ0Y7SUFFRCx5QkFBeUIsR0FBRyxtQkFBbUIsQ0FBQztJQUNoRCxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY29uc3RhbnRzLCBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIGFjY2VzcyxcbiAgbWtkaXIsXG4gIG9wZW4sXG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgc3RhdCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgaXNBYnNvbHV0ZSxcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHJlc29sdmUsXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWFuaWZlc3QgfSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cFN0YWxlU29ja2V0SW5mb0ZpbGVzLFxuICBjcmVhdGVTb2NrZXRTZXJ2ZXIsXG4gIFNPQ0tFVF9JTkZPX0ZJTEVOQU1FLFxuICB0eXBlIFNvY2tldElPLFxuICB0eXBlIFNvY2tldFNlcnZlckNvbmZpZyxcbn0gZnJvbSAnLi9zb2NrZXQtc2VydmVyLmpzJztcblxuY29uc3QgUk9VVEVfU1RVQl9GSUxFX01BUktFUiA9ICdXT1JLRkxPV19ST1VURV9TVFVCX0ZJTEUnO1xuY29uc3QgUk9VVEVfU1RVQl9NQVJLRVJfU0NBTl9CWVRFUyA9IDQgKiAxMDI0O1xuY29uc3QgREVWX1dPUktGTE9XX0NPREVfRklMRU5BTUUgPSAnX193b3JrZmxvd19jb2RlLnR4dCc7XG5cbmxldCBDYWNoZWROZXh0QnVpbGRlckRlZmVycmVkOiBhbnk7XG5cbi8vIENyZWF0ZSB0aGUgZGVmZXJyZWQgTmV4dCBidWlsZGVyIGR5bmFtaWNhbGx5IGJ5IGV4dGVuZGluZyB0aGUgRVNNIEJhc2VCdWlsZGVyLlxuLy8gRXhwb3J0ZWQgYXMgZ2V0TmV4dEJ1aWxkZXJEZWZlcnJlZCgpIHRvIGFsbG93IENvbW1vbkpTIG1vZHVsZXMgdG8gaW1wb3J0IGZyb21cbi8vIHRoZSBFU00gQHdvcmtmbG93L2J1aWxkZXJzIHBhY2thZ2UgdmlhIGR5bmFtaWMgaW1wb3J0IGF0IHJ1bnRpbWUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dEJ1aWxkZXJEZWZlcnJlZCgpIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRGVmZXJyZWQpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJEZWZlcnJlZDtcbiAgfVxuXG4gIC8vIFYyOiBTVEVQX1FVRVVFX1RSSUdHRVIgYW5kIGVuaGFuY2VkLXJlc29sdmUgaW5mcmFzdHJ1Y3R1cmVcbiAgLy8gd2VyZSByZW1vdmVkIGJlY2F1c2UgdGhlIFYyIGNvbWJpbmVkIGhhbmRsZXIgZWxpbWluYXRlcyB0aGUgc2VwYXJhdGUgc3RlcFxuICAvLyByb3V0ZS90b3BpYy4gVGhlIHN0ZXAgY29weSBpbXBvcnQgcmV3cml0aW5nIChnZXRSZWxhdGl2ZUltcG9ydFNwZWNpZmllcixcbiAgLy8gZ2V0U3RlcENvcHlGaWxlTmFtZSwgcmV3cml0ZVJlbGF0aXZlSW1wb3J0c0ZvckNvcGllZFN0ZXApIGZyb20gbWFpbiB3YXMgYWxzb1xuICAvLyByZW1vdmVkIOKAlCBWMiBkb2Vzbid0IHVzZSBzdGVwIGNvcGllcy4gSWYgc3RlcCBjb3B5IHN1cHBvcnQgaXMgbmVlZGVkLCBpdFxuICAvLyBzaG91bGQgbGFuZCBhcyBhIGNvbXBsZXRlIGZlYXR1cmUgc2V0LlxuICBjb25zdCB7XG4gICAgQmFzZUJ1aWxkZXI6IEJhc2VCdWlsZGVyQ2xhc3MsXG4gICAgV09SS0ZMT1dfUVVFVUVfVFJJR0dFUixcbiAgICBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSxcbiAgICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zLFxuICAgIGFwcGx5U3djVHJhbnNmb3JtLFxuICAgIGdldEltcG9ydFBhdGgsXG4gICAgcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGgsXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOiBOZWVkIHRvIHVzZSBldmFsIGhlcmUgdG8gYXZvaWQgVHlwZVNjcmlwdCBmcm9tIHRyYW5zcGlsaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50IGludG8gYHJlcXVpcmUoKWBcbiAgfSA9IChhd2FpdCBldmFsKFxuICAgICdpbXBvcnQoXCJAd29ya2Zsb3cvYnVpbGRlcnNcIiknXG4gICkpIGFzIHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpO1xuXG4gIGNsYXNzIE5leHREZWZlcnJlZEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlckNsYXNzIHtcbiAgICBwcml2YXRlIHNvY2tldElPPzogU29ja2V0SU87XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJlZFN0ZXBGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJlZFNlcmRlRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHRyYWNrZWREZXBlbmRlbmN5RmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGRlZmVycmVkQnVpbGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHByaXZhdGUgY2FjaGVJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FjaGVXcml0ZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZGVmZXJyZWRSZWJ1aWxkVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBsYXN0RGVmZXJyZWRCdWlsZFNpZ25hdHVyZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVEaXNjb3ZlcnlTdGF0ZSgpO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwR2VuZXJhdGVkQXJ0aWZhY3RzT25Cb290KG91dHB1dERpcik7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVTdHViRmlsZXMob3V0cHV0RGlyKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlzY292ZXJ5U29ja2V0U2VydmVyKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25CZWZvcmVEZWZlcnJlZEVudHJpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVEaXNjb3ZlcnlTdGF0ZSgpO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURpc2NvdmVyZWRFbnRyeUZpbGVzKCk7XG4gICAgICBjb25zdCBpbXBsaWNpdFN0ZXBGaWxlcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUltcGxpY2l0U3RlcEZpbGVzKCk7XG5cbiAgICAgIGNvbnN0IHBlbmRpbmdCdWlsZCA9IHRoaXMuZGVmZXJyZWRCdWlsZFF1ZXVlLnRoZW4oKCkgPT5cbiAgICAgICAgdGhpcy5idWlsZERlZmVycmVkRW50cmllc1VudGlsU3RhYmxlKGltcGxpY2l0U3RlcEZpbGVzKVxuICAgICAgKTtcblxuICAgICAgLy8gS2VlcCB0aGUgcXVldWUgY2hhaW4gYWxpdmUgZXZlbiB3aGVuIHRoZSBjdXJyZW50IGJ1aWxkIGZhaWxzIHNvIGZ1dHVyZVxuICAgICAgLy8gY2FsbGJhY2tzIGNhbiBlbnF1ZXVlIGFub3RoZXIgYXR0ZW1wdCB3aXRob3V0IHRyaWdnZXJpbmcgdW5oYW5kbGVkXG4gICAgICAvLyByZWplY3Rpb24gd2FybmluZ3MuXG4gICAgICB0aGlzLmRlZmVycmVkQnVpbGRRdWV1ZSA9IHBlbmRpbmdCdWlsZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9yIGlzIHN1cmZhY2VkIHRocm91Z2ggYHBlbmRpbmdCdWlsZGAgYmVsb3cuXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgcGVuZGluZ0J1aWxkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudElucHV0RmlsZXMoaW1wbGljaXRTdGVwRmlsZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoW1xuICAgICAgICAgIC4uLnRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMsXG4gICAgICAgICAgLi4udGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnRoaXMuZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgICAgLi4uaW1wbGljaXRTdGVwRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkRGVmZXJyZWRFbnRyaWVzVW50aWxTdGFibGUoXG4gICAgICBpbXBsaWNpdFN0ZXBGaWxlczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIC8vIEEgc3VjY2Vzc2Z1bCBidWlsZCBjYW4gZGlzY292ZXIgYWRkaXRpb25hbCB0cmFuc2l0aXZlIGRlcGVuZGVuY3kgZmlsZXNcbiAgICAgIC8vICh2aWEgc291cmNlIG1hcHMpLCB3aGljaCBjaGFuZ2VzIHRoZSBzaWduYXR1cmUgYW5kIG1heSByZXF1aXJlIG9uZSBtb3JlXG4gICAgICAvLyBidWlsZCBwYXNzIHRvIGluY2x1ZGUgbmV3bHkgZGlzY292ZXJlZCBzZXJkZSBmaWxlcy5cbiAgICAgIGNvbnN0IG1heEJ1aWxkUGFzc2VzID0gMztcblxuICAgICAgZm9yIChsZXQgYnVpbGRQYXNzID0gMDsgYnVpbGRQYXNzIDwgbWF4QnVpbGRQYXNzZXM7IGJ1aWxkUGFzcysrKSB7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSB0aGlzLmdldEN1cnJlbnRJbnB1dEZpbGVzKGltcGxpY2l0U3RlcEZpbGVzKTtcbiAgICAgICAgY29uc3QgYnVpbGRTaWduYXR1cmUgPVxuICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGVmZXJyZWRCdWlsZFNpZ25hdHVyZShpbnB1dEZpbGVzKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkRm9yY2VCdWlsZEZvckdlbmVyYXRlZFJvdXRlcyA9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zaG91bGRGb3JjZUJ1aWxkRm9yR2VuZXJhdGVkUm91dGVzKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBidWlsZFNpZ25hdHVyZSA9PT0gdGhpcy5sYXN0RGVmZXJyZWRCdWlsZFNpZ25hdHVyZSAmJlxuICAgICAgICAgICFzaG91bGRGb3JjZUJ1aWxkRm9yR2VuZXJhdGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5idWlsZERpc2NvdmVyZWRGaWxlcyhpbnB1dEZpbGVzLCBpbXBsaWNpdFN0ZXBGaWxlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlRGlzY292ZXJlZEVudHJ5RmlsZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJlZElucHV0RmlsZXMgPVxuICAgICAgICAgICAgICB0aGlzLmdldEN1cnJlbnRJbnB1dEZpbGVzKGltcGxpY2l0U3RlcEZpbGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY292ZXJlZFNpZ25hdHVyZSA9XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGVmZXJyZWRCdWlsZFNpZ25hdHVyZShyZWNvdmVyZWRJbnB1dEZpbGVzKTtcbiAgICAgICAgICAgIGlmIChyZWNvdmVyZWRTaWduYXR1cmUgIT09IGJ1aWxkU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIEEgZmlsZSB3YXMgYWRkZWQvcmVtb3ZlZCB3aGlsZSB0aGlzIGJ1aWxkIHdhcyBydW5uaW5nOyByZXRyeVxuICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSB3aXRoIHRoZSByZWZyZXNoZWQgZGlzY292ZXJlZC1lbnRyeSBzdGF0ZS5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdbd29ya2Zsb3ddIERlZmVycmVkIGVudHJpZXMgYnVpbGQgZmFpbGVkLiBXaWxsIHJldHJ5IG9ubHkgYWZ0ZXIgaW5wdXRzIGNoYW5nZS4nLFxuICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubGFzdERlZmVycmVkQnVpbGRTaWduYXR1cmUgPSBidWlsZFNpZ25hdHVyZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdERlZmVycmVkQnVpbGRTaWduYXR1cmUgPSBidWlsZFNpZ25hdHVyZTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICAgICAgLy8gUHJvZHVjdGlvbiBidWlsZHMgY2FuIHBlcnNpc3QgbmV3bHkgZGlzY292ZXJlZCBkZWZlcnJlZC1lbnRyeSBmaWxlcyB0b1xuICAgICAgICAgIC8vIHRoZSBjYWNoZSBhZnRlciB0aGUgZmlyc3QgcGFzcyBjb21wbGV0ZXMuIFJlbG9hZCB0aGF0IGNhY2hlIGJlZm9yZSB3ZVxuICAgICAgICAgIC8vIGRlY2lkZSB3aGV0aGVyIHRoZSBpbnB1dCBzaWduYXR1cmUgc3RhYmlsaXplZCBzbyBzdGFnZWQgdGFyYmFsbCBidWlsZHNcbiAgICAgICAgICAvLyBjYW4gaW1tZWRpYXRlbHkgcmVwbGF5IHdpdGggdGhlIGV4cGFuZGVkIHN0ZXAgc2V0LlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDI1MCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFdvcmtmbG93c0NhY2hlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3N0QnVpbGRJbnB1dEZpbGVzID1cbiAgICAgICAgICB0aGlzLmdldEN1cnJlbnRJbnB1dEZpbGVzKGltcGxpY2l0U3RlcEZpbGVzKTtcbiAgICAgICAgY29uc3QgcG9zdEJ1aWxkU2lnbmF0dXJlID1cbiAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURlZmVycmVkQnVpbGRTaWduYXR1cmUocG9zdEJ1aWxkSW5wdXRGaWxlcyk7XG4gICAgICAgIGlmIChwb3N0QnVpbGRTaWduYXR1cmUgPT09IGJ1aWxkU2lnbmF0dXJlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1t3b3JrZmxvd10gRGVmZXJyZWQgZW50cmllcyBidWlsZCBzaWduYXR1cmUgZGlkIG5vdCBzdGFiaWxpemUgYWZ0ZXIgMyBwYXNzZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVJbXBsaWNpdFN0ZXBGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCB3b3JrZmxvd1N0ZGxpYlBhdGggPSB0aGlzLnJlc29sdmVXb3JrZmxvd1N0ZGxpYlN0ZXBGaWxlUGF0aCgpO1xuICAgICAgcmV0dXJuIHdvcmtmbG93U3RkbGliUGF0aCA/IFt3b3JrZmxvd1N0ZGxpYlBhdGhdIDogW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzaG91bGRGb3JjZUJ1aWxkRm9yR2VuZXJhdGVkUm91dGVzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gYXdhaXQgdGhpcy5maW5kQXBwRGlyZWN0b3J5KCk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRSb3V0ZUZpbGVzID0gW1xuICAgICAgICBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cvcm91dGUuanMnKSxcbiAgICAgICAgam9pbihvdXRwdXREaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rL1t0b2tlbl0vcm91dGUuanMnKSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGVGaWxlUGF0aCBvZiBnZW5lcmF0ZWRSb3V0ZUZpbGVzKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU3RhdGUgPSBhd2FpdCB0aGlzLmdldEdlbmVyYXRlZFJvdXRlU3RhdGUocm91dGVGaWxlUGF0aCk7XG4gICAgICAgIGlmIChyb3V0ZVN0YXRlID09PSAnbWlzc2luZycgfHwgcm91dGVTdGF0ZSA9PT0gJ3N0dWInKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0R2VuZXJhdGVkUm91dGVTdGF0ZShcbiAgICAgIHJvdXRlRmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IFByb21pc2U8J21pc3NpbmcnIHwgJ3N0dWInIHwgJ2dlbmVyYXRlZCc+IHtcbiAgICAgIGxldCByb3V0ZVN0YXRzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHN0YXQ+PjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvdXRlU3RhdHMgPSBhd2FpdCBzdGF0KHJvdXRlRmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnbWlzc2luZyc7XG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlU3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICdtaXNzaW5nJztcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgcm91dGVGaWxlSGFuZGxlID0gYXdhaXQgb3Blbihyb3V0ZUZpbGVQYXRoLCAncicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1hcmtlclNjYW5CdWZmZXIgPSBCdWZmZXIuYWxsb2MoUk9VVEVfU1RVQl9NQVJLRVJfU0NBTl9CWVRFUyk7XG4gICAgICAgICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IHJvdXRlRmlsZUhhbmRsZS5yZWFkKFxuICAgICAgICAgICAgbWFya2VyU2NhbkJ1ZmZlcixcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBST1VURV9TVFVCX01BUktFUl9TQ0FOX0JZVEVTLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbWFya2VyU2NhblNvdXJjZSA9IG1hcmtlclNjYW5CdWZmZXIudG9TdHJpbmcoXG4gICAgICAgICAgICAndXRmOCcsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgYnl0ZXNSZWFkXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbWFya2VyU2NhblNvdXJjZS5pbmNsdWRlcyhST1VURV9TVFVCX0ZJTEVfTUFSS0VSKVxuICAgICAgICAgICAgPyAnc3R1YidcbiAgICAgICAgICAgIDogJ2dlbmVyYXRlZCc7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgcm91dGVGaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJ21pc3NpbmcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzb2x2ZVdvcmtmbG93U3RkbGliU3RlcEZpbGVQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgbGV0IHdvcmtmbG93Q2pzRW50cnk6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHdvcmtmbG93Q2pzRW50cnkgPSByZXF1aXJlLnJlc29sdmUoJ3dvcmtmbG93Jywge1xuICAgICAgICAgIHBhdGhzOiBbdGhpcy5jb25maWcud29ya2luZ0Rpcl0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0Rpc3REaXIgPSBkaXJuYW1lKHdvcmtmbG93Q2pzRW50cnkpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dTdGRsaWJQYXRoID0gdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoXG4gICAgICAgIGpvaW4od29ya2Zsb3dEaXN0RGlyLCAnc3RkbGliLmpzJylcbiAgICAgICk7XG4gICAgICByZXR1cm4gZXhpc3RzU3luYyh3b3JrZmxvd1N0ZGxpYlBhdGgpID8gd29ya2Zsb3dTdGRsaWJQYXRoIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZURpc2NvdmVyZWRFbnRyaWVzKHtcbiAgICAgIHdvcmtmbG93Q2FuZGlkYXRlcyxcbiAgICAgIHN0ZXBDYW5kaWRhdGVzLFxuICAgICAgc2VyZGVDYW5kaWRhdGVzLFxuICAgICAgdmFsaWRhdGVQYXR0ZXJucyxcbiAgICB9OiB7XG4gICAgICB3b3JrZmxvd0NhbmRpZGF0ZXM6IEl0ZXJhYmxlPHN0cmluZz47XG4gICAgICBzdGVwQ2FuZGlkYXRlczogSXRlcmFibGU8c3RyaW5nPjtcbiAgICAgIHNlcmRlQ2FuZGlkYXRlcz86IEl0ZXJhYmxlPHN0cmluZz47XG4gICAgICB2YWxpZGF0ZVBhdHRlcm5zOiBib29sZWFuO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgIHdvcmtmbG93RmlsZXM6IFNldDxzdHJpbmc+O1xuICAgICAgc3RlcEZpbGVzOiBTZXQ8c3RyaW5nPjtcbiAgICAgIHNlcmRlRmlsZXM6IFNldDxzdHJpbmc+O1xuICAgIH0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXNCeUZpbGUgPSBuZXcgTWFwPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIHtcbiAgICAgICAgICBoYXNXb3JrZmxvd0NhbmRpZGF0ZTogYm9vbGVhbjtcbiAgICAgICAgICBoYXNTdGVwQ2FuZGlkYXRlOiBib29sZWFuO1xuICAgICAgICAgIGhhc1NlcmRlQ2FuZGlkYXRlOiBib29sZWFuO1xuICAgICAgICB9XG4gICAgICA+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygd29ya2Zsb3dDYW5kaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGNhbmRpZGF0ZXNCeUZpbGUuZ2V0KG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgZXhpc3RpbmcuaGFzV29ya2Zsb3dDYW5kaWRhdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbmRpZGF0ZXNCeUZpbGUuc2V0KG5vcm1hbGl6ZWRQYXRoLCB7XG4gICAgICAgICAgICBoYXNXb3JrZmxvd0NhbmRpZGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1N0ZXBDYW5kaWRhdGU6IGZhbHNlLFxuICAgICAgICAgICAgaGFzU2VyZGVDYW5kaWRhdGU6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygc3RlcENhbmRpZGF0ZXMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gY2FuZGlkYXRlc0J5RmlsZS5nZXQobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBleGlzdGluZy5oYXNTdGVwQ2FuZGlkYXRlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYW5kaWRhdGVzQnlGaWxlLnNldChub3JtYWxpemVkUGF0aCwge1xuICAgICAgICAgICAgaGFzV29ya2Zsb3dDYW5kaWRhdGU6IGZhbHNlLFxuICAgICAgICAgICAgaGFzU3RlcENhbmRpZGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1NlcmRlQ2FuZGlkYXRlOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VyZGVDYW5kaWRhdGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygc2VyZGVDYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjYW5kaWRhdGVzQnlGaWxlLmdldChub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy5oYXNTZXJkZUNhbmRpZGF0ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXNCeUZpbGUuc2V0KG5vcm1hbGl6ZWRQYXRoLCB7XG4gICAgICAgICAgICAgIGhhc1dvcmtmbG93Q2FuZGlkYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgaGFzU3RlcENhbmRpZGF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgIGhhc1NlcmRlQ2FuZGlkYXRlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVFbnRyaWVzID0gQXJyYXkuZnJvbShjYW5kaWRhdGVzQnlGaWxlLmVudHJpZXMoKSkuc29ydChcbiAgICAgICAgKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYilcbiAgICAgICk7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRFbnRyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVFbnRyaWVzLm1hcChhc3luYyAoW2ZpbGVQYXRoLCBjYW5kaWRhdGVzXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlU3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGlmICghZmlsZVN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlUGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBoYXNVc2VXb3JrZmxvdzogY2FuZGlkYXRlcy5oYXNXb3JrZmxvd0NhbmRpZGF0ZSxcbiAgICAgICAgICAgICAgICBoYXNVc2VTdGVwOiBjYW5kaWRhdGVzLmhhc1N0ZXBDYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgaGFzU2VyZGU6IGNhbmRpZGF0ZXMuaGFzU2VyZGVDYW5kaWRhdGUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICAgIGhhc1VzZVdvcmtmbG93OiBwYXR0ZXJucy5oYXNVc2VXb3JrZmxvdyxcbiAgICAgICAgICAgICAgaGFzVXNlU3RlcDogcGF0dGVybnMuaGFzVXNlU3RlcCxcbiAgICAgICAgICAgICAgaGFzU2VyZGU6IHBhdHRlcm5zLmhhc1NlcmRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHN0ZXBGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3Qgc2VyZGVGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWxpZGF0ZWRFbnRyaWVzKSB7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuaGFzVXNlV29ya2Zsb3cpIHtcbiAgICAgICAgICB3b3JrZmxvd0ZpbGVzLmFkZChlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5Lmhhc1VzZVN0ZXApIHtcbiAgICAgICAgICBzdGVwRmlsZXMuYWRkKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuaGFzU2VyZGUpIHtcbiAgICAgICAgICBzZXJkZUZpbGVzLmFkZChlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgd29ya2Zsb3dGaWxlcywgc3RlcEZpbGVzLCBzZXJkZUZpbGVzIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZURpc2NvdmVyZWRFbnRyeUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd29ya2Zsb3dDYW5kaWRhdGVzID0gbmV3IFNldCh0aGlzLmRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVzKTtcbiAgICAgIGNvbnN0IHN0ZXBDYW5kaWRhdGVzID0gbmV3IFNldCh0aGlzLmRpc2NvdmVyZWRTdGVwRmlsZXMpO1xuICAgICAgY29uc3Qgc2VyZGVDYW5kaWRhdGVzID0gbmV3IFNldCh0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzKTtcbiAgICAgIGNvbnN0IHsgd29ya2Zsb3dGaWxlcywgc3RlcEZpbGVzLCBzZXJkZUZpbGVzIH0gPVxuICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZURpc2NvdmVyZWRFbnRyaWVzKHtcbiAgICAgICAgICB3b3JrZmxvd0NhbmRpZGF0ZXMsXG4gICAgICAgICAgc3RlcENhbmRpZGF0ZXMsXG4gICAgICAgICAgc2VyZGVDYW5kaWRhdGVzLFxuICAgICAgICAgIHZhbGlkYXRlUGF0dGVybnM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBSZWNvbmNpbGUgdmFsaWRhdGVkIGVudHJpZXMgYWdhaW5zdCB0aGUgc25hcHNob3Qgd2Ugc3RhcnRlZCB3aXRoIHNvXG4gICAgICAvLyBmaWxlIGRpc2NvdmVyaWVzIHRoYXQgYXJyaXZlIGR1cmluZyB2YWxpZGF0aW9uIGFyZSBwcmVzZXJ2ZWQuXG4gICAgICBsZXQgd29ya2Zsb3dzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgbGV0IHN0ZXBzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgbGV0IHNlcmRlQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdvcmtmbG93Q2FuZGlkYXRlcykge1xuICAgICAgICBpZiAoIXdvcmtmbG93RmlsZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHdvcmtmbG93c0NoYW5nZWQgPVxuICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcy5kZWxldGUoZmlsZVBhdGgpIHx8IHdvcmtmbG93c0NoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2Ygd29ya2Zsb3dGaWxlcykge1xuICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuYWRkKGZpbGVQYXRoKTtcbiAgICAgICAgICB3b3JrZmxvd3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHN0ZXBDYW5kaWRhdGVzKSB7XG4gICAgICAgIGlmICghc3RlcEZpbGVzLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBzdGVwc0NoYW5nZWQgPVxuICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmRlbGV0ZShmaWxlUGF0aCkgfHwgc3RlcHNDaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHN0ZXBGaWxlcykge1xuICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFN0ZXBGaWxlcy5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgICAgICAgc3RlcHNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHNlcmRlQ2FuZGlkYXRlcykge1xuICAgICAgICBpZiAoIXNlcmRlRmlsZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHNlcmRlQ2hhbmdlZCA9XG4gICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmRlbGV0ZShmaWxlUGF0aCkgfHwgc2VyZGVDaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHNlcmRlRmlsZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgICAgICAgc2VyZGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAod29ya2Zsb3dzQ2hhbmdlZCB8fCBzdGVwc0NoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmtmbG93c0NhY2hlV3JpdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkRGlzY292ZXJlZEZpbGVzKFxuICAgICAgaW5wdXRGaWxlczogc3RyaW5nW10sXG4gICAgICBpbXBsaWNpdFN0ZXBGaWxlczogc3RyaW5nW11cbiAgICApIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG4gICAgICBjb25zdCBjYWNoZURpciA9IGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgdGhpcy5nZXREaXN0RGlyKCksICdjYWNoZScpO1xuICAgICAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc3QgbWFuaWZlc3RCdWlsZERpciA9IGpvaW4oY2FjaGVEaXIsICd3b3JrZmxvdy1nZW5lcmF0ZWQtbWFuaWZlc3QnKTtcbiAgICAgIGNvbnN0IHRlbXBSb3V0ZUZpbGVOYW1lID0gJ3JvdXRlLmpzLnRlbXAnO1xuICAgICAgY29uc3QgdHJhY2tlZERpc2NvdmVyZWRFbnRyaWVzID1cbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0VHJhY2tlZERpc2NvdmVyZWRFbnRyaWVzKCk7XG4gICAgICBjb25zdCBkaXNjb3ZlcmVkU3RlcEZpbGVDYW5kaWRhdGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4udGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnRyYWNrZWREaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU3RlcHMsXG4gICAgICAgICAgLi4uaW1wbGljaXRTdGVwRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVDYW5kaWRhdGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4udGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcyxcbiAgICAgICAgICAuLi50cmFja2VkRGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFdvcmtmbG93cyxcbiAgICAgICAgXSlcbiAgICAgICkuc29ydCgpO1xuICAgICAgY29uc3QgZGlzY292ZXJlZFNlcmRlRmlsZUNhbmRpZGF0ZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAuLi50aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLFxuICAgICAgICAgIC4uLnRyYWNrZWREaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgICAgICAgXSlcbiAgICAgICkuc29ydCgpO1xuICAgICAgY29uc3QgZGlzY292ZXJlZFdvcmtmbG93RmlsZXMgPSBhd2FpdCB0aGlzLmZpbHRlckV4aXN0aW5nRmlsZXMoXG4gICAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVDYW5kaWRhdGVzXG4gICAgICApO1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGVwRmlsZUNhbmRpZGF0ZXMgPSBhd2FpdCB0aGlzLmZpbHRlckV4aXN0aW5nRmlsZXMoXG4gICAgICAgIGRpc2NvdmVyZWRTdGVwRmlsZUNhbmRpZGF0ZXNcbiAgICAgICk7XG4gICAgICBjb25zdCBkaXNjb3ZlcmVkU3RlcEZpbGVzID0gYXdhaXQgdGhpcy5jb2xsZWN0VHJhbnNpdGl2ZVN0ZXBGaWxlcyh7XG4gICAgICAgIGVudHJ5RmlsZXM6IFsuLi5leGlzdGluZ1N0ZXBGaWxlQ2FuZGlkYXRlcywgLi4uZGlzY292ZXJlZFdvcmtmbG93RmlsZXNdLFxuICAgICAgICBzdGVwRmlsZXM6IGV4aXN0aW5nU3RlcEZpbGVDYW5kaWRhdGVzLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBleGlzdGluZ1NlcmRlRmlsZUNhbmRpZGF0ZXMgPSBhd2FpdCB0aGlzLmZpbHRlckV4aXN0aW5nRmlsZXMoXG4gICAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVDYW5kaWRhdGVzXG4gICAgICApO1xuICAgICAgY29uc3QgZGlzY292ZXJlZFNlcmRlRmlsZXMgPSBhd2FpdCB0aGlzLmNvbGxlY3RUcmFuc2l0aXZlU2VyZGVGaWxlcyh7XG4gICAgICAgIGVudHJ5RmlsZXM6IFsuLi5kaXNjb3ZlcmVkU3RlcEZpbGVzLCAuLi5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlc10sXG4gICAgICAgIHNlcmRlRmlsZXM6IGV4aXN0aW5nU2VyZGVGaWxlQ2FuZGlkYXRlcyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhpc3RpbmdJbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5maWx0ZXJFeGlzdGluZ0ZpbGVzKGlucHV0RmlsZXMpO1xuICAgICAgY29uc3QgYnVpbGRJbnB1dEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgLi4uZXhpc3RpbmdJbnB1dEZpbGVzLFxuICAgICAgICAgIC4uLmRpc2NvdmVyZWRTdGVwRmlsZXMsXG4gICAgICAgICAgLi4uZGlzY292ZXJlZFdvcmtmbG93RmlsZXMsXG4gICAgICAgICAgLi4uZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyZWRFbnRyaWVzID0ge1xuICAgICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQoZGlzY292ZXJlZFN0ZXBGaWxlcyksXG4gICAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IG5ldyBTZXQoZGlzY292ZXJlZFdvcmtmbG93RmlsZXMpLFxuICAgICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldChkaXNjb3ZlcmVkU2VyZGVGaWxlcyksXG4gICAgICB9O1xuXG4gICAgICAvLyBFbnN1cmUgb3V0cHV0IGRpcmVjdG9yaWVzIGV4aXN0XG4gICAgICBhd2FpdCBta2Rpcih3b3JrZmxvd0dlbmVyYXRlZERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLFxuICAgICAgICAnKidcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRzY29uZmlnUGF0aCA9IGF3YWl0IHRoaXMuZmluZFRzQ29uZmlnUGF0aCgpO1xuXG4gICAgICBjb25zdCBmbG93Um91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdycpO1xuICAgICAgYXdhaXQgbWtkaXIoZmxvd1JvdXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgY29tYmluZWRSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZURlZmVycmVkRmxvd1JvdXRlKHtcbiAgICAgICAgaW5wdXRGaWxlczogYnVpbGRJbnB1dEZpbGVzLFxuICAgICAgICBmbG93T3V0ZmlsZTogam9pbihmbG93Um91dGVEaXIsIHRlbXBSb3V0ZUZpbGVOYW1lKSxcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFdlYmhvb2tSb3V0ZSh7XG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICByb3V0ZUZpbGVOYW1lOiB0ZW1wUm91dGVGaWxlTmFtZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVHJhY2tlZERlcGVuZGVuY3lGaWxlcyhcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgIHRlbXBSb3V0ZUZpbGVOYW1lXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICAgICAgc3RlcHM6IHsgLi4uY29tYmluZWRSZXN1bHQ/Lm1hbmlmZXN0Py5zdGVwcyB9LFxuICAgICAgICB3b3JrZmxvd3M6IHsgLi4uY29tYmluZWRSZXN1bHQ/Lm1hbmlmZXN0Py53b3JrZmxvd3MgfSxcbiAgICAgICAgY2xhc3NlczogeyAuLi5jb21iaW5lZFJlc3VsdD8ubWFuaWZlc3Q/LmNsYXNzZXMgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmlmZXN0RmlsZVBhdGggPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnbWFuaWZlc3QuanNvbicpO1xuICAgICAgY29uc3QgbWFuaWZlc3RCdWlsZFBhdGggPSBqb2luKG1hbmlmZXN0QnVpbGREaXIsICdtYW5pZmVzdC5qc29uJyk7XG4gICAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgYGZsb3cvJHt0ZW1wUm91dGVGaWxlTmFtZX1gXG4gICAgICApO1xuICAgICAgY29uc3QgbWFuaWZlc3RKc29uID0gYXdhaXQgdGhpcy5jcmVhdGVNYW5pZmVzdCh7XG4gICAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgICAgbWFuaWZlc3REaXI6IG1hbmlmZXN0QnVpbGREaXIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgfSk7XG4gICAgICBpZiAobWFuaWZlc3RKc29uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmV3cml0ZUpzb25GaWxlV2l0aFN0YWJsZUtleU9yZGVyKG1hbmlmZXN0QnVpbGRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZUlmQ2hhbmdlZChtYW5pZmVzdEJ1aWxkUGF0aCwgbWFuaWZlc3RGaWxlUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBybShtYW5pZmVzdEJ1aWxkUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcm0obWFuaWZlc3RGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXIpO1xuXG4gICAgICAvLyBWMjogQ29tYmluZWQgcm91dGUgKGZsb3cpIOKAlCBzdGVwIHJlZ2lzdHJhdGlvbnMgYWxyZWFkeSBhdCBmaW5hbCBwYXRoXG4gICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCBgZmxvdy8ke3RlbXBSb3V0ZUZpbGVOYW1lfWApLFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdy9yb3V0ZS5qcycpXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZUlmQ2hhbmdlZChcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgYHdlYmhvb2svW3Rva2VuXS8ke3RlbXBSb3V0ZUZpbGVOYW1lfWApLFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnd2ViaG9vay9bdG9rZW5dL3JvdXRlLmpzJylcbiAgICAgICk7XG5cbiAgICAgIC8vIEV4cG9zZSBtYW5pZmVzdCBhcyBhIHN0YXRpYyBmaWxlIHdoZW4gV09SS0ZMT1dfUFVCTElDX01BTklGRVNUPTEuXG4gICAgICAvLyBOZXh0LmpzIHNlcnZlcyBmaWxlcyBmcm9tIHB1YmxpYy8gYXQgdGhlIHJvb3QgVVJMLlxuICAgICAgaWYgKHRoaXMuc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QgJiYgbWFuaWZlc3RKc29uKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY01hbmlmZXN0RGlyID0gam9pbihcbiAgICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEnXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IG1rZGlyKHB1YmxpY01hbmlmZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlRmlsZUlmQ2hhbmdlZChcbiAgICAgICAgICAgIGpvaW4ocHVibGljTWFuaWZlc3REaXIsICcuZ2l0aWdub3JlJyksXG4gICAgICAgICAgICAnKidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVJZkNoYW5nZWQoXG4gICAgICAgICAgbWFuaWZlc3RGaWxlUGF0aCxcbiAgICAgICAgICBqb2luKHB1YmxpY01hbmlmZXN0RGlyLCAnbWFuaWZlc3QuanNvbicpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdGlmeSBkZWZlcnJlZCBlbnRyeSBsb2FkZXJzIHdhaXRpbmcgb24gcm91dGUuanMgc3R1YnMuXG4gICAgICB0aGlzLnNvY2tldElPPy5lbWl0KCdidWlsZC1jb21wbGV0ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRGVmZXJyZWRGbG93Um91dGUoe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIGZsb3dPdXRmaWxlLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgfToge1xuICAgICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgICBmbG93T3V0ZmlsZTogc3RyaW5nO1xuICAgICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgICAgZGlzY292ZXJlZEVudHJpZXM6IHtcbiAgICAgICAgZGlzY292ZXJlZFN0ZXBzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogU2V0PHN0cmluZz47XG4gICAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVzOiBTZXQ8c3RyaW5nPjtcbiAgICAgIH07XG4gICAgfSk6IFByb21pc2U8eyBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCB9PiB7XG4gICAgICBjb25zdCB3b3JrZmxvd1Jlc3VsdCA9IGF3YWl0IHRoaXMuY3JlYXRlV29ya2Zsb3dzQnVuZGxlKHtcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgb3V0ZmlsZTogYCR7Zmxvd091dGZpbGV9Ll9fd2ZfdG1wLmpzYCxcbiAgICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93Vk1Db2RlID0gd29ya2Zsb3dSZXN1bHQuaW50ZXJpbUJ1bmRsZVRleHQ7XG4gICAgICBpZiAoIXdvcmtmbG93Vk1Db2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGRpZCBub3QgcmV0dXJuIGludGVyaW1CdW5kbGVUZXh0J1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBybShgJHtmbG93T3V0ZmlsZX0uX193Zl90bXAuanNgLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9ycy5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RlcEFuZFNlcmRlRmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU3RlcHMsXG4gICAgICAgICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFNlcmRlRmlsZXMsXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IHN0ZXBJbXBvcnRzID0gYXdhaXQgdGhpcy5jcmVhdGVEZWZlcnJlZFN0ZXBTaWRlRWZmZWN0SW1wb3J0cyhcbiAgICAgICAgc3RlcEFuZFNlcmRlRmlsZXMsXG4gICAgICAgIGRpcm5hbWUoZmxvd091dGZpbGUpXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RlcE1hbmlmZXN0ID1cbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVEZWZlcnJlZFN0ZXBNYW5pZmVzdChzdGVwQW5kU2VyZGVGaWxlcyk7XG4gICAgICBjb25zdCBlc2NhcGVkVk1Db2RlID0gd29ya2Zsb3dWTUNvZGUucmVwbGFjZSgvW1xcXFxgJF0vZywgJ1xcXFwkJicpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgPVxuICAgICAgICBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSgpO1xuICAgICAgbGV0IHJvdXRlQ29kZTogc3RyaW5nO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dDb2RlUGF0aCA9IGpvaW4oXG4gICAgICAgICAgZGlybmFtZShmbG93T3V0ZmlsZSksXG4gICAgICAgICAgREVWX1dPUktGTE9XX0NPREVfRklMRU5BTUVcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZUZpbGVJZkNoYW5nZWQod29ya2Zsb3dDb2RlUGF0aCwgd29ya2Zsb3dWTUNvZGUpO1xuICAgICAgICByb3V0ZUNvZGUgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnO1xuJHtzdGVwSW1wb3J0c31cbmltcG9ydCB7IHJlYWRGaWxlLCBzdGF0IH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB3b3JrZmxvd0VudHJ5cG9pbnQgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztcblxuY29uc3Qgd29ya2Zsb3dDb2RlUGF0aCA9ICR7SlNPTi5zdHJpbmdpZnkod29ya2Zsb3dDb2RlUGF0aCl9O1xubGV0IGNhY2hlZFdvcmtmbG93SGFuZGxlcjtcbmxldCBjYWNoZWRXb3JrZmxvd0NvZGVTaWduYXR1cmU7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFdvcmtmbG93SGFuZGxlcigpIHtcbiAgY29uc3Qgd29ya2Zsb3dDb2RlU3RhdHMgPSBhd2FpdCBzdGF0KHdvcmtmbG93Q29kZVBhdGgpO1xuICBjb25zdCB3b3JrZmxvd0NvZGVTaWduYXR1cmUgPSBcXGBcXCR7d29ya2Zsb3dDb2RlU3RhdHMuc2l6ZX06XFwke3dvcmtmbG93Q29kZVN0YXRzLm10aW1lTXN9XFxgO1xuICBpZiAoIWNhY2hlZFdvcmtmbG93SGFuZGxlciB8fCBjYWNoZWRXb3JrZmxvd0NvZGVTaWduYXR1cmUgIT09IHdvcmtmbG93Q29kZVNpZ25hdHVyZSkge1xuICAgIGNvbnN0IHdvcmtmbG93Q29kZSA9IGF3YWl0IHJlYWRGaWxlKHdvcmtmbG93Q29kZVBhdGgsICd1dGY4Jyk7XG4gICAgY2FjaGVkV29ya2Zsb3dIYW5kbGVyID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtcbiAgICBjYWNoZWRXb3JrZmxvd0NvZGVTaWduYXR1cmUgPSB3b3JrZmxvd0NvZGVTaWduYXR1cmU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFdvcmtmbG93SGFuZGxlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxKSB7XG4gIHJldHVybiAoYXdhaXQgZ2V0V29ya2Zsb3dIYW5kbGVyKCkpKHJlcSk7XG59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvdXRlQ29kZSA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0ICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucyc7XG4ke3N0ZXBJbXBvcnRzfVxuaW1wb3J0IHsgd29ya2Zsb3dFbnRyeXBvaW50IH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG5cbmNvbnN0IHdvcmtmbG93Q29kZSA9IFxcYCR7ZXNjYXBlZFZNQ29kZX1cXGA7XG5cbmV4cG9ydCBjb25zdCBQT1NUID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtgO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlRmlsZUlmQ2hhbmdlZChmbG93T3V0ZmlsZSwgcm91dGVDb2RlKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAuLi5zdGVwTWFuaWZlc3QsXG4gICAgICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgICAgICAuLi5zdGVwTWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICAgICAgLi4ud29ya2Zsb3dSZXN1bHQubWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3Nlczoge1xuICAgICAgICAgICAgLi4uc3RlcE1hbmlmZXN0LmNsYXNzZXMsXG4gICAgICAgICAgICAuLi53b3JrZmxvd1Jlc3VsdC5tYW5pZmVzdC5jbGFzc2VzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRGVmZXJyZWRTdGVwU2lkZUVmZmVjdEltcG9ydHMoXG4gICAgICBmaWxlczogc3RyaW5nW10sXG4gICAgICByb3V0ZURpcjogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGltcG9ydFNwZWNpZmllcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKChmaWxlKSA9PlxuICAgICAgICAgIHRoaXMuZ2V0RGVmZXJyZWRSb3V0ZUltcG9ydFNwZWNpZmllcihmaWxlLCByb3V0ZURpcilcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGltcG9ydFNwZWNpZmllcnNcbiAgICAgICAgLm1hcCgoc3BlY2lmaWVyKSA9PiBgaW1wb3J0ICR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX07YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RGVmZXJyZWRSb3V0ZUltcG9ydFNwZWNpZmllcihcbiAgICAgIGZpbGU6IHN0cmluZyxcbiAgICAgIHJvdXRlRGlyOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgICAgcmV0dXJuIGltcG9ydFBhdGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGF3YWl0IHRoaXMucmVzb2x2ZURlZmVycmVkUm91dGVJbXBvcnRGaWxlUGF0aChcbiAgICAgICAgcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBpbXBvcnRQYXRoKVxuICAgICAgKTtcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShyb3V0ZURpciwgYWJzb2x1dGVQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRGVmZXJyZWRSb3V0ZUltcG9ydEZpbGVQYXRoKFxuICAgICAgZmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCBwYWNrYWdlRGlzdFBhdGggPVxuICAgICAgICB0aGlzLnJlc29sdmVQYWNrYWdlU291cmNlRGlzdEZpbGVQYXRoRm9yUm91dGVJbXBvcnQoZmlsZVBhdGgpO1xuICAgICAgaWYgKHBhY2thZ2VEaXN0UGF0aCkge1xuICAgICAgICByZXR1cm4gcGFja2FnZURpc3RQYXRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlUGFja2FnZVNvdXJjZURpc3RGaWxlUGF0aEZvclJvdXRlSW1wb3J0KFxuICAgICAgZmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IHN0cmluZyB8IG51bGwge1xuICAgICAgY29uc3QgcmVsYXRpdmVUb1dvcmtpbmdEaXIgPSByZWxhdGl2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBmaWxlUGF0aCk7XG4gICAgICBpZiAoXG4gICAgICAgICFyZWxhdGl2ZVRvV29ya2luZ0Rpci5zdGFydHNXaXRoKCcuLicpICYmXG4gICAgICAgICFpc0Fic29sdXRlKHJlbGF0aXZlVG9Xb3JraW5nRGlyKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHRoaXMuZmluZFBhY2thZ2VSb290Rm9yUm91dGVJbXBvcnRTb3VyY2UoZmlsZVBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlUm9vdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpdmVUb1BhY2thZ2VSb290ID0gcmVsYXRpdmUocGFja2FnZVJvb3QsIGZpbGVQYXRoKS5yZXBsYWNlKFxuICAgICAgICAvXFxcXC9nLFxuICAgICAgICAnLydcbiAgICAgICk7XG4gICAgICBjb25zdCBzcmNQcmVmaXggPSAnc3JjLyc7XG4gICAgICBpZiAoIXJlbGF0aXZlVG9QYWNrYWdlUm9vdC5zdGFydHNXaXRoKHNyY1ByZWZpeCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUocmVsYXRpdmVUb1BhY2thZ2VSb290KTtcbiAgICAgIGNvbnN0IG91dHB1dEV4dGVuc2lvbiA9XG4gICAgICAgIGV4dGVuc2lvbiA9PT0gJy5tdHMnID8gJy5tanMnIDogZXh0ZW5zaW9uID09PSAnLmN0cycgPyAnLmNqcycgOiAnLmpzJztcbiAgICAgIGNvbnN0IHdpdGhvdXRFeHRlbnNpb24gPSByZWxhdGl2ZVRvUGFja2FnZVJvb3Quc2xpY2UoXG4gICAgICAgIHNyY1ByZWZpeC5sZW5ndGgsXG4gICAgICAgIHJlbGF0aXZlVG9QYWNrYWdlUm9vdC5sZW5ndGggLSBleHRlbnNpb24ubGVuZ3RoXG4gICAgICApO1xuICAgICAgY29uc3QgZGlzdFBhdGggPSBqb2luKFxuICAgICAgICBwYWNrYWdlUm9vdCxcbiAgICAgICAgJ2Rpc3QnLFxuICAgICAgICBgJHt3aXRob3V0RXh0ZW5zaW9ufSR7b3V0cHV0RXh0ZW5zaW9ufWBcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBleGlzdHNTeW5jKGRpc3RQYXRoKSA/IGRpc3RQYXRoIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQYWNrYWdlUm9vdEZvclJvdXRlSW1wb3J0U291cmNlKFxuICAgICAgZmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IHN0cmluZyB8IG51bGwge1xuICAgICAgbGV0IGN1cnJlbnREaXIgPSBkaXJuYW1lKGZpbGVQYXRoKTtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZURlZmVycmVkU3RlcE1hbmlmZXN0KFxuICAgICAgZmlsZXM6IHN0cmluZ1tdXG4gICAgKTogUHJvbWlzZTxXb3JrZmxvd01hbmlmZXN0PiB7XG4gICAgICBjb25zdCBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgICAgY29uc3QgbWFuaWZlc3RGaWxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoW1xuICAgICAgICAgIC4uLmZpbGVzLFxuICAgICAgICAgIC4uLihhd2FpdCB0aGlzLnJlc29sdmVCdWlsdEluU3RlcEZpbGVzRm9yTWFuaWZlc3QoKSksXG4gICAgICAgIF0pXG4gICAgICApLnNvcnQoKTtcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIG1hbmlmZXN0RmlsZXMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZmlsZSwgJ3V0ZjgnKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpdmVGaWxlcGF0aCA9IGF3YWl0IHRoaXMuZ2V0UmVsYXRpdmVGaWxlbmFtZUZvclN3YyhmaWxlKTtcbiAgICAgICAgY29uc3QgeyB3b3JrZmxvd01hbmlmZXN0IH0gPSBhd2FpdCBhcHBseVN3Y1RyYW5zZm9ybShcbiAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAnc3RlcCcsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1lcmdlV29ya2Zsb3dNYW5pZmVzdChtYW5pZmVzdCwgd29ya2Zsb3dNYW5pZmVzdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVCdWlsdEluU3RlcEZpbGVzRm9yTWFuaWZlc3QoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShcbiAgICAgICAgICBqb2luKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdwYWNrYWdlLmpzb24nKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHRoaXMubm9ybWFsaXplRGlzY292ZXJlZEZpbGVQYXRoKFxuICAgICAgICAgICAgd29ya2Zsb3dSZXF1aXJlLnJlc29sdmUoJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJylcbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgICAgIHRhcmdldDogV29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgIHNvdXJjZTogV29ya2Zsb3dNYW5pZmVzdFxuICAgICk6IHZvaWQge1xuICAgICAgdGFyZ2V0LndvcmtmbG93cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHRhcmdldC53b3JrZmxvd3MgfHwge30sXG4gICAgICAgIHNvdXJjZS53b3JrZmxvd3NcbiAgICAgICk7XG4gICAgICB0YXJnZXQuc3RlcHMgPSBPYmplY3QuYXNzaWduKHRhcmdldC5zdGVwcyB8fCB7fSwgc291cmNlLnN0ZXBzKTtcbiAgICAgIHRhcmdldC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQuY2xhc3NlcyB8fCB7fSwgc291cmNlLmNsYXNzZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2xlYW51cEdlbmVyYXRlZEFydGlmYWN0c09uQm9vdChcbiAgICAgIG91dHB1dERpcjogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB3b3JrZmxvd0dlbmVyYXRlZERpciA9IGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEnKTtcbiAgICAgIGNvbnN0IGZsb3dSb3V0ZURpciA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93Jyk7XG4gICAgICBjb25zdCBzdGVwUm91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnc3RlcCcpO1xuICAgICAgY29uc3Qgd2ViaG9va1JvdXRlRGlyID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ3dlYmhvb2svW3Rva2VuXScpO1xuXG4gICAgICBjb25zdCBzdGFsZUFydGlmYWN0UGF0aHMgPSBbXG4gICAgICAgIGpvaW4oZmxvd1JvdXRlRGlyLCAncm91dGUuanMudGVtcCcpLFxuICAgICAgICBqb2luKGZsb3dSb3V0ZURpciwgJ3JvdXRlLmpzLnRlbXAuZGVidWcuanNvbicpLFxuICAgICAgICBqb2luKGZsb3dSb3V0ZURpciwgJ3JvdXRlLmpzLmRlYnVnLmpzb24nKSxcbiAgICAgICAgam9pbihmbG93Um91dGVEaXIsIERFVl9XT1JLRkxPV19DT0RFX0ZJTEVOQU1FKSxcbiAgICAgICAgam9pbihmbG93Um91dGVEaXIsICdfX3N0ZXBfcmVnaXN0cmF0aW9ucy5yb3V0ZS5qcy50ZW1wJyksXG4gICAgICAgIGpvaW4oZmxvd1JvdXRlRGlyLCAnX19zdGVwX3JlZ2lzdHJhdGlvbnMucm91dGUuanMudGVtcC5kZWJ1Zy5qc29uJyksXG4gICAgICAgIC8vIFYyOiBjbGVhbiB1cCBzdGFsZSBWMSBzdGVwIHJvdXRlIGRpcmVjdG9yeVxuICAgICAgICBzdGVwUm91dGVEaXIsXG4gICAgICAgIGpvaW4od2ViaG9va1JvdXRlRGlyLCAncm91dGUuanMudGVtcCcpLFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnbWFuaWZlc3QuanNvbicpLFxuICAgICAgXTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5zdGFsZUFydGlmYWN0UGF0aHMubWFwKChzdGFsZVBhdGgpID0+XG4gICAgICAgICAgcm0oc3RhbGVQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICAgICAgKSxcbiAgICAgICAgY2xlYW51cFN0YWxlU29ja2V0SW5mb0ZpbGVzKFxuICAgICAgICAgIGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgdGhpcy5nZXREaXN0RGlyKCkpXG4gICAgICAgICksXG4gICAgICAgIHRoaXMucmVtb3ZlU3RhbGVEZWZlcnJlZFRlbXBGaWxlcyhmbG93Um91dGVEaXIpLFxuICAgICAgICB0aGlzLnJlbW92ZVN0YWxlRGVmZXJyZWRUZW1wRmlsZXMod2ViaG9va1JvdXRlRGlyKSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVtb3ZlU3RhbGVEZWZlcnJlZFRlbXBGaWxlcyhcbiAgICAgIHJvdXRlRGlyOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHJvdXRlRW50cmllcyA9IGF3YWl0IHJlYWRkaXIocm91dGVEaXIsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgIH0pLmNhdGNoKCgpID0+IFtdKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByb3V0ZUVudHJpZXNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGVudHJ5KSA9PlxuICAgICAgICAgICAgICBlbnRyeS5pc0ZpbGUoKSAmJlxuICAgICAgICAgICAgICBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ3JvdXRlLmpzLicpICYmXG4gICAgICAgICAgICAgIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy50bXAnKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICAgIHJtKGpvaW4ocm91dGVEaXIsIGVudHJ5Lm5hbWUpLCB7XG4gICAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlRGlzY292ZXJ5U29ja2V0U2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKHRoaXMuc29ja2V0SU8gfHwgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09DS0VUX1BPUlQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19TT0NLRVRfSU5GT19QQVRIID0gdGhpcy5nZXRTb2NrZXRJbmZvRmlsZVBhdGgoKTtcbiAgICAgIGNvbnN0IGNvbmZpZzogU29ja2V0U2VydmVyQ29uZmlnID0ge1xuICAgICAgICBpc0RldlNlcnZlcjogQm9vbGVhbih0aGlzLmNvbmZpZy53YXRjaCksXG4gICAgICAgIHNvY2tldEluZm9GaWxlUGF0aDogdGhpcy5nZXRTb2NrZXRJbmZvRmlsZVBhdGgoKSxcbiAgICAgICAgb25GaWxlRGlzY292ZXJlZDogKFxuICAgICAgICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgaGFzV29ya2Zsb3c6IGJvb2xlYW4sXG4gICAgICAgICAgaGFzU3RlcDogYm9vbGVhbixcbiAgICAgICAgICBoYXNTZXJkZTogYm9vbGVhblxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aCk7XG4gICAgICAgICAgbGV0IGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCB3YXNUcmFja2VkRGVwZW5kZW5jeSA9XG4gICAgICAgICAgICB0aGlzLnRyYWNrZWREZXBlbmRlbmN5RmlsZXMuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCk7XG5cbiAgICAgICAgICBpZiAoaGFzV29ya2Zsb3cpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcy5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVzLmFkZChub3JtYWxpemVkRmlsZVBhdGgpO1xuICAgICAgICAgICAgICBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2FzRGVsZXRlZCA9XG4gICAgICAgICAgICAgIHRoaXMuZGlzY292ZXJlZFdvcmtmbG93RmlsZXMuZGVsZXRlKG5vcm1hbGl6ZWRGaWxlUGF0aCk7XG4gICAgICAgICAgICBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlID0gd2FzRGVsZXRlZCB8fCBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNTdGVwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzY292ZXJlZFN0ZXBGaWxlcy5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTdGVwRmlsZXMuYWRkKG5vcm1hbGl6ZWRGaWxlUGF0aCk7XG4gICAgICAgICAgICAgIGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3YXNEZWxldGVkID1cbiAgICAgICAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmRlbGV0ZShub3JtYWxpemVkRmlsZVBhdGgpO1xuICAgICAgICAgICAgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZSA9IHdhc0RlbGV0ZWQgfHwgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzU2VyZGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcy5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICBoYXNDYWNoZVRyYWNraW5nQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzY292ZXJlZFNlcmRlRmlsZXMuYWRkKG5vcm1hbGl6ZWRGaWxlUGF0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc0RlbGV0ZWQgPVxuICAgICAgICAgICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmRlbGV0ZShub3JtYWxpemVkRmlsZVBhdGgpO1xuICAgICAgICAgICAgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZSA9IHdhc0RlbGV0ZWQgfHwgaGFzQ2FjaGVUcmFja2luZ0NoYW5nZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ2FjaGVUcmFja2luZ0NoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmtmbG93c0NhY2hlV3JpdGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBoYXNXb3JrZmxvdyB8fFxuICAgICAgICAgICAgaGFzU3RlcCB8fFxuICAgICAgICAgICAgaGFzU2VyZGUgfHxcbiAgICAgICAgICAgIGhhc0NhY2hlVHJhY2tpbmdDaGFuZ2UgfHxcbiAgICAgICAgICAgIHdhc1RyYWNrZWREZXBlbmRlbmN5XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRGVmZXJyZWRSZWJ1aWxkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblRyaWdnZXJCdWlsZDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVEZWZlcnJlZFJlYnVpbGQoKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0SU8gPSBhd2FpdCBjcmVhdGVTb2NrZXRTZXJ2ZXIoY29uZmlnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVEaXNjb3ZlcnlTdGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICh0aGlzLmNhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmxvYWRXb3JrZmxvd3NDYWNoZSgpO1xuICAgICAgLy8gRGVmZXJyZWQgbW9kZSBtdXN0IG5vdCBydW4gZWFnZXIgaW5wdXQtZ3JhcGggZGlzY292ZXJ5OyBlbnRyaWVzIGFyZVxuICAgICAgLy8gZGlzY292ZXJlZCB2aWEgbG9hZGVyLT5zb2NrZXQgbm90aWZpY2F0aW9ucyBkdXJpbmcgTmV4dCdzIGJ1aWxkLlxuICAgICAgdGhpcy5jYWNoZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERpc3REaXIoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAodGhpcy5jb25maWcgYXMgeyBkaXN0RGlyPzogc3RyaW5nIH0pLmRpc3REaXIgfHwgJy5uZXh0JztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdvcmtmbG93c0NhY2hlRmlsZVBhdGgoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBqb2luKFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICB0aGlzLmdldERpc3REaXIoKSxcbiAgICAgICAgJ2NhY2hlJyxcbiAgICAgICAgJ3dvcmtmbG93cy5qc29uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNvY2tldEluZm9GaWxlUGF0aCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGpvaW4oXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgIHRoaXMuZ2V0RGlzdERpcigpLFxuICAgICAgICBTT0NLRVRfSU5GT19GSUxFTkFNRVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQYWNrYWdlSnNvblBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgbGV0IGN1cnJlbnREaXIgPSBkaXJuYW1lKGZpbGVQYXRoKTtcbiAgICAgIGxldCBwcmV2aW91c0RpciA9ICcnO1xuXG4gICAgICB3aGlsZSAoY3VycmVudERpciAhPT0gcHJldmlvdXNEaXIpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gcGFja2FnZUpzb25QYXRoO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzRGlyID0gY3VycmVudERpcjtcbiAgICAgICAgY3VycmVudERpciA9IGRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvdWxkUHJlZmVyU291cmNlQmFja2VkUGFja2FnZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAvLyBPbmx5IHByZWZlciBzb3VyY2UgZm9yIHdvcmtzcGFjZSBwYWNrYWdlcyAobm90IGluIG5vZGVfbW9kdWxlcykuXG4gICAgICAvLyBGb3IgdGFyYmFsbC1pbnN0YWxsZWQgcGFja2FnZXMsIHVzaW5nIHNvdXJjZS1iYWNrZWQgcGF0aHMgY2F1c2VzXG4gICAgICAvLyBlc2J1aWxkIHRvIGJ1bmRsZSB0aGUgZnVsbCBzb3VyY2UgdHJlZSAoaW5jbHVkaW5nIHdvcmxkLnRzIHdpdGhcbiAgICAgIC8vIHByb2Nlc3MuY3dkKCkpIGluc3RlYWQgb2YgZXh0ZXJuYWxpemluZyBwcm9wZXJseS5cbiAgICAgIGlmIChcbiAgICAgICAgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy9wYWNrYWdlcy8nKSAmJlxuICAgICAgICAhbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHRoaXMuZmluZFBhY2thZ2VKc29uUGF0aChmaWxlUGF0aCk7XG4gICAgICBpZiAoIXBhY2thZ2VKc29uUGF0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKVxuICAgICAgICApIGFzIHsgbmFtZT86IHVua25vd24gfTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBwYWNrYWdlSnNvbi5uYW1lID09PSAnd29ya2Zsb3cnIHx8XG4gICAgICAgICAgKHR5cGVvZiBwYWNrYWdlSnNvbi5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgcGFja2FnZUpzb24ubmFtZS5zdGFydHNXaXRoKCdAd29ya2Zsb3cvJykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplRGlzY292ZXJlZEZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICAgID8gZmlsZVBhdGhcbiAgICAgICAgOiByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbHRlckV4aXN0aW5nRmlsZXMoZmlsZVBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aHMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgIGZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoZmlsZVBhdGgpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNvcnQoKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdGaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBub3JtYWxpemVkRmlsZVBhdGhzLm1hcChhc3luYyAoZmlsZVBhdGgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgc3RhdChmaWxlUGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZVN0YXRzLmlzRmlsZSgpID8gZmlsZVBhdGggOiBudWxsO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGV4aXN0aW5nRmlsZXMuZmlsdGVyKChmaWxlUGF0aCk6IGZpbGVQYXRoIGlzIHN0cmluZyA9PlxuICAgICAgICBCb29sZWFuKGZpbGVQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZURlZmVycmVkQnVpbGRTaWduYXR1cmUoXG4gICAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXVxuICAgICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAuLi5pbnB1dEZpbGVzLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChmaWxlUGF0aClcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLnRoaXMudHJhY2tlZERlcGVuZGVuY3lGaWxlcyxcbiAgICAgICAgXSlcbiAgICAgICkuc29ydCgpO1xuXG4gICAgICBjb25zdCBzaWduYXR1cmVQYXJ0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBub3JtYWxpemVkRmlsZXMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlU3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiBgJHtmaWxlUGF0aH06JHtmaWxlU3RhdHMuc2l6ZX06JHtNYXRoLnRydW5jKGZpbGVTdGF0cy5tdGltZU1zKX1gO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGAke2ZpbGVQYXRofTptaXNzaW5nYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzaWduYXR1cmVIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hdHVyZVBhcnQgb2Ygc2lnbmF0dXJlUGFydHMpIHtcbiAgICAgICAgc2lnbmF0dXJlSGFzaC51cGRhdGUoc2lnbmF0dXJlUGFydCk7XG4gICAgICAgIHNpZ25hdHVyZUhhc2gudXBkYXRlKCdcXG4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpZ25hdHVyZUhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbGxlY3RUcmFja2VkRGlzY292ZXJlZEVudHJpZXMoKTogUHJvbWlzZTx7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IHN0cmluZ1tdO1xuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogc3RyaW5nW107XG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogc3RyaW5nW107XG4gICAgfT4ge1xuICAgICAgaWYgKHRoaXMudHJhY2tlZERlcGVuZGVuY3lGaWxlcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGlzY292ZXJlZFN0ZXBzOiBbXSxcbiAgICAgICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBbXSxcbiAgICAgICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogW10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgd29ya2Zsb3dGaWxlcywgc3RlcEZpbGVzLCBzZXJkZUZpbGVzIH0gPVxuICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZURpc2NvdmVyZWRFbnRyaWVzKHtcbiAgICAgICAgICB3b3JrZmxvd0NhbmRpZGF0ZXM6IHRoaXMudHJhY2tlZERlcGVuZGVuY3lGaWxlcyxcbiAgICAgICAgICBzdGVwQ2FuZGlkYXRlczogdGhpcy50cmFja2VkRGVwZW5kZW5jeUZpbGVzLFxuICAgICAgICAgIHNlcmRlQ2FuZGlkYXRlczogdGhpcy50cmFja2VkRGVwZW5kZW5jeUZpbGVzLFxuICAgICAgICAgIHZhbGlkYXRlUGF0dGVybnM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNjb3ZlcmVkU3RlcHM6IEFycmF5LmZyb20oc3RlcEZpbGVzKS5zb3J0KCksXG4gICAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IEFycmF5LmZyb20od29ya2Zsb3dGaWxlcykuc29ydCgpLFxuICAgICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogQXJyYXkuZnJvbShzZXJkZUZpbGVzKS5zb3J0KCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRyYWNrZWREZXBlbmRlbmN5RmlsZXMoXG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcjogc3RyaW5nLFxuICAgICAgcm91dGVGaWxlTmFtZTogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBidW5kbGVGaWxlcyA9IFtcbiAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgYHN0ZXAvJHtyb3V0ZUZpbGVOYW1lfWApLFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCBgZmxvdy8ke3JvdXRlRmlsZU5hbWV9YCksXG4gICAgICBdO1xuICAgICAgY29uc3QgdHJhY2tlZEZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgYnVuZGxlRmlsZSBvZiBidW5kbGVGaWxlcykge1xuICAgICAgICBjb25zdCBidW5kbGVTb3VyY2VzID0gYXdhaXQgdGhpcy5leHRyYWN0QnVuZGxlU291cmNlRmlsZXMoYnVuZGxlRmlsZSk7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBidW5kbGVTb3VyY2VzKSB7XG4gICAgICAgICAgdHJhY2tlZEZpbGVzLmFkZChzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHJhY2tlZEZpbGVzLnNpemUgPiAwKSB7XG4gICAgICAgIHRoaXMudHJhY2tlZERlcGVuZGVuY3lGaWxlcyA9IHRyYWNrZWRGaWxlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4dHJhY3RCdW5kbGVTb3VyY2VGaWxlcyhcbiAgICAgIGJ1bmRsZUZpbGVQYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBsZXQgYnVuZGxlQ29udGVudHM6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1bmRsZUNvbnRlbnRzID0gYXdhaXQgcmVhZEZpbGUoYnVuZGxlRmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZURpcmVjdG9yeSA9IGRpcm5hbWUoYnVuZGxlRmlsZVBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxTb3VyY2VGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAvLyBFeHRyYWN0IGlubGluZSBiYXNlNjQgc291cmNlbWFwcyB2aWEgc3RyaW5nIHNjYW5uaW5nLiBBIHByZXZpb3VzXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiB1c2VkIGBidW5kbGVDb250ZW50cy5tYXRjaEFsbCgvLi4uW0EtWmEtejAtOSsvPV0rLi4uL2cpYFxuICAgICAgLy8gd2hpY2ggb3ZlcmZsb3dzIFY4J3MgcmVnZXggc3RhY2tcbiAgICAgIC8vIChgUmFuZ2VFcnJvcjogTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWQgYXQgUmVnRXhwU3RyaW5nSXRlcmF0b3IubmV4dGApXG4gICAgICAvLyBvbiBidW5kbGVzIHdpdGggbGFyZ2UgaW5saW5lIHNvdXJjZW1hcHMg4oCUIFY4J3MgaXJyZWdleHAgdXNlc1xuICAgICAgLy8gcmVjdXJzaW9uIGZvciBncmVlZHkgY2hhcmFjdGVyLWNsYXNzIHF1YW50aWZpZXJzIGFuZCBjZXJ0YWluIGxvbmdcbiAgICAgIC8vIGJhc2U2NCBpbnB1dHMgZXhoYXVzdCB0aGUgY2FsbCBzdGFjay5cbiAgICAgIGNvbnN0IHNvdXJjZU1hcFByZWZpeCA9ICcvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgY29uc3QgYmFzZTY0TWFya2VyID0gJztiYXNlNjQsJztcbiAgICAgIGNvbnN0IHNvdXJjZU1hcE1hdGNoZXM6IEFycmF5PHsgYmFzZTY0VmFsdWU6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgbGV0IHNjYW5Gcm9tID0gMDtcbiAgICAgIHdoaWxlIChzY2FuRnJvbSA8IGJ1bmRsZUNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBwcmVmaXhJZHggPSBidW5kbGVDb250ZW50cy5pbmRleE9mKHNvdXJjZU1hcFByZWZpeCwgc2NhbkZyb20pO1xuICAgICAgICBpZiAocHJlZml4SWR4ID09PSAtMSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGJhc2U2NFN0YXJ0ID0gYnVuZGxlQ29udGVudHMuaW5kZXhPZihcbiAgICAgICAgICBiYXNlNjRNYXJrZXIsXG4gICAgICAgICAgcHJlZml4SWR4ICsgc291cmNlTWFwUHJlZml4Lmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICBpZiAoYmFzZTY0U3RhcnQgPT09IC0xKSB7XG4gICAgICAgICAgc2NhbkZyb20gPSBwcmVmaXhJZHggKyBzb3VyY2VNYXBQcmVmaXgubGVuZ3RoO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJhaWwgaWYgYSBjb21tYSBhcHBlYXJzIGJlZm9yZSBgO2Jhc2U2NCxgIOKAlCB0aGF0IG1lYW5zIHRoaXNcbiAgICAgICAgLy8gd2Fzbid0IGEgYGRhdGE6YXBwbGljYXRpb24vanNvbls7cGFyYW1zXTtiYXNlNjQsLi4uYCBVUkwgYWZ0ZXJcbiAgICAgICAgLy8gYWxsICh0aGUgY29tbWEgd291bGQgdGVybWluYXRlIHRoZSBkYXRhIFVSTCBwYXJhbWV0ZXJzKS5cbiAgICAgICAgY29uc3QgY29tbWFCZWZvcmUgPSBidW5kbGVDb250ZW50cy5pbmRleE9mKCcsJywgcHJlZml4SWR4KTtcbiAgICAgICAgaWYgKGNvbW1hQmVmb3JlICE9PSAtMSAmJiBjb21tYUJlZm9yZSA8IGJhc2U2NFN0YXJ0KSB7XG4gICAgICAgICAgc2NhbkZyb20gPSBiYXNlNjRTdGFydDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVN0YXJ0ID0gYmFzZTY0U3RhcnQgKyBiYXNlNjRNYXJrZXIubGVuZ3RoO1xuICAgICAgICAvLyBCYXNlNjQgcGF5bG9hZCB0ZXJtaW5hdGVzIGF0IGZpcnN0IG5vbi1iYXNlNjQgY2hhciAobmV3bGluZSxcbiAgICAgICAgLy8gY2xvc2luZyBgKi9gLCBldGMuKS4gU2Nhbm5pbmcgYSBzbWFsbCBhbHBoYWJldCBieSBjaGFyIGlzIGZhclxuICAgICAgICAvLyBjaGVhcGVyIHRoYW4gYmFja3RyYWNraW5nIGEgcmVnZXggb3ZlciBhIG11bHRpLU1CIGNhcHR1cmUuXG4gICAgICAgIGxldCB2YWx1ZUVuZCA9IHZhbHVlU3RhcnQ7XG4gICAgICAgIHdoaWxlICh2YWx1ZUVuZCA8IGJ1bmRsZUNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGNvZGUgPSBidW5kbGVDb250ZW50cy5jaGFyQ29kZUF0KHZhbHVlRW5kKTtcbiAgICAgICAgICAvLyBBLVogMHg0MS0weDVBLCBhLXogMHg2MS0weDdBLCAwLTkgMHgzMC0weDM5LCAnKycgMHgyQixcbiAgICAgICAgICAvLyAnLycgMHgyRiwgJz0nIDB4M0RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAoY29kZSA+PSAweDQxICYmIGNvZGUgPD0gMHg1YSkgfHxcbiAgICAgICAgICAgICAgKGNvZGUgPj0gMHg2MSAmJiBjb2RlIDw9IDB4N2EpIHx8XG4gICAgICAgICAgICAgIChjb2RlID49IDB4MzAgJiYgY29kZSA8PSAweDM5KSB8fFxuICAgICAgICAgICAgICBjb2RlID09PSAweDJiIHx8XG4gICAgICAgICAgICAgIGNvZGUgPT09IDB4MmYgfHxcbiAgICAgICAgICAgICAgY29kZSA9PT0gMHgzZFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlRW5kKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlRW5kID4gdmFsdWVTdGFydCkge1xuICAgICAgICAgIHNvdXJjZU1hcE1hdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBiYXNlNjRWYWx1ZTogYnVuZGxlQ29udGVudHMuc2xpY2UodmFsdWVTdGFydCwgdmFsdWVFbmQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNjYW5Gcm9tID0gdmFsdWVFbmQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlTWFwTWF0Y2hlcykge1xuICAgICAgICBjb25zdCBiYXNlNjRWYWx1ZSA9IG1hdGNoLmJhc2U2NFZhbHVlO1xuICAgICAgICBpZiAoIWJhc2U2NFZhbHVlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc291cmNlTWFwOiB7IHNvdXJjZVJvb3Q/OiB1bmtub3duOyBzb3VyY2VzPzogdW5rbm93biB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShiYXNlNjRWYWx1ZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpXG4gICAgICAgICAgKSBhcyB7IHNvdXJjZVJvb3Q/OiB1bmtub3duOyBzb3VyY2VzPzogdW5rbm93biB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVJvb3QgPVxuICAgICAgICAgIHR5cGVvZiBzb3VyY2VNYXAuc291cmNlUm9vdCA9PT0gJ3N0cmluZycgPyBzb3VyY2VNYXAuc291cmNlUm9vdCA6ICcnO1xuICAgICAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShzb3VyY2VNYXAuc291cmNlcylcbiAgICAgICAgICA/IHNvdXJjZU1hcC5zb3VyY2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHNvdXJjZSk6IHNvdXJjZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoJ3dlYnBhY2s6Ly8nKSB8fCBzb3VyY2Uuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcmVzb2x2ZWRTb3VyY2VQYXRoOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc29sdmVkU291cmNlUGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChuZXcgVVJMKHNvdXJjZSkucGF0aG5hbWUpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNBYnNvbHV0ZShzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXNvbHZlZFNvdXJjZVBhdGggPSBzb3VyY2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVkU291cmNlUGF0aCA9IHJlc29sdmUoYmFzZURpcmVjdG9yeSwgc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkU291cmNlUGF0aCA9XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChyZXNvbHZlZFNvdXJjZVBhdGgpO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTb3VyY2VQYXRoRm9yQ2hlY2sgPSBub3JtYWxpemVkU291cmNlUGF0aC5yZXBsYWNlKFxuICAgICAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgICAgICcvJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaXNTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aCA9XG4gICAgICAgICAgICB0aGlzLnNob3VsZFByZWZlclNvdXJjZUJhY2tlZFBhY2thZ2VQYXRoKG5vcm1hbGl6ZWRTb3VyY2VQYXRoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBub3JtYWxpemVkU291cmNlUGF0aEZvckNoZWNrLmluY2x1ZGVzKCcvLndlbGwta25vd24vd29ya2Zsb3cvJykgfHxcbiAgICAgICAgICAgICghaXNTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aCAmJlxuICAgICAgICAgICAgICBub3JtYWxpemVkU291cmNlUGF0aEZvckNoZWNrLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpKSB8fFxuICAgICAgICAgICAgKCFpc1NvdXJjZUJhY2tlZFBhY2thZ2VQYXRoICYmXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRTb3VyY2VQYXRoRm9yQ2hlY2suaW5jbHVkZXMoJy8ucG5wbS8nKSkgfHxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRTb3VyY2VQYXRoRm9yQ2hlY2suaW5jbHVkZXMoJy8ubmV4dC8nKSB8fFxuICAgICAgICAgICAgbm9ybWFsaXplZFNvdXJjZVBhdGhGb3JDaGVjay5lbmRzV2l0aCgnL3ZpcnR1YWwtZW50cnkuanMnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbG9jYWxTb3VyY2VGaWxlcy5hZGQobm9ybWFsaXplZFNvdXJjZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGxvY2FsU291cmNlRmlsZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVXb3JrZmxvd3NDYWNoZVdyaXRlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuY2FjaGVXcml0ZVRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhY2hlV3JpdGVUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FjaGVXcml0ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FjaGVXcml0ZVRpbWVyID0gbnVsbDtcbiAgICAgICAgdm9pZCB0aGlzLndyaXRlV29ya2Zsb3dzQ2FjaGUoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byB3cml0ZSB3b3JrZmxvdyBkaXNjb3ZlcnkgY2FjaGUnLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSwgNTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVEZWZlcnJlZFJlYnVpbGQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5kZWZlcnJlZFJlYnVpbGRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWZlcnJlZFJlYnVpbGRUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVmZXJyZWRSZWJ1aWxkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kZWZlcnJlZFJlYnVpbGRUaW1lciA9IG51bGw7XG4gICAgICAgIHZvaWQgdGhpcy5vbkJlZm9yZURlZmVycmVkRW50cmllcygpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbd29ya2Zsb3ddIERlZmVycmVkIHJlYnVpbGQgYWZ0ZXIgc291cmNlIHVwZGF0ZSBmYWlsZWQuJyxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCA3NSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkV29ya2Zsb3dzQ2FjaGUoKTogUHJvbWlzZTx7XG4gICAgICB3b3JrZmxvd0ZpbGVzOiBzdHJpbmdbXTtcbiAgICAgIHN0ZXBGaWxlczogc3RyaW5nW107XG4gICAgfSB8IG51bGw+IHtcbiAgICAgIGNvbnN0IGNhY2hlRmlsZVBhdGggPSB0aGlzLmdldFdvcmtmbG93c0NhY2hlRmlsZVBhdGgoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FjaGVDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlQ29udGVudHMpIGFzIHtcbiAgICAgICAgICB3b3JrZmxvd0ZpbGVzPzogdW5rbm93bjtcbiAgICAgICAgICBzdGVwRmlsZXM/OiB1bmtub3duO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBBcnJheS5pc0FycmF5KHBhcnNlZC53b3JrZmxvd0ZpbGVzKVxuICAgICAgICAgID8gcGFyc2VkLndvcmtmbG93RmlsZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogW107XG4gICAgICAgIGNvbnN0IHN0ZXBGaWxlcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnN0ZXBGaWxlcylcbiAgICAgICAgICA/IHBhcnNlZC5zdGVwRmlsZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogW107XG5cbiAgICAgICAgcmV0dXJuIHsgd29ya2Zsb3dGaWxlcywgc3RlcEZpbGVzIH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkV29ya2Zsb3dzQ2FjaGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBjYWNoZWREYXRhID0gYXdhaXQgdGhpcy5yZWFkV29ya2Zsb3dzQ2FjaGUoKTtcbiAgICAgIGlmICghY2FjaGVkRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHdvcmtmbG93RmlsZXMsIHN0ZXBGaWxlcywgc2VyZGVGaWxlcyB9ID1cbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVEaXNjb3ZlcmVkRW50cmllcyh7XG4gICAgICAgICAgd29ya2Zsb3dDYW5kaWRhdGVzOiBjYWNoZWREYXRhLndvcmtmbG93RmlsZXMsXG4gICAgICAgICAgc3RlcENhbmRpZGF0ZXM6IGNhY2hlZERhdGEuc3RlcEZpbGVzLFxuICAgICAgICAgIHNlcmRlQ2FuZGlkYXRlczogdGhpcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgICAgICAgICB2YWxpZGF0ZVBhdHRlcm5zOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcy5jbGVhcigpO1xuICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmNsZWFyKCk7XG4gICAgICB0aGlzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdvcmtmbG93RmlsZXMpIHtcbiAgICAgICAgdGhpcy5kaXNjb3ZlcmVkV29ya2Zsb3dGaWxlcy5hZGQoZmlsZVBhdGgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBzdGVwRmlsZXMpIHtcbiAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU3RlcEZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHNlcmRlRmlsZXMpIHtcbiAgICAgICAgdGhpcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcy5hZGQoZmlsZVBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVXb3JrZmxvd3NDYWNoZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGNhY2hlRmlsZVBhdGggPSB0aGlzLmdldFdvcmtmbG93c0NhY2hlRmlsZVBhdGgoKTtcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCB0aGlzLmdldERpc3REaXIoKSwgJ2NhY2hlJyk7XG4gICAgICBhd2FpdCBta2RpcihjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHtcbiAgICAgICAgd29ya2Zsb3dGaWxlczogQXJyYXkuZnJvbSh0aGlzLmRpc2NvdmVyZWRXb3JrZmxvd0ZpbGVzKS5zb3J0KCksXG4gICAgICAgIHN0ZXBGaWxlczogQXJyYXkuZnJvbSh0aGlzLmRpc2NvdmVyZWRTdGVwRmlsZXMpLnNvcnQoKSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZURhdGEsIG51bGwsIDIpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlU3R1YkZpbGVzKG91dHB1dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAvLyBUdXJib3BhY2sgY3VycmVudGx5IGhhcyBhIHdvcmtlci1jb25jdXJyZW5jeSBsaW1pdGF0aW9uIGZvciBwZW5kaW5nXG4gICAgICAvLyB2aXJ0dWFsIGVudHJpZXMuIFdhcm4gaWYgcGFyYWxsZWxpc20gaXMgdG9vIGxvdyB0byByZWxpYWJseSBkaXNjb3Zlci5cbiAgICAgIGNvbnN0IHBhcmFsbGVsaXNtQ291bnQgPSBvcy5hdmFpbGFibGVQYXJhbGxlbGlzbSgpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52LlRVUkJPUEFDSyAmJiBwYXJhbGxlbGlzbUNvdW50IDwgNCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEF2YWlsYWJsZSBwYXJhbGxlbGlzbSBvZiAke3BhcmFsbGVsaXNtQ291bnR9IGlzIGxlc3MgdGhhbiBuZWVkZWQgNC4gVGhpcyBjYW4gY2F1c2Ugd29ya2Zsb3dzL3N0ZXBzIHRvIGZhaWwgdG8gZGlzY292ZXIgcHJvcGVybHkgaW4gdHVyYm9wYWNrYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZVN0dWJDb250ZW50ID0gW1xuICAgICAgICBgLy8gJHtST1VURV9TVFVCX0ZJTEVfTUFSS0VSfWAsXG4gICAgICAgICdleHBvcnQgY29uc3QgX193b3JrZmxvd1JvdXRlU3R1YiA9IHRydWU7JyxcbiAgICAgIF0uam9pbignXFxuJyk7XG4gICAgICBjb25zdCB3b3JrZmxvd0dlbmVyYXRlZERpciA9IGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEnKTtcblxuICAgICAgYXdhaXQgbWtkaXIoam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBta2Rpcihqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnd2ViaG9vay9bdG9rZW5dJyksIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLFxuICAgICAgICAnKidcbiAgICAgICk7XG5cbiAgICAgIC8vIFYyOiBPbmx5IGZsb3cgKyB3ZWJob29rIHN0dWJzIG5lZWRlZCAobm8gc2VwYXJhdGUgc3RlcCByb3V0ZSkuXG4gICAgICAvLyBTdHVicyBhcmUgcmVwbGFjZWQgYnkgZ2VuZXJhdGVkIG91dHB1dCBvbmNlIGRpc2NvdmVyeSBmaW5pc2hlcy5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKFxuICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdy9yb3V0ZS5qcycpLFxuICAgICAgICByb3V0ZVN0dWJDb250ZW50XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy53cml0ZUZpbGVJZkNoYW5nZWQoXG4gICAgICAgIGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICd3ZWJob29rL1t0b2tlbl0vcm91dGUuanMnKSxcbiAgICAgICAgcm91dGVTdHViQ29udGVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5wdXRGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAvLyBSZWFkIE5leHQuanMncyBhcHAtcGF0aHMtbWFuaWZlc3QuanNvbiBmcm9tIGEgcHJldmlvdXMgYnVpbGQgdG9cbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBmaWxlcyBhcmUgYWN0dWFsIHJvdXRlIGVudHJ5cG9pbnRzLiBUaGlzIGF2b2lkc1xuICAgICAgLy8gcHJlZGljdGluZyBOZXh0LmpzIGNvbnZlbnRpb25zIHdpdGggcmVnZXhlcyBhbmQgaW5zdGVhZCByZWFkc1xuICAgICAgLy8gZnJvbSBOZXh0LmpzJ3Mgb3duIG91dHB1dC5cbiAgICAgIGNvbnN0IG5leHREaXIgPSBqb2luKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICcubmV4dCcpO1xuICAgICAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihuZXh0RGlyLCAnYXBwLXBhdGhzLW1hbmlmZXN0Lmpzb24nKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0Q29udGVudCA9IHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UobWFuaWZlc3RDb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAvLyBUaGUgbWFuaWZlc3QgbWFwcyByb3V0ZSBwYXRocyB0byB0aGVpciBzb3VyY2UgZmlsZXMuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHNvdXJjZSBmaWxlIHBhdGhzIGFuZCByZXNvbHZlIHRoZW0uXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0RmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIE9iamVjdC52YWx1ZXMobWFuaWZlc3QpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKG5leHREaXIsICdzZXJ2ZXInLCBzb3VyY2VQYXRoKTtcbiAgICAgICAgICAvLyBUaGUgbWFuaWZlc3QgcG9pbnRzIHRvIGJ1aWx0IG91dHB1dDsgZmluZCB0aGUgc291cmNlIGZpbGVcbiAgICAgICAgICAvLyBieSBtYXRjaGluZyBhZ2FpbnN0IHRoZSBiYXNlIGJ1aWxkZXIncyBmdWxsIGZpbGUgbGlzdC5cbiAgICAgICAgICBtYW5pZmVzdEZpbGVzLmFkZChyZXNvbHZlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIG1hbmlmZXN0IHJvdXRlIHBhdGhzIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMuXG4gICAgICAgIC8vIEEgZmlsZSBpcyBpbmNsdWRlZCBpZiBpdCBtYXRjaGVzIGEga25vd24gcm91dGUgc2VnbWVudCBmcm9tXG4gICAgICAgIC8vIHRoZSBtYW5pZmVzdCAoZS5nLiwgYXBwL2FwaS9yb3V0ZSBjb250YWlucyAnYXBwL2FwaS9yb3V0ZScpLlxuICAgICAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gT2JqZWN0LmtleXMobWFuaWZlc3QpLm1hcCgocm91dGUpID0+XG4gICAgICAgICAgcm91dGUucmVwbGFjZSgvXlxcLy8sICcnKS5yZXBsYWNlKC9cXC9yb3V0ZSQvLCAnJylcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGlucHV0RmlsZXMuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICAgIHJvdXRlU2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaXRlbS5pbmNsdWRlcyhzZWdtZW50KSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBObyBtYW5pZmVzdCBmcm9tIGEgcHJldmlvdXMgYnVpbGQg4oCUIGZhbGwgYmFjayB0byB0aGUgYmFzZVxuICAgICAgICAvLyBidWlsZGVyJ3MgZnVsbCBmaWxlIHNjYW4uIFRoaXMgaXMgc2FmZSBidXQgc2xvd2VyOyBzdWJzZXF1ZW50XG4gICAgICAgIC8vIGJ1aWxkcyB3aWxsIHVzZSB0aGUgbWFuaWZlc3QuXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXI6IHN0cmluZykge1xuICAgICAgLy8gd2UgZG9uJ3QgcnVuIHRoaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZSBhcyBpdCdzIG5vdCBuZWVkZWRcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBWMjogU2luZ2xlIGNvbWJpbmVkIHRyaWdnZXIgaGFuZGxlcyBib3RoIHdvcmtmbG93IGFuZCBzdGVwIGV4ZWN1dGlvblxuICAgICAgY29uc3QgZ2VuZXJhdGVkQ29uZmlnID0ge1xuICAgICAgICB2ZXJzaW9uOiAnMCcsXG4gICAgICAgIHdvcmtmbG93czoge1xuICAgICAgICAgIG1heER1cmF0aW9uOiAnbWF4JyxcbiAgICAgICAgICBleHBlcmltZW50YWxUcmlnZ2VyczogW1dPUktGTE9XX1FVRVVFX1RSSUdHRVJdLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUZpbGVJZkNoYW5nZWQoXG4gICAgICAgIGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEvY29uZmlnLmpzb24nKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZ2VuZXJhdGVkQ29uZmlnLCBudWxsLCAyKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlRmlsZUlmQ2hhbmdlZChcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICBjb250ZW50czogc3RyaW5nIHwgQnVmZmVyXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBuZXh0QnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnRzKVxuICAgICAgICA/IGNvbnRlbnRzXG4gICAgICAgIDogQnVmZmVyLmZyb20oY29udGVudHMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjdXJyZW50QnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY3VycmVudEJ1ZmZlci5lcXVhbHMobmV4dEJ1ZmZlcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGaWxlIGRvZXMgbm90IGV4aXN0IHlldCBvciBjYW5ub3QgYmUgcmVhZDsgd3JpdGUgYSBmcmVzaCBjb3B5LlxuICAgICAgfVxuXG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIG5leHRCdWZmZXIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZUlmQ2hhbmdlZChcbiAgICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBzb3VyY2VDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKHNvdXJjZVBhdGgpO1xuICAgICAgcmV0dXJuIHRoaXMud3JpdGVGaWxlSWZDaGFuZ2VkKGRlc3RpbmF0aW9uUGF0aCwgc291cmNlQ29udGVudHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc29ydEpzb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuc29ydEpzb25WYWx1ZShpdGVtKSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICAgICAgLm1hcCgoW2tleSwgZW50cnlWYWx1ZV0pID0+IFtrZXksIHRoaXMuc29ydEpzb25WYWx1ZShlbnRyeVZhbHVlKV0pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHNvcnRlZEVudHJpZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmV3cml0ZUpzb25GaWxlV2l0aFN0YWJsZUtleU9yZGVyKFxuICAgICAgZmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudHMgPSBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHVua25vd247XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLnNvcnRKc29uVmFsdWUocGFyc2VkKTtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZUZpbGVJZkNoYW5nZWQoXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZCwgbnVsbCwgMil9XFxuYFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE1hbmlmZXN0IG1heSBub3QgZXhpc3QgKGUuZy4gbWFuaWZlc3QgZ2VuZXJhdGlvbiBmYWlsZWQpOyBpZ25vcmUuXG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRyYWN0UmVsYXRpdmVJbXBvcnRTcGVjaWZpZXJzKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdEltcG9ydFNwZWNpZmllcnMoc291cmNlKS5maWx0ZXIoKHNwZWNpZmllcikgPT5cbiAgICAgICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3RJbXBvcnRTcGVjaWZpZXJzKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVsYXRpdmVTcGVjaWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBpbXBvcnRQYXR0ZXJucyA9IFtcbiAgICAgICAgL2Zyb21cXHMrWydcIl0oW14nXCJdKylbJ1wiXS9nLFxuICAgICAgICAvaW1wb3J0XFxzK1snXCJdKFteJ1wiXSspWydcIl0vZyxcbiAgICAgICAgL2ltcG9ydFxcKFxccypbJ1wiXShbXidcIl0rKVsnXCJdXFxzKlxcKS9nLFxuICAgICAgICAvcmVxdWlyZVxcKFxccypbJ1wiXShbXidcIl0rKVsnXCJdXFxzKlxcKS9nLFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnRQYXR0ZXJuIG9mIGltcG9ydFBhdHRlcm5zKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoQWxsKGltcG9ydFBhdHRlcm4pKSB7XG4gICAgICAgICAgY29uc3Qgc3BlY2lmaWVyID0gbWF0Y2hbMV07XG4gICAgICAgICAgaWYgKHNwZWNpZmllcikge1xuICAgICAgICAgICAgcmVsYXRpdmVTcGVjaWZpZXJzLmFkZChzcGVjaWZpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShyZWxhdGl2ZVNwZWNpZmllcnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0UmVsYXRpdmVGaWxlbmFtZUZvclN3YyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IHdvcmtpbmdEaXIgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFdvcmtpbmdEaXIgPSB3b3JraW5nRGlyXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZXBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgICAgIC8vIFdpbmRvd3MgZml4OiBVc2UgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uIHRvIHdvcmsgYXJvdW5kIGRyaXZlIGxldHRlciBjYXNpbmcgaXNzdWVzLlxuICAgICAgY29uc3QgbG93ZXJXZCA9IG5vcm1hbGl6ZWRXb3JraW5nRGlyLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBsb3dlclBhdGggPSBub3JtYWxpemVkRmlsZXBhdGgudG9Mb3dlckNhc2UoKTtcblxuICAgICAgbGV0IHJlbGF0aXZlRmlsZW5hbWU6IHN0cmluZztcbiAgICAgIGlmIChsb3dlclBhdGguc3RhcnRzV2l0aChgJHtsb3dlcldkfS9gKSkge1xuICAgICAgICByZWxhdGl2ZUZpbGVuYW1lID0gbm9ybWFsaXplZEZpbGVwYXRoLnN1YnN0cmluZyhcbiAgICAgICAgICBub3JtYWxpemVkV29ya2luZ0Rpci5sZW5ndGggKyAxXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGxvd2VyUGF0aCA9PT0gbG93ZXJXZCkge1xuICAgICAgICByZWxhdGl2ZUZpbGVuYW1lID0gJy4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IHJlbGF0aXZlKHdvcmtpbmdEaXIsIGZpbGVQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGlmIChyZWxhdGl2ZUZpbGVuYW1lLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgICAgY29uc3QgYWxpYXNlZFJlbGF0aXZlUGF0aCA9IGF3YWl0IHJlc29sdmVXb3JrZmxvd0FsaWFzUmVsYXRpdmVQYXRoKFxuICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICB3b3JraW5nRGlyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYWxpYXNlZFJlbGF0aXZlUGF0aCkge1xuICAgICAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IGFsaWFzZWRSZWxhdGl2ZVBhdGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSByZWxhdGl2ZUZpbGVuYW1lXG4gICAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgICAgICAgIC5qb2luKCcvJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWxhdGl2ZUZpbGVuYW1lLmluY2x1ZGVzKCc6JykgfHwgcmVsYXRpdmVGaWxlbmFtZS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IGJhc2VuYW1lKG5vcm1hbGl6ZWRGaWxlcGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWxhdGl2ZUZpbGVuYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzb2x2ZUltcG9ydFRhcmdldFdpdGhFeHRlbnNpb25GYWxsYmFja3MoXG4gICAgICB0YXJnZXRQYXRoOiBzdHJpbmdcbiAgICApOiBzdHJpbmcge1xuICAgICAgaWYgKGV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFBhdGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbk1hdGNoID0gdGFyZ2V0UGF0aC5tYXRjaCgvKFxcLlteLi9cXFxcXSspJC8pO1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uTWF0Y2g/LlsxXT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRQYXRoO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb25GYWxsYmFja3MgPVxuICAgICAgICBleHRlbnNpb24gPT09ICcuanMnXG4gICAgICAgICAgPyBbJy50cycsICcudHN4JywgJy5tdHMnLCAnLmN0cyddXG4gICAgICAgICAgOiBleHRlbnNpb24gPT09ICcubWpzJ1xuICAgICAgICAgICAgPyBbJy5tdHMnXVxuICAgICAgICAgICAgOiBleHRlbnNpb24gPT09ICcuY2pzJ1xuICAgICAgICAgICAgICA/IFsnLmN0cyddXG4gICAgICAgICAgICAgIDogZXh0ZW5zaW9uID09PSAnLmpzeCdcbiAgICAgICAgICAgICAgICA/IFsnLnRzeCddXG4gICAgICAgICAgICAgICAgOiBbXTtcblxuICAgICAgaWYgKGV4dGVuc2lvbkZhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFBhdGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldFdpdGhvdXRFeHRlbnNpb24gPSB0YXJnZXRQYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKTtcbiAgICAgIGZvciAoY29uc3QgZmFsbGJhY2tFeHRlbnNpb24gb2YgZXh0ZW5zaW9uRmFsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IGAke3RhcmdldFdpdGhvdXRFeHRlbnNpb259JHtmYWxsYmFja0V4dGVuc2lvbn1gO1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhmYWxsYmFja1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0UGF0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3VsZFNraXBUcmFuc2l0aXZlU3RlcEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBpc1NvdXJjZUJhY2tlZFBhY2thZ2VQYXRoID1cbiAgICAgICAgdGhpcy5zaG91bGRQcmVmZXJTb3VyY2VCYWNrZWRQYWNrYWdlUGF0aChmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy53ZWxsLWtub3duL3dvcmtmbG93LycpIHx8XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvLm5leHQvJykgfHxcbiAgICAgICAgKCFpc1NvdXJjZUJhY2tlZFBhY2thZ2VQYXRoICYmXG4gICAgICAgICAgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpIHx8XG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy5wbnBtLycpKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlVHJhbnNpdGl2ZVN0ZXBJbXBvcnRUYXJnZXRQYXRoKFxuICAgICAgc291cmNlRmlsZVBhdGg6IHN0cmluZyxcbiAgICAgIHNwZWNpZmllcjogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICBjb25zdCBzcGVjaWZpZXJNYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXihbXj8jXSspKC4qKSQvKTtcbiAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBzcGVjaWZpZXJNYXRjaD8uWzFdID8/IHNwZWNpZmllcjtcblxuICAgICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICBpZiAoaW1wb3J0UGF0aCAhPT0gJ3dvcmtmbG93JyAmJiAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKCdAd29ya2Zsb3cvJykpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID1cbiAgICAgICAgICAgIGNyZWF0ZVJlcXVpcmUoc291cmNlRmlsZVBhdGgpLnJlc29sdmUoaW1wb3J0UGF0aCk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChyZXNvbHZlZFBhdGgpO1xuICAgICAgICAgIGlmICh0aGlzLnNob3VsZFNraXBUcmFuc2l0aXZlU3RlcEZpbGUobm9ybWFsaXplZFJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIGZpbGVTdGF0cy5pc0ZpbGUoKSA/IG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggOiBudWxsO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhYnNvbHV0ZVRhcmdldFBhdGggPSByZXNvbHZlKGRpcm5hbWUoc291cmNlRmlsZVBhdGgpLCBpbXBvcnRQYXRoKTtcblxuICAgICAgY29uc3QgY2FuZGlkYXRlUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgICB0aGlzLnJlc29sdmVJbXBvcnRUYXJnZXRXaXRoRXh0ZW5zaW9uRmFsbGJhY2tzKGFic29sdXRlVGFyZ2V0UGF0aCksXG4gICAgICBdKTtcblxuICAgICAgaWYgKCFleHRuYW1lKGFic29sdXRlVGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uQ2FuZGlkYXRlcyA9IFtcbiAgICAgICAgICAnLnRzJyxcbiAgICAgICAgICAnLnRzeCcsXG4gICAgICAgICAgJy5tdHMnLFxuICAgICAgICAgICcuY3RzJyxcbiAgICAgICAgICAnLmpzJyxcbiAgICAgICAgICAnLmpzeCcsXG4gICAgICAgICAgJy5tanMnLFxuICAgICAgICAgICcuY2pzJyxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb25DYW5kaWRhdGUgb2YgZXh0ZW5zaW9uQ2FuZGlkYXRlcykge1xuICAgICAgICAgIGNhbmRpZGF0ZVBhdGhzLmFkZChgJHthYnNvbHV0ZVRhcmdldFBhdGh9JHtleHRlbnNpb25DYW5kaWRhdGV9YCk7XG4gICAgICAgICAgY2FuZGlkYXRlUGF0aHMuYWRkKFxuICAgICAgICAgICAgam9pbihhYnNvbHV0ZVRhcmdldFBhdGgsIGBpbmRleCR7ZXh0ZW5zaW9uQ2FuZGlkYXRlfWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVBhdGggb2YgY2FuZGlkYXRlUGF0aHMpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID1cbiAgICAgICAgICB0aGlzLnJlc29sdmVJbXBvcnRUYXJnZXRXaXRoRXh0ZW5zaW9uRmFsbGJhY2tzKGNhbmRpZGF0ZVBhdGgpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoID1cbiAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChyZXNvbHZlZFBhdGgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNob3VsZFNraXBUcmFuc2l0aXZlU3RlcEZpbGUobm9ybWFsaXplZFJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgc3RhdChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICBpZiAoZmlsZVN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFJlc29sdmVkUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFRyeSB0aGUgbmV4dCBjYW5kaWRhdGUgcGF0aC5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbGxlY3RUcmFuc2l0aXZlU3RlcEZpbGVzKHtcbiAgICAgIGVudHJ5RmlsZXMsXG4gICAgICBzdGVwRmlsZXMsXG4gICAgfToge1xuICAgICAgZW50cnlGaWxlczogc3RyaW5nW107XG4gICAgICBzdGVwRmlsZXM6IHN0cmluZ1tdO1xuICAgIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRW50cnlGaWxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIG5ldyBTZXQoXG4gICAgICAgICAgZW50cnlGaWxlcy5tYXAoKGVudHJ5RmlsZSkgPT5cbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplRGlzY292ZXJlZEZpbGVQYXRoKGVudHJ5RmlsZSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc29ydCgpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFN0ZXBTZWVkRmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgIHN0ZXBGaWxlcy5tYXAoKHN0ZXBGaWxlKSA9PlxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoc3RlcEZpbGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNvcnQoKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyZWRTdGVwRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4obm9ybWFsaXplZFN0ZXBTZWVkRmlsZXMpO1xuICAgICAgY29uc3QgcXVldWVkRmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFsuLi5ub3JtYWxpemVkRW50cnlGaWxlcywgLi4ubm9ybWFsaXplZFN0ZXBTZWVkRmlsZXNdKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZpc2l0ZWRGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcbiAgICAgIGNvbnN0IHBhdHRlcm5DYWNoZSA9IG5ldyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucz4gfCBudWxsXG4gICAgICA+KCk7XG5cbiAgICAgIGNvbnN0IGdldFNvdXJjZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgICAgIGlmIChzb3VyY2VDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlLmdldChmaWxlUGF0aCkgPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBzb3VyY2VDYWNoZS5zZXQoZmlsZVBhdGgsIHNvdXJjZSk7XG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgc291cmNlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0UGF0dGVybnMgPSBhc3luYyAoXG4gICAgICAgIGZpbGVQYXRoOiBzdHJpbmdcbiAgICAgICk6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucz4gfCBudWxsPiA9PiB7XG4gICAgICAgIGlmIChwYXR0ZXJuQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBwYXR0ZXJuQ2FjaGUuZ2V0KGZpbGVQYXRoKSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGdldFNvdXJjZShmaWxlUGF0aCk7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICBwYXR0ZXJuQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICAgICAgcGF0dGVybkNhY2hlLnNldChmaWxlUGF0aCwgcGF0dGVybnMpO1xuICAgICAgICByZXR1cm4gcGF0dGVybnM7XG4gICAgICB9O1xuXG4gICAgICB3aGlsZSAocXVldWVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IHF1ZXVlZEZpbGVzLnBvcCgpO1xuICAgICAgICBpZiAoIWN1cnJlbnRGaWxlIHx8IHZpc2l0ZWRGaWxlcy5oYXMoY3VycmVudEZpbGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRlZEZpbGVzLmFkZChjdXJyZW50RmlsZSk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZSA9IGF3YWl0IGdldFNvdXJjZShjdXJyZW50RmlsZSk7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbXBvcnRTcGVjaWZpZXJzID0gdGhpcy5leHRyYWN0SW1wb3J0U3BlY2lmaWVycyhjdXJyZW50U291cmNlKTtcbiAgICAgICAgZm9yIChjb25zdCBzcGVjaWZpZXIgb2YgaW1wb3J0U3BlY2lmaWVycykge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkSW1wb3J0UGF0aCA9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVUcmFuc2l0aXZlU3RlcEltcG9ydFRhcmdldFBhdGgoXG4gICAgICAgICAgICAgIGN1cnJlbnRGaWxlLFxuICAgICAgICAgICAgICBzcGVjaWZpZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZEltcG9ydFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdmlzaXRlZEZpbGVzLmhhcyhyZXNvbHZlZEltcG9ydFBhdGgpKSB7XG4gICAgICAgICAgICBxdWV1ZWRGaWxlcy5wdXNoKHJlc29sdmVkSW1wb3J0UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW1wb3J0UGF0dGVybnMgPSBhd2FpdCBnZXRQYXR0ZXJucyhyZXNvbHZlZEltcG9ydFBhdGgpO1xuICAgICAgICAgIGlmIChpbXBvcnRQYXR0ZXJucz8uaGFzVXNlU3RlcCkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFN0ZXBGaWxlcy5hZGQocmVzb2x2ZWRJbXBvcnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oZGlzY292ZXJlZFN0ZXBGaWxlcykuc29ydCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29sbGVjdFRyYW5zaXRpdmVTZXJkZUZpbGVzKHtcbiAgICAgIGVudHJ5RmlsZXMsXG4gICAgICBzZXJkZUZpbGVzLFxuICAgIH06IHtcbiAgICAgIGVudHJ5RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgc2VyZGVGaWxlczogc3RyaW5nW107XG4gICAgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyeUZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICBlbnRyeUZpbGVzLm1hcCgoZW50cnlGaWxlKSA9PlxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEaXNjb3ZlcmVkRmlsZVBhdGgoZW50cnlGaWxlKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKS5zb3J0KCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkU2VyZGVTZWVkRmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgIHNlcmRlRmlsZXMubWFwKChzZXJkZUZpbGUpID0+XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURpc2NvdmVyZWRGaWxlUGF0aChzZXJkZUZpbGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNvcnQoKTtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgcmUtdmFsaWRhdGUgc2VyZGUgc2VlZHMgYWdhaW5zdCBzb3VyY2UgcGF0dGVybnMuXG4gICAgICAvLyBUaGlzIGtlZXBzIHByZXZpb3VzbHkgZGlzY292ZXJlZC9tYW51YWwgc2VlZCBlbnRyaWVzIGZyb20gc3RpY2tpbmcgd2hlblxuICAgICAgLy8gZmlsZXMgbm8gbG9uZ2VyIG1hdGNoIHNlcmRlIHBhdHRlcm5zLlxuICAgICAgY29uc3QgZGlzY292ZXJlZFNlcmRlRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHF1ZXVlZEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChbLi4ubm9ybWFsaXplZEVudHJ5RmlsZXMsIC4uLm5vcm1hbGl6ZWRTZXJkZVNlZWRGaWxlc10pXG4gICAgICApO1xuICAgICAgY29uc3QgdmlzaXRlZEZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuICAgICAgY29uc3QgcGF0dGVybkNhY2hlID0gbmV3IE1hcDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zPiB8IG51bGxcbiAgICAgID4oKTtcblxuICAgICAgY29uc3QgZ2V0U291cmNlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUuZ2V0KGZpbGVQYXRoKSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIHNvdXJjZUNhY2hlLnNldChmaWxlUGF0aCwgc291cmNlKTtcbiAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBzb3VyY2VDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBnZXRQYXR0ZXJucyA9IGFzeW5jIChcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZ1xuICAgICAgKTogUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zPiB8IG51bGw+ID0+IHtcbiAgICAgICAgaWYgKHBhdHRlcm5DYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdHRlcm5DYWNoZS5nZXQoZmlsZVBhdGgpID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgZ2V0U291cmNlKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHBhdHRlcm5DYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICBwYXR0ZXJuQ2FjaGUuc2V0KGZpbGVQYXRoLCBwYXR0ZXJucyk7XG4gICAgICAgIHJldHVybiBwYXR0ZXJucztcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc2VyZGVTZWVkRmlsZSBvZiBub3JtYWxpemVkU2VyZGVTZWVkRmlsZXMpIHtcbiAgICAgICAgY29uc3Qgc2VlZFBhdHRlcm5zID0gYXdhaXQgZ2V0UGF0dGVybnMoc2VyZGVTZWVkRmlsZSk7XG4gICAgICAgIGlmIChzZWVkUGF0dGVybnM/Lmhhc1NlcmRlKSB7XG4gICAgICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXMuYWRkKHNlcmRlU2VlZEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChxdWV1ZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gcXVldWVkRmlsZXMucG9wKCk7XG4gICAgICAgIGlmICghY3VycmVudEZpbGUgfHwgdmlzaXRlZEZpbGVzLmhhcyhjdXJyZW50RmlsZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkRmlsZXMuYWRkKGN1cnJlbnRGaWxlKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50U291cmNlID0gYXdhaXQgZ2V0U291cmNlKGN1cnJlbnRGaWxlKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlSW1wb3J0U3BlY2lmaWVycyA9XG4gICAgICAgICAgdGhpcy5leHRyYWN0UmVsYXRpdmVJbXBvcnRTcGVjaWZpZXJzKGN1cnJlbnRTb3VyY2UpO1xuICAgICAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiByZWxhdGl2ZUltcG9ydFNwZWNpZmllcnMpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZEltcG9ydFBhdGggPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlVHJhbnNpdGl2ZVN0ZXBJbXBvcnRUYXJnZXRQYXRoKFxuICAgICAgICAgICAgICBjdXJyZW50RmlsZSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmICghcmVzb2x2ZWRJbXBvcnRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXZpc2l0ZWRGaWxlcy5oYXMocmVzb2x2ZWRJbXBvcnRQYXRoKSkge1xuICAgICAgICAgICAgcXVldWVkRmlsZXMucHVzaChyZXNvbHZlZEltcG9ydFBhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGltcG9ydFBhdHRlcm5zID0gYXdhaXQgZ2V0UGF0dGVybnMocmVzb2x2ZWRJbXBvcnRQYXRoKTtcbiAgICAgICAgICBpZiAoaW1wb3J0UGF0dGVybnM/Lmhhc1NlcmRlKSB7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlcy5hZGQocmVzb2x2ZWRJbXBvcnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQVNULWxldmVsIHZlcmlmaWNhdGlvbjogcnVuIFNXQyBkZXRlY3QgbW9kZSBvbiByZWdleC1tYXRjaGVkIGNhbmRpZGF0ZXNcbiAgICAgIC8vIHRvIGNvbmZpcm0gdGhleSBhY3R1YWxseSBkZWZpbmUgc2VyZGUgY2xhc3Nlcy4gVGhpcyBwcmV2ZW50cyBTREsgaW50ZXJuYWxcbiAgICAgIC8vIGZpbGVzICh3aGljaCBtYXRjaCBzZXJkZSByZWdleCBwYXR0ZXJucyBidXQgZGVmaW5lIG5vIGNsYXNzZXMpIGZyb20gYmVpbmdcbiAgICAgIC8vIGJ1bmRsZWQgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveC5cbiAgICAgIGNvbnN0IHByb2plY3RSb290ID0gdGhpcy5jb25maWcucHJvamVjdFJvb3QgfHwgdGhpcy5jb25maWcud29ya2luZ0RpcjtcbiAgICAgIGNvbnN0IHZlcmlmaWVkU2VyZGVGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBBcnJheS5mcm9tKGRpc2NvdmVyZWRTZXJkZUZpbGVzKS5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgZ2V0U291cmNlKGZpbGVQYXRoKTtcbiAgICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGl2ZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRSZWxhdGl2ZUZpbGVuYW1lRm9yU3djKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgd29ya2Zsb3dNYW5pZmVzdCB9ID0gYXdhaXQgYXBwbHlTd2NUcmFuc2Zvcm0oXG4gICAgICAgICAgICAgIHJlbGF0aXZlRmlsZW5hbWUsXG4gICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgJ2RldGVjdCcsXG4gICAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gT25seSBpbmNsdWRlIGZpbGVzIHRoYXQgYWN0dWFsbHkgZGVmaW5lIHNlcmRlIGNsYXNzZXNcbiAgICAgICAgICAgIGNvbnN0IGhhc0NsYXNzZXMgPVxuICAgICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMgJiZcbiAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMpLnNvbWUoXG4gICAgICAgICAgICAgICAgKGVudHJpZXMpID0+IE9iamVjdC5rZXlzKGVudHJpZXMpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChoYXNDbGFzc2VzKSB7XG4gICAgICAgICAgICAgIHZlcmlmaWVkU2VyZGVGaWxlcy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIElmIGRldGVjdCBmYWlscywgaW5jbHVkZSB0aGUgZmlsZSB0byBiZSBzYWZlXG4gICAgICAgICAgICB2ZXJpZmllZFNlcmRlRmlsZXMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHZlcmlmaWVkU2VyZGVGaWxlcy5zb3J0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFdlYmhvb2tSb3V0ZSh7XG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgIHJvdXRlRmlsZU5hbWUgPSAncm91dGUuanMnLFxuICAgIH06IHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyOiBzdHJpbmc7XG4gICAgICByb3V0ZUZpbGVOYW1lPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHdlYmhvb2tSb3V0ZUZpbGUgPSBqb2luKFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgYHdlYmhvb2svW3Rva2VuXS8ke3JvdXRlRmlsZU5hbWV9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICAgIG91dGZpbGU6IHdlYmhvb2tSb3V0ZUZpbGUsXG4gICAgICAgIGJ1bmRsZTogZmFsc2UsIC8vIE5leHQuanMgZG9lc24ndCBuZWVkIGJ1bmRsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmRBcHBEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGFwcERpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ2FwcCcpO1xuICAgICAgY29uc3Qgc3JjQXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnc3JjL2FwcCcpO1xuICAgICAgY29uc3QgcGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdwYWdlcycpO1xuICAgICAgY29uc3Qgc3JjUGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvcGFnZXMnKTtcblxuICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXRoKTtcbiAgICAgICAgICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeTogJHtwYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdub3QgYSBkaXJlY3RvcnknKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBpZiBhcHAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KGFwcERpcikpIHtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3JjL2FwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3Rvcnkoc3JjQXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBhcHAgZGlyZWN0b3J5IGV4aXN0cywgY2hlY2sgZm9yIHBhZ2VzIGRpcmVjdG9yeSBhbmQgY3JlYXRlIGFwcCBuZXh0IHRvIGl0XG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkocGFnZXNEaXIpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhcHAgZGlyZWN0b3J5IG5leHQgdG8gcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKGFwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNQYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHNyYy9hcHAgZGlyZWN0b3J5IG5leHQgdG8gc3JjL3BhZ2VzIGRpcmVjdG9yeVxuICAgICAgICBhd2FpdCBta2RpcihzcmNBcHBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZmluZCBOZXh0LmpzIGFwcCBvciBwYWdlcyBkaXJlY3RvcnkuIEV4cGVjdGVkIG9uZSBvZjogXCJhcHBcIiwgXCJzcmMvYXBwXCIsIFwicGFnZXNcIiwgb3IgXCJzcmMvcGFnZXNcIiB0byBleGlzdC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIENhY2hlZE5leHRCdWlsZGVyRGVmZXJyZWQgPSBOZXh0RGVmZXJyZWRCdWlsZGVyO1xuICByZXR1cm4gTmV4dERlZmVycmVkQnVpbGRlcjtcbn1cbiJdfQ==