@tscircuit/eval 0.0.487 → 0.0.489

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.
@@ -449,10 +449,9 @@ function resolveWithBaseUrl(opts) {
449
449
  const baseUrl = tsConfig?.compilerOptions?.baseUrl;
450
450
  if (!baseUrl) return null;
451
451
  const baseDir = tsconfigDir || ".";
452
- const filePathToResolve = `${baseDir}/${baseUrl}/${importPath}`.replace(
453
- /\/\//g,
454
- "/"
455
- );
452
+ let filePathToResolve = `${baseDir}/${baseUrl}/${importPath}`;
453
+ filePathToResolve = filePathToResolve.replace(/\/+/g, "/");
454
+ filePathToResolve = filePathToResolve.replace(/\/\.\//g, "/");
456
455
  const normalizedFilePath = normalizeFilePath(filePathToResolve);
457
456
  if (normalizedFilePathMap.has(normalizedFilePath)) {
458
457
  return normalizedFilePathMap.get(normalizedFilePath);
@@ -510,8 +509,12 @@ function resolveRelativePath(importPath, cwd) {
510
509
  }
511
510
 
512
511
  // lib/runner/resolveFilePath.ts
512
+ var FILE_EXTENSIONS = ["tsx", "ts", "json", "js", "jsx", "obj", "gltf", "glb"];
513
513
  var resolveFilePath = (unknownFilePath, fsMapOrAllFilePaths, cwd, opts = {}) => {
514
- const resolvedPath = cwd ? resolveRelativePath(unknownFilePath, cwd) : unknownFilePath;
514
+ const tsConfig = opts.tsConfig ?? null;
515
+ const isRelativeImport = unknownFilePath.startsWith("./") || unknownFilePath.startsWith("../");
516
+ const hasBaseUrl = !!tsConfig?.compilerOptions?.baseUrl;
517
+ const resolvedPath = cwd && (isRelativeImport || !hasBaseUrl) ? resolveRelativePath(unknownFilePath, cwd) : unknownFilePath;
515
518
  const filePaths = new Set(
516
519
  Array.isArray(fsMapOrAllFilePaths) ? fsMapOrAllFilePaths : Object.keys(fsMapOrAllFilePaths)
517
520
  );
@@ -523,22 +526,22 @@ var resolveFilePath = (unknownFilePath, fsMapOrAllFilePaths, cwd, opts = {}) =>
523
526
  normalizedFilePathMap.set(normalizeFilePath(filePath), filePath);
524
527
  }
525
528
  const normalizedResolvedPath = normalizeFilePath(resolvedPath);
526
- if (normalizedFilePathMap.has(normalizedResolvedPath)) {
527
- return normalizedFilePathMap.get(normalizedResolvedPath);
528
- }
529
- const extension = ["tsx", "ts", "json", "js", "jsx", "obj", "gltf", "glb"];
530
- for (const ext of extension) {
531
- const possibleFilePath = `${normalizedResolvedPath}.${ext}`;
532
- if (normalizedFilePathMap.has(possibleFilePath)) {
533
- return normalizedFilePathMap.get(possibleFilePath);
529
+ if (isRelativeImport || !hasBaseUrl) {
530
+ if (normalizedFilePathMap.has(normalizedResolvedPath)) {
531
+ return normalizedFilePathMap.get(normalizedResolvedPath);
532
+ }
533
+ for (const ext of FILE_EXTENSIONS) {
534
+ const possibleFilePath = `${normalizedResolvedPath}.${ext}`;
535
+ if (normalizedFilePathMap.has(possibleFilePath)) {
536
+ return normalizedFilePathMap.get(possibleFilePath);
537
+ }
534
538
  }
535
539
  }
536
- const tsConfig = opts.tsConfig ?? null;
537
- if (!unknownFilePath.startsWith("./") && !unknownFilePath.startsWith("../")) {
540
+ if (!isRelativeImport) {
538
541
  const resolvedPathFromPaths = resolveWithTsconfigPaths({
539
542
  importPath: unknownFilePath,
540
543
  normalizedFilePathMap,
541
- extensions: extension,
544
+ extensions: FILE_EXTENSIONS,
542
545
  tsConfig,
543
546
  tsconfigDir: opts.tsconfigDir
544
547
  });
@@ -546,18 +549,18 @@ var resolveFilePath = (unknownFilePath, fsMapOrAllFilePaths, cwd, opts = {}) =>
546
549
  const resolvedPathFromBaseUrl = resolveWithBaseUrl({
547
550
  importPath: unknownFilePath,
548
551
  normalizedFilePathMap,
549
- extensions: extension,
552
+ extensions: FILE_EXTENSIONS,
550
553
  tsConfig,
551
554
  tsconfigDir: opts.tsconfigDir
552
555
  });
553
556
  if (resolvedPathFromBaseUrl) return resolvedPathFromBaseUrl;
554
557
  }
555
- if (!unknownFilePath.startsWith("./") && !unknownFilePath.startsWith("../")) {
558
+ if (!isRelativeImport && !hasBaseUrl) {
556
559
  const normalizedUnknownFilePath = normalizeFilePath(unknownFilePath);
557
560
  if (normalizedFilePathMap.has(normalizedUnknownFilePath)) {
558
561
  return normalizedFilePathMap.get(normalizedUnknownFilePath);
559
562
  }
560
- for (const ext of extension) {
563
+ for (const ext of FILE_EXTENSIONS) {
561
564
  const possibleFilePath = `${normalizedUnknownFilePath}.${ext}`;
562
565
  if (normalizedFilePathMap.has(possibleFilePath)) {
563
566
  return normalizedFilePathMap.get(possibleFilePath);
@@ -1515,4 +1518,4 @@ export {
1515
1518
  runTscircuitCode,
1516
1519
  runTscircuitModule
1517
1520
  };
1518
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cC50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0TWF0aFV0aWxzIGZyb20gXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcImxpYi9nZXRQbGF0Zm9ybUNvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnIH0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGlmIChwbGF0Zm9ybS5wYXJ0c0VuZ2luZURpc2FibGVkKSB7XG4gICAgcGxhdGZvcm0ucGFydHNFbmdpbmUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICAvLyBSZXNvbHZlIGJhc2VVcmwgcmVsYXRpdmUgdG8gdHNjb25maWcgbG9jYXRpb25cbiAgY29uc3QgYmFzZURpciA9IHRzY29uZmlnRGlyIHx8IFwiLlwiXG4gIGNvbnN0IGZpbGVQYXRoVG9SZXNvbHZlID0gYCR7YmFzZURpcn0vJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YC5yZXBsYWNlKFxuICAgIC9cXC9cXC8vZyxcbiAgICBcIi9cIixcbiAgKVxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB0eXBlIHtcbiAgQ2lyY3VpdFJ1bm5lckFwaSxcbiAgQ2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG59IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBjcmVhdGVFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4uLy4uL3dlYndvcmtlci9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBub3JtYWxpemVGc01hcCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGdldFRzQ29uZmlnIH0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwid2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkIH0gZnJvbSBcIi4vc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCJcbmltcG9ydCB7IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciB9IGZyb20gXCJsaWIvdXRpbHMvZW5oYW5jZS1yb290LWNpcmN1aXQtZXJyb3JcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBzZXRWYWx1ZUF0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL29iai1wYXRoXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpDaXJjdWl0UnVubmVyXCIpXG5cbmV4cG9ydCBjbGFzcyBDaXJjdWl0UnVubmVyIGltcGxlbWVudHMgQ2lyY3VpdFJ1bm5lckFwaSB7XG4gIF9leGVjdXRpb25Db250ZXh0OiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVFeGVjdXRpb25Db250ZXh0PiB8IG51bGwgPSBudWxsXG4gIF9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbjogQ2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24gPSB7XG4gICAgc25pcHBldHNBcGlCYXNlVXJsOiBcImh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb21cIixcbiAgICBjanNSZWdpc3RyeVVybDogXCJodHRwczovL2Nqcy50c2NpcmN1aXQuY29tXCIsXG4gICAgdmVyYm9zZTogZmFsc2UsXG4gIH1cbiAgX2V2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCAoKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKVtdPiA9IHt9XG4gIF9kZWJ1Z05hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogUGFydGlhbDxDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbj4gPSB7fSkge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pXG4gIH1cblxuICBhc3luYyB2ZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFwiMC4wLjBcIlxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVdpdGhGc01hcChvZ09wdHM6IHtcbiAgICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICAgIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9wdHMgPSB7IC4uLm9nT3B0cyB9XG5cbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgRGVidWcuZW5hYmxlKFwidHNjaTpldmFsOipcIilcbiAgICB9XG5cbiAgICBkZWJ1ZyhcImV4ZWN1dGVXaXRoRnNNYXAgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICAgIGZzTWFwS2V5czogT2JqZWN0LmtleXMob3B0cy5mc01hcCksXG4gICAgICBuYW1lOiBvcHRzLm5hbWUsXG4gICAgfSlcblxuICAgIHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZChvcHRzKVxuXG4gICAgZGVidWcoXCJlbnRyeXBvaW50IGFmdGVyIHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgIH0pXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICBuYW1lOiBvcHRzLm5hbWUsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCFcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwID0gbm9ybWFsaXplRnNNYXAob3B0cy5mc01hcClcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbb3B0cy5lbnRyeXBvaW50IV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50cnlwb2ludCBcIiR7b3B0cy5lbnRyeXBvaW50fVwiIG5vdCBmb3VuZGApXG4gICAgfVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhLnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBvcHRzLmVudHJ5cG9pbnRcbiAgICAgIDogYC4vJHtvcHRzLmVudHJ5cG9pbnR9YFxuXG4gICAgZGVidWcoXCJmaW5hbCBlbnRyeXBvaW50OlwiLCBlbnRyeXBvaW50KVxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGVudHJ5cG9pbnQhLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShjb2RlOiBzdHJpbmcsIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiW0NpcmN1aXRSdW5uZXJdIGV4ZWN1dGUgY2FsbGVkIHdpdGggY29kZSBsZW5ndGg6XCIsXG4gICAgICAgIGNvZGUubGVuZ3RoLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW1wiZW50cnlwb2ludC50c3hcIl0gPSBjb2RlXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoXCIuL2VudHJ5cG9pbnQudHN4XCIsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlQ29tcG9uZW50KGNvbXBvbmVudDogYW55LCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW0NpcmN1aXRSdW5uZXJdIGV4ZWN1dGVDb21wb25lbnQgY2FsbGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gbnVsbFxuXG4gICAgY29uc3QgZWxlbWVudCA9IHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiA/IGNvbXBvbmVudCgpIDogY29tcG9uZW50XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LmFkZChlbGVtZW50IGFzIGFueSlcbiAgfVxuXG4gIG9uKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0gPz89IFtdXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGNhbGxiYWNrKVxuICB9XG5cbiAgYXN5bmMgcmVuZGVyVW50aWxTZXR0bGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2lyY3VpdCBoYXMgYmVlbiBjcmVhdGVkXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQucmVuZGVyVW50aWxTZXR0bGVkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENpcmN1aXRKc29uKCk6IFByb21pc2U8QW55Q2lyY3VpdEVsZW1lbnRbXT4ge1xuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2lyY3VpdCBoYXMgYmVlbiBjcmVhdGVkXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LmdldENpcmN1aXRKc29uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQpIHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcj86IChldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pID0+IHZvaWRcbiAgICAgICAgICB9XG4gICAgICAgICAgY2lyY3VpdC5yZW1vdmVMaXN0ZW5lcj8uKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCkge1xuICAgIC8vIENsZWFudXAgcmVzb3VyY2VzXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGFzeW5jIHNldFNuaXBwZXRzQXBpQmFzZVVybChiYXNlVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwgPSBiYXNlVXJsXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZyhwbGF0Zm9ybTogUGxhdGZvcm1Db25maWcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwcm9wZXJ0eSwgdmFsdWUpXG4gIH1cblxuICBhc3luYyBzZXRQcm9qZWN0Q29uZmlnKHByb2plY3Q6IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+KSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyA9IHByb2plY3RcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWdQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgcHJvcGVydHksXG4gICAgICB2YWx1ZSxcbiAgICApXG4gIH1cblxuICBhc3luYyBlbmFibGVEZWJ1ZyhuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHRoaXMuX2RlYnVnTmFtZXNwYWNlID0gbmFtZXNwYWNlXG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgYW55XG4gICAgICBjaXJjdWl0LmVuYWJsZURlYnVnPy4obmFtZXNwYWNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRFdmVudExpc3RlbmVycyhjaXJjdWl0OiBSb290Q2lyY3VpdCkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIGNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBsaXN0ZW5lciBhcyBhbnkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZVBhdGggfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGhcIlxuaW1wb3J0IHtcbiAgcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzLFxuICB0eXBlIFRzQ29uZmlnLFxuICByZXNvbHZlV2l0aEJhc2VVcmwsXG59IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IGN3ZFxuICAgID8gcmVzb2x2ZVJlbGF0aXZlUGF0aCh1bmtub3duRmlsZVBhdGgsIGN3ZClcbiAgICA6IHVua25vd25GaWxlUGF0aFxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IG5ldyBTZXQoXG4gICAgQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKVxuICAgICAgPyBmc01hcE9yQWxsRmlsZVBhdGhzXG4gICAgICA6IE9iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLFxuICApXG5cbiAgaWYgKGZpbGVQYXRocy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiByZXNvbHZlZFBhdGhcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAuc2V0KG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoKSwgZmlsZVBhdGgpXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgocmVzb2x2ZWRQYXRoKVxuXG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gIH1cblxuICAvLyBTZWFyY2ggZm9yIGZpbGUgd2l0aCBhIHNldCBvZiBkaWZmZXJlbnQgZXh0ZW5zaW9uc1xuICBjb25zdCBleHRlbnNpb24gPSBbXCJ0c3hcIiwgXCJ0c1wiLCBcImpzb25cIiwgXCJqc1wiLCBcImpzeFwiLCBcIm9ialwiLCBcImdsdGZcIiwgXCJnbGJcIl1cbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9uKSB7XG4gICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRSZXNvbHZlZFBhdGh9LiR7ZXh0fWBcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQocG9zc2libGVGaWxlUGF0aCkhXG4gICAgfVxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyB1c2luZyB0c2NvbmZpZyBcInBhdGhzXCIgbWFwcGluZyB3aGVuIHRoZSBpbXBvcnQgaXMgbm9uLXJlbGF0aXZlXG4gIGNvbnN0IHRzQ29uZmlnID0gb3B0cy50c0NvbmZpZyA/PyBudWxsXG5cbiAgaWYgKCF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpICYmICF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aEZyb21QYXRocyA9IHJlc29sdmVXaXRoVHNjb25maWdQYXRocyh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb24sXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21QYXRocykgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21QYXRoc1xuXG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwgPSByZXNvbHZlV2l0aEJhc2VVcmwoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9uLFxuICAgICAgdHNDb25maWcsXG4gICAgICB0c2NvbmZpZ0Rpcjogb3B0cy50c2NvbmZpZ0RpcixcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG4gIH1cblxuICAvLyBDaGVjayBpZiBpdCdzIGFuIGFic29sdXRlIGltcG9ydFxuICBpZiAoIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIHVua25vd25GaWxlUGF0aCxcbiAgICBmc01hcE9yQWxsRmlsZVBhdGhzLFxuICAgIGN3ZCxcbiAgICBvcHRzLFxuICApXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IG1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmltcG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OnR5cGVcXHMrKT8oPzpcXCpcXHMrYXNcXHMrW1xcdyRdK3xcXCp8XFx7W159XStcXH0pXFxzK2Zyb21cXHMqWydcIl0oLis/KVsnXCJdL2dtXG4gIGxldCByZUV4cG9ydE1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgocmVFeHBvcnRNYXRjaCA9IHJlRXhwb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSByZUV4cG9ydE1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmV4cG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcbiAgICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gdHJhbnNmb3JtIHRoZW1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgIHRyYW5zZm9ybVdpdGhTdWNyYXNlKGZpbGVDb250ZW50LCBmc1BhdGgpLFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICkuZXhwb3J0c1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbiBcIiR7ZnNQYXRoLnNwbGl0KFwiLlwiKS5wb3AoKX1cIiBmb3IgXCIke2ZzUGF0aH1cImAsXG4gICAgICApXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGltcG9ydFN0YWNrLnBvcCgpXG4gICAgY3VycmVudGx5SW1wb3J0aW5nLmRlbGV0ZShmc1BhdGgpXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMgPSBbXG4gIFwiLmdsYlwiLFxuICBcIi5raWNhZF9tb2RcIixcbiAgXCIuZ2x0ZlwiLFxuICBcIi5vYmpcIixcbiAgXCIuc3RsXCIsXG5dXG5cbmV4cG9ydCBjb25zdCBpc1N0YXRpY0Fzc2V0UGF0aCA9IChwYXRoOiBzdHJpbmcpID0+XG4gIFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT4gcGF0aC5lbmRzV2l0aChleHQpKVxuIiwgImltcG9ydCB7IHRyYW5zZm9ybSwgdHlwZSBUcmFuc2Zvcm0gYXMgU3VjcmFzZVRyYW5zZm9ybSB9IGZyb20gXCJzdWNyYXNlXCJcblxuY29uc3QgVFNfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzXCIsIFwiLnRzeFwiLCBcIi5tdHNcIiwgXCIuY3RzXCJdKVxuY29uc3QgSlNYX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c3hcIiwgXCIuanN4XCIsIFwiLnRzXCJdKVxuY29uc3QgVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCA9XG4gIC9eXFxzKmV4cG9ydFxccyt0eXBlXFxzK1xcKlxccysoPzphc1xccytbXFx3JF0rXFxzKyk/ZnJvbVxccytbJ1wiXVteJ1wiXStbJ1wiXVxccyo7P1xccyokL2dpbVxuXG5jb25zdCBzdHJpcFR5cGVTdGFyRXhwb3J0cyA9IChjb2RlOiBzdHJpbmcpID0+XG4gIGNvZGUucmVwbGFjZShUWVBFX1NUQVJfRVhQT1JUX1JFR0VYLCBcIlwiKVxuXG5jb25zdCBzdHJpcFF1ZXJ5QW5kSGFzaCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiP1wiKVxuICBjb25zdCBoYXNoSW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiI1wiKVxuXG4gIGxldCBlbmRJbmRleCA9IGZpbGVQYXRoLmxlbmd0aFxuXG4gIGlmIChxdWVyeUluZGV4ICE9PSAtMSAmJiBoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBNYXRoLm1pbihxdWVyeUluZGV4LCBoYXNoSW5kZXgpXG4gIH0gZWxzZSBpZiAocXVlcnlJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IHF1ZXJ5SW5kZXhcbiAgfSBlbHNlIGlmIChoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBoYXNoSW5kZXhcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5zbGljZSgwLCBlbmRJbmRleClcbn1cblxuY29uc3QgZ2V0RXh0ZW5zaW9uID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBzdHJpcFF1ZXJ5QW5kSGFzaChmaWxlUGF0aClcbiAgY29uc3QgbGFzdERvdEluZGV4ID0gbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIuXCIpXG5cbiAgaWYgKGxhc3REb3RJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi9cIiksXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCJcXFxcXCIpLFxuICApXG5cbiAgaWYgKGxhc3RTbGFzaEluZGV4ID4gbGFzdERvdEluZGV4KSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkUGF0aC5zbGljZShsYXN0RG90SW5kZXgpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGVQYXRoKVxuXG4gIGNvbnN0IHRyYW5zZm9ybXM6IFN1Y3Jhc2VUcmFuc2Zvcm1bXSA9IFtcImltcG9ydHNcIl1cblxuICBpZiAoVFNfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMudW5zaGlmdChcInR5cGVzY3JpcHRcIilcbiAgfVxuXG4gIGlmIChKU1hfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMucHVzaChcImpzeFwiKVxuICB9XG5cbiAgcmV0dXJuIHRyYW5zZm9ybXNcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVdpdGhTdWNyYXNlID0gKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1zID0gZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoKGZpbGVQYXRoKVxuICBjb25zdCBzYW5pdGl6ZWRDb2RlID0gc3RyaXBUeXBlU3RhckV4cG9ydHMoY29kZSlcbiAgY29uc3QgeyBjb2RlOiB0cmFuc2Zvcm1lZENvZGUgfSA9IHRyYW5zZm9ybShzYW5pdGl6ZWRDb2RlLCB7XG4gICAgZmlsZVBhdGgsXG4gICAgcHJvZHVjdGlvbjogdHJ1ZSxcbiAgICB0cmFuc2Zvcm1zLFxuICB9KVxuXG4gIHJldHVybiB0cmFuc2Zvcm1lZENvZGVcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0U25pcHBldChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG4gIGNvbnN0IGZ1bGxTbmlwcGV0TmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5yZXBsYWNlKFwiLlwiLCBcIi9cIilcblxuICBjb25zdCB7IGNqcywgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+ICh7IGNqczogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfSkpXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY2pzOiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgY2pzISxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICApLmV4cG9ydHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgc25pcHBldFwiLCBlKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbn1cblxuaW50ZXJmYWNlIE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIGJhc2VQYXRoOiBzdHJpbmdcbiAgbW9kdWxlUGF0aDogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGZzTWFwLFxuICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc3hcIiwgXCIudHNcIiwgXCIudHN4XCIsIFwiLmpzb25cIl0sXG4gICAgYmFzZVBhdGgsXG4gICAgbW9kdWxlUGF0aCxcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vcGFja2FnZS5qc29uYFxuICBpZiAoIWN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSBhcyBQYWNrYWdlSnNvblxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhcbiAgcGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY3R4LmZzTWFwW3BhdGhdKSByZXR1cm4gcGF0aFxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgcGF0aFdpdGhFeHQgPSBwYXRoLnJlcGxhY2UoL1xcLmpzJHxcXC5qc3gkLywgXCJcIikgKyBleHRcbiAgICBpZiAoY3R4LmZzTWFwW3BhdGhXaXRoRXh0XSkgcmV0dXJuIHBhdGhXaXRoRXh0XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFBhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBleHBvcnRQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZ1bGxFeHBvcnRQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2V4cG9ydFBhdGgucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWBcbiAgcmV0dXJuIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsRXhwb3J0UGF0aCwgY3R4KVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHJlbWFpbmluZ1BhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFwYWNrYWdlSnNvbi5leHBvcnRzKSByZXR1cm4gbnVsbFxuXG4gIC8vIEhhbmRsZSBkZWZhdWx0IGV4cG9ydCBjb25kaXRpb25cbiAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCIuXCJdXG4gIGlmIChyZW1haW5pbmdQYXRoID09PSBcIlwiICYmIGRlZmF1bHRFeHBvcnQpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRFeHBvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBkZWZhdWx0RXhwb3J0LCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGV4cG9ydHNcbiAgY29uc3Qgc3VicGF0aEV4cG9ydCA9IHJlbWFpbmluZ1BhdGhcbiAgICA/IHBhY2thZ2VKc29uLmV4cG9ydHNbYC4vJHtyZW1haW5pbmdQYXRofWBdXG4gICAgOiBudWxsXG4gIGlmIChzdWJwYXRoRXhwb3J0ICYmIHR5cGVvZiBzdWJwYXRoRXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIHN1YnBhdGhFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHNcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcImltcG9ydFwiXVxuICBpZiAoXG4gICAgcmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJlxuICAgIGltcG9ydEV4cG9ydCAmJlxuICAgIHR5cGVvZiBpbXBvcnRFeHBvcnQgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGltcG9ydEV4cG9ydCwgY3R4KVxuICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT0gXCIuXCIgPyBcIlwiIDogYCR7c2VhcmNoUGF0aH0vYH1ub2RlX21vZHVsZXMvJHtzY29wZX1gXG5cbiAgLy8gVHJ5IHRvIGZpbmQgcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aCwgY3R4KVxuICBpZiAocGFja2FnZUpzb24pIHtcbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggZXhwb3J0cyBmaWVsZFxuICAgIGNvbnN0IGV4cG9ydHNSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICByZW1haW5pbmdQYXRoLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZXhwb3J0c1Jlc29sdXRpb24pIHJldHVybiBleHBvcnRzUmVzb2x1dGlvblxuXG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIG1haW4vbW9kdWxlIGZpZWxkc1xuICAgIGNvbnN0IGVudHJ5UG9pbnRSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChlbnRyeVBvaW50UmVzb2x1dGlvbikgcmV0dXJuIGVudHJ5UG9pbnRSZXNvbHV0aW9uXG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHJlbWFpbmluZyBwYXRoXG4gIGNvbnN0IHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uID0gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgY3R4LFxuICApXG4gIGlmIChyZW1haW5pbmdQYXRoUmVzb2x1dGlvbikgcmV0dXJuIHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uXG5cbiAgLy8gSWYgbm90IGZvdW5kIGFuZCB3ZSBoYXZlIGEgcGFyZW50IGRpcmVjdG9yeSwgdHJ5IHRoZXJlXG4gIGNvbnN0IHBhcmVudFBhdGggPSBkaXJuYW1lKHNlYXJjaFBhdGgpXG4gIGlmIChwYXJlbnRQYXRoICYmIHBhcmVudFBhdGggIT09IHNlYXJjaFBhdGgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgocGFyZW50UGF0aCwgY3R4KVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlKFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGN0eCA9IGNyZWF0ZUNvbnRleHQobW9kdWxlUGF0aCwgZnNNYXAsIGJhc2VQYXRoKVxuICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgoY3R4LmJhc2VQYXRoLCBjdHgpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5vZGUtbW9kdWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LmZzTWFwLCBcIlwiKVxuXG4gIGlmICghcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY3R4LmNpcmN1aXQ/LnBsYXRmb3JtXG4gICAgaWYgKHBsYXRmb3JtPy5ub2RlTW9kdWxlc1Jlc29sdmVyKSB7XG4gICAgICBkZWJ1ZyhgQXR0ZW1wdGluZyB0byByZXNvbHZlIFwiJHtpbXBvcnROYW1lfVwiIHVzaW5nIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHBsYXRmb3JtLm5vZGVNb2R1bGVzUmVzb2x2ZXIoaW1wb3J0TmFtZSlcblxuICAgICAgICBpZiAoZmlsZUNvbnRlbnQpIHtcbiAgICAgICAgICBkZWJ1ZyhgU3VjY2Vzc2Z1bGx5IHJlc29sdmVkIFwiJHtpbXBvcnROYW1lfVwiIHZpYSBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb2x2ZWQgY29udGVudCB0byBmc01hcCB3aXRoIGEgc3ludGhldGljIHBhdGhcbiAgICAgICAgICAvLyBBZGQgLnRzIGV4dGVuc2lvbiB0byBlbnN1cmUgaXQncyB0cmVhdGVkIGFzIGEgbW9kdWxlIGZpbGVcbiAgICAgICAgICBjb25zdCBzeW50aGV0aWNQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2ltcG9ydE5hbWV9LnRzYFxuICAgICAgICAgIGN0eC5mc01hcFtzeW50aGV0aWNQYXRoXSA9IGZpbGVDb250ZW50XG5cbiAgICAgICAgICAvLyBJbXBvcnQgdGhlIGZpbGUgdXNpbmcgdGhlIG5vcm1hbCBmbG93XG4gICAgICAgICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHN5bnRoZXRpY1BhdGgsIGN0eCwgZGVwdGgpXG5cbiAgICAgICAgICAvLyBNYXAgdGhlIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIC8vIEFsc28gbWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeFxuICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gc3ludGhldGljUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKGBub2RlTW9kdWxlc1Jlc29sdmVyIHJldHVybmVkIG51bGwgZm9yIFwiJHtpbXBvcnROYW1lfVwiYClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRlYnVnKGBub2RlTW9kdWxlc1Jlc29sdmVyIGZhaWxlZCBmb3IgXCIke2ltcG9ydE5hbWV9XCI6YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBub3QgZm91bmRgKVxuICB9XG5cbiAgLy8gVXNlIGltcG9ydExvY2FsRmlsZSB0byBoYW5kbGUgdGhlIG5vZGUgbW9kdWxlXG4gIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZE5vZGVNb2R1bGVQYXRoLCBjdHgsIGRlcHRoKVxuXG4gIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZSdzIGV4cG9ydHNcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gTWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeCBmb3IgZGlyZWN0IGltcG9ydHNcbiAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBIYW5kbGUgaW5kZXggZmlsZXMgc3BlY2lhbGx5XG4gIGlmIChcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzeFwiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHNcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LmpzXCIpXG4gICkge1xuICAgIGNvbnN0IGRpclBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL1xcL2luZGV4XFwuKHRzeD98anMpJC8sIFwiXCIpXG4gICAgY29uc3QgdW5wcmVmaXhlZERpclBhdGggPSBkaXJQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkRGlyUGF0aF0gPVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgICAvLyBIYW5kbGUgc2NvcGVkIHBhY2thZ2VzXG4gICAgaWYgKHVucHJlZml4ZWREaXJQYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzY29wZVBhcnRzID0gdW5wcmVmaXhlZERpclBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBzY29wZWROYW1lID0gYCR7c2NvcGVQYXJ0c1swXX0vJHtzY29wZVBhcnRzWzFdfWBcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Njb3BlZE5hbWVdID1cbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBkZWJ1ZyhgaW1wb3J0aW5nIG5wbSBwYWNrYWdlOiAke2ltcG9ydE5hbWV9YClcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIGNvbnN0IG5wbUNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7aW1wb3J0TmFtZX0vK2VzbWBcblxuICBsZXQgZmluYWxVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCB7IGNvbnRlbnQsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKG5wbUNkblVybClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICBmaW5hbFVybCA9IHJlcy51cmxcbiAgICAgIGlmICghcmVzLm9rKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmZXRjaCBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIGpzZGVsaXZyOiAke3Jlcy5zdGF0dXNUZXh0fVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgcmV0dXJuIHsgY29udGVudDogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY29udGVudDogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgbnBtIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgY29uc3QgZmluYWxJbXBvcnROYW1lID0gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKGZpbmFsVXJsISlcbiAgY29uc3QgY3dkID0gZGlybmFtZShmaW5hbEltcG9ydE5hbWUpXG5cbiAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoY29udGVudCEpXG4gIGZvciAoY29uc3Qgc3ViSW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW3N1YkltcG9ydE5hbWVdKSB7XG4gICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChzdWJJbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICBjd2QsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ldmFsLXBhdGhcIilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChkZXB0aCA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkICgzMCkgSW1wb3J0IFBhdGg6ICR7Y3R4LmltcG9ydFN0YWNrLmpvaW4oXCIgLT4gXCIpfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9ucG0vXCIpKSB7XG4gICAgY29uc3QgcGtnTmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZSgvXlxcL25wbVxcLy8sIFwiXCIpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7cGtnTmFtZX1cIilgKVxuICAgIGF3YWl0IGltcG9ydE5wbVBhY2thZ2UocGtnTmFtZSwgY3R4LCBkZXB0aClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgd2hlcmUgdHNjb25maWcuanNvbiBpcyBsb2NhdGVkXG4gIGxldCB0c2NvbmZpZ0RpciA9IFwiLlwiXG4gIGlmIChjdHgudHNDb25maWcgJiYgb3B0cy5jd2QpIHtcbiAgICAvLyBJZiBjd2QgaXMgaW4gbm9kZV9tb2R1bGVzLCBmaW5kIHRoZSBwYWNrYWdlIHJvb3RcbiAgICAvLyBlLmcuLCBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnkvbGliL2dlbmVyYXRlZFwiIC0+IFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeVwiXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNNYXRjaCA9IG9wdHMuY3dkLm1hdGNoKC9eKG5vZGVfbW9kdWxlc1xcL1teXFwvXSspLylcbiAgICBpZiAobm9kZU1vZHVsZXNNYXRjaCkge1xuICAgICAgdHNjb25maWdEaXIgPSBub2RlTW9kdWxlc01hdGNoWzFdXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLCB0c2NvbmZpZ0RpciB9LFxuICApXG4gIGlmIChyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TG9jYWxGaWxlKFwiJHtyZXNvbHZlZExvY2FsSW1wb3J0UGF0aH1cIilgKVxuICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lICh3aGljaCBtaWdodCBiZSBhIHRzY29uZmlnIHBhdGggYWxpYXMpIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICBpZiAoaW1wb3J0TmFtZSAhPT0gcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9XG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZExvY2FsSW1wb3J0UGF0aF1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGlzIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIHBhdHRlcm4gYnV0IGZhaWxlZCB0byByZXNvbHZlXG4gIC8vIElmIHNvLCB0aHJvdyBhbiBlcnJvciBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byBucG1cbiAgY29uc3QgdHNDb25maWcgPSBjdHgudHNDb25maWcgPz8gZ2V0VHNDb25maWcoY3R4LmZzTWFwKVxuICBpZiAoIWN0eC50c0NvbmZpZyAmJiB0c0NvbmZpZykge1xuICAgIGN0eC50c0NvbmZpZyA9IHRzQ29uZmlnXG4gIH1cbiAgaWYgKG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKGltcG9ydE5hbWUsIHRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggYWxpYXMgYnV0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyBmaWxlJHtvcHRzLmN3ZCA/IGAgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCB8fCBcIlwiLFxuICApXG4gIGlmIChyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGByZXNvbHZlZE5vZGVNb2R1bGVQYXRoPVwiJHtyZXNvbHZlZE5vZGVNb2R1bGVQYXRofVwiYClcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgLy8gSWYgbm90IGZvdW5kIGluIGZzTWFwIGJ1dCBtaWdodCBiZSBhIG5vZGUgbW9kdWxlLCB0cnkgaW1wb3J0Tm9kZU1vZHVsZVxuICAvLyB3aGljaCB3aWxsIGF0dGVtcHQgdG8gdXNlIG5vZGVNb2R1bGVzUmVzb2x2ZXIgaWYgY29uZmlndXJlZFxuICBpZiAoXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIilcbiAgKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpIHZpYSBub2RlTW9kdWxlc1Jlc29sdmVyYCxcbiAgICAgIClcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIiwgZmFsbGluZyBiYWNrIHRvIG5wbSBDRE5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwiLi9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6c2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCIpXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gb3B0cy5mc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgICAgICBpZiAoY29uZmlnLm1haW5FbnRyeXBvaW50KSB7XG4gICAgICAgICAgb3B0cy5lbnRyeXBvaW50ID0gY29uZmlnLm1haW5FbnRyeXBvaW50XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRzY2lyY3VpdC5jb25maWcuanNvbjpcIiwgZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciBlbnRyeXBvaW50IG9yIG1haW5Db21wb25lbnRQYXRoIG11c3QgYmUgcHJvdmlkZWQgKG5vIGluZGV4IGZpbGUsIGNvdWxkIG5vdCBpbmZlciBlbnRyeXBvaW50KVwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmIG9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBvcHRzLmVudHJ5cG9pbnQgPSBcImVudHJ5cG9pbnQudHN4XCJcbiAgICBjb25zdCBtYWluQ29tcG9uZW50Q29kZSA9XG4gICAgICBvcHRzLmZzTWFwW3Jlc29sdmVGaWxlUGF0aE9yVGhyb3cob3B0cy5tYWluQ29tcG9uZW50UGF0aCwgb3B0cy5mc01hcCldXG4gICAgaWYgKCFtYWluQ29tcG9uZW50Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWFpbiBjb21wb25lbnQgcGF0aCBcIiR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIiBub3QgZm91bmQgaW4gZnNNYXAuIEF2YWlsYWJsZSBwYXRoczogJHtPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIClcbiAgICB9XG4gICAgb3B0cy5mc01hcFtvcHRzLmVudHJ5cG9pbnRdID0gYFxuICAgICBpbXBvcnQgKiBhcyBVc2VyQ29tcG9uZW50cyBmcm9tIFwiLi8ke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCI7XG4gICAgICAgICAgXG4gICAgICAke1xuICAgICAgICBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gICAgICAgICAgPyBgXG4gICAgICAgIGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHNbXCIke29wdHMubWFpbkNvbXBvbmVudE5hbWV9XCJdXG4gICAgICAgIGBcbiAgICAgICAgICA6IGBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzLmRlZmF1bHQgfHwgXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgICAgLmZpbHRlcigoW25hbWVdKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwidXNlXCIpKVxuICAgICAgICAgIC5tYXAoKFtfLCBjb21wb25lbnRdKSA9PiBjb21wb25lbnQpWzBdIHx8ICgoKSA9PiBudWxsKTtgXG4gICAgICB9XG5cbiAgICAgICAgICAgJHtcbiAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkXG4gICAgICAgICAgICAgICA/IGBcbiAgICAgY29uc29sZS5sb2coeyBVc2VyQ29tcG9uZW50cyB9KVxuICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudFRvUmVuZGVyIFwiICsgQ29tcG9uZW50VG9SZW5kZXIudG9TdHJpbmcoKSwgIHsgQ29tcG9uZW50VG9SZW5kZXIgfSlcbiAgICAgYFxuICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoICAgICAgIFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+IFxuICAgICAgKTtcbmBcbiAgfVxuXG4gIGlmICghb3B0cy5uYW1lICYmIG9wdHMubWFpbkNvbXBvbmVudE5hbWUpIHtcbiAgICBvcHRzLm5hbWUgPSBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgZW50cnlwb2ludD86IHN0cmluZyxcbikgPT4ge1xuICBpZiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgIGVudHJ5cG9pbnQgJiZcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUm9vdENpcmN1aXQgaGFzIG5vIGNoaWxkcmVuXCIpICYmXG4gICAgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1wiZW50cnlwb2ludFwiOicpXG4gICkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRNZXNzYWdlID0gZW50cnlwb2ludC5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gZW50cnlwb2ludC5zbGljZSgyKVxuICAgICAgOiBlbnRyeXBvaW50XG4gICAgZXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLm1lc3NhZ2V9LiBcImVudHJ5cG9pbnRcIjogXCIke2VudHJ5cG9pbnRNZXNzYWdlfVwiIGlzIHNldCBpbiB0aGUgcnVubmVyIGNvbmZpZ3VyYXRpb24sIGVudHJ5cG9pbnRzIG11c3QgY29udGFpbiBcImNpcmN1aXQuYWRkKC4uLilcIiwgeW91IG1pZ2h0IGJlIGxvb2tpbmcgdG8gdXNlIG1haW5Db21wb25lbnRQYXRoIGluc3RlYWQgaWYgeW91ciBmaWxlIGV4cG9ydHMgYSBjb21wb25lbnQuYFxuICB9XG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiLyoqXG4gKiBHZXQgYWxsIHBhdGhzIG9mIGFuIG9iamVjdFxuICpcbiAqIGdldE9iamVjdFBhdGhzKHsgYTogeyBiOiAyLCBjOiB7IGQ6IDMgfSB9LCBlOiA1IH0pXG4gKlxuICogLy8gT3V0cHV0OiBbJ2EuYicsICdhLmMuZCcsICdlJ11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdFBhdGhzKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHByZWZpeCA9IFwiXCIsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cbiAgICBjb25zdCBwYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3Qgc3ViUGF0aHMgPSBnZXRPYmplY3RQYXRocyh2YWx1ZSwgcGF0aClcbiAgICAgIHBhdGhzLnB1c2goLi4uc3ViUGF0aHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhzLnB1c2gocGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGF0aHNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQXRQYXRoKG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRcbn1cbi8qKlxuICogU2V0IGEgdmFsdWUgYXQgYSBwYXRoIGluIGFuIG9iamVjdFxuICpcbiAqIHNldFZhbHVlQXRQYXRoKHsgYTogeyBiOiAyIH0gfSwgXCJhLmMuZFwiLCA1KVxuICpcbiAqIC8vIE91dHB1dDogeyBhOiB7IGI6IDIsIGM6IHsgZDogNSB9IH0gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVBdFBhdGgoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuKSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2ldXG5cbiAgICAvLyBJZiB3ZSdyZSBhdCB0aGUgbGFzdCBrZXksIHNldCB0aGUgdmFsdWUuXG4gICAgaWYgKGkgPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgY3VycmVudFtrZXldID0gdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCBhbiBvYmplY3QgKGF2b2lkIG92ZXJ3cml0aW5nIGFycmF5cyksIGNyZWF0ZSBhIG5ldyBvYmplY3RcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpIHx8XG4gICAgICAgIHR5cGVvZiBjdXJyZW50W2tleV0gIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgY3VycmVudFtrZXldID09PSBudWxsIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkoY3VycmVudFtrZXldKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRba2V5XSA9IHt9XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ2lyY3VpdFJ1bm5lciB9IGZyb20gXCIuL0NpcmN1aXRSdW5uZXJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4sXG4pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiICYmXG4gICAgIWZpbGVzeXN0ZW1PckNvZGVTdHJpbmcuaW5jbHVkZXMoXCJleHBvcnRcIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBcImV4cG9ydFwiIGtleXdvcmQgd2Fzbid0IGZvdW5kIGluIHlvdXIgcHJvdmlkZWQgY29kZS4gWW91IG5lZWQgdG8gZXhwb3J0IGEgY29tcG9uZW50IGluIHlvdXIgY29kZSwgZS5nLlxcblxcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcXG4gIDxyZXNpc3RvciBuYW1lPVwiUjFcIiByZXNpc3RhbmNlPVwiMWtcIiAvPlxcbilgLFxuICAgIClcbiAgfVxuICBjb25zdCBmaWxlc3lzdGVtID1cbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7IFwidXNlci1jb2RlLnRzeFwiOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nIH1cbiAgICAgIDogZmlsZXN5c3RlbU9yQ29kZVN0cmluZ1xuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcigpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czogeyBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47IGV4cG9ydE5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGlmICghbW9kdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgbW9kdWxlID0gYEB0c2NpLyR7bW9kdWxlLnJlcGxhY2UoL1xcLy8sIFwiLlwiKX1gXG4gIH1cbiAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCBydW5Uc2NpcmN1aXRDb2RlKFxuICAgIHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIGV4cG9ydHMgdGhhdCBhcmUgbm90IHRoZSBkZWZhdWx0IGV4cG9ydCBieSBzY2FubmluZ1xuICAgICAgLy8gb3RoZXJFeHBvcnRzIGZvciBjb21wb25lbnRzXG4gICAgICBcInVzZXItY29kZS50c3hcIjogYFxuICAgIGltcG9ydCBNb2R1bGUsICogYXMgb3RoZXJFeHBvcnRzIGZyb20gXCIke21vZHVsZX1cIjtcblxuICAgIGxldCBleHBvcnROYW1lID0gXCIke29wdHMuZXhwb3J0TmFtZSA/PyBcIlwifVwiXG5cbiAgICBpZiAoKCFNb2R1bGUgfHwgdHlwZW9mIE1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSAmJiAhQm9vbGVhbihleHBvcnROYW1lKSkge1xuICAgICAgZXhwb3J0TmFtZSA9IE9iamVjdC5rZXlzKG90aGVyRXhwb3J0cykuZmlsdGVyKGtleSA9PiBrZXlbMF0gPT09IGtleVswXS50b1VwcGVyQ2FzZSgpICYmIHR5cGVvZiBvdGhlckV4cG9ydHNba2V5XSA9PT0gXCJmdW5jdGlvblwiKVswXVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBleHBvcnROYW1lID8gb3RoZXJFeHBvcnRzW2V4cG9ydE5hbWVdIDogTW9kdWxlXG5cbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXGBObyBleHBvcnQgZm91bmQgZm9yIG1vZHVsZSBcIlxcJHttb2R1bGV9XCIgKHRyaWVkIFwiXFwke2V4cG9ydE5hbWUgPz8gXCJkZWZhdWx0XCJ9XCIpXFxgKVxuICAgIH1cblxuICAgIGV4cG9ydCBkZWZhdWx0IGRlZmF1bHRFeHBvcnQ7XG4gICAgYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1haW5Db21wb25lbnRQcm9wczogb3B0cy5wcm9wcyxcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsbUJBQW1CO0FBRTVCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksV0FBVztBQUN2QixZQUFZLHdCQUF3Qjs7O0FDQzdCLElBQU0sZ0NBQWdDLENBQzNDLG1CQUN1QjtBQUV2QixNQUFJLFFBQVEsZUFBZSxNQUFNLGdCQUFnQjtBQUNqRCxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFJekIsVUFBUSxlQUFlO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBQ0EsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBRXpCLFNBQU87QUFDVDs7O0FDaEJPLElBQU0scUNBQXFDLENBQ2hELHNCQUNXO0FBQ1gsTUFBSSxrQkFBa0IsU0FBUyxLQUFLLEdBQUc7QUFDckMsV0FBTyxrQkFBa0IsUUFBUSxRQUFRLEVBQUU7QUFBQSxFQUM3QztBQUNBLFNBQU87QUFDVDs7O0FDSk8sSUFBTSx1QkFBdUIsQ0FDbEMsY0FDdUI7QUFDdkIsTUFBSSxDQUFDLFVBQVcsUUFBTztBQUV2QixNQUFJLFVBQVUsV0FBVyxRQUFRLEdBQUc7QUFDbEMsVUFBTSxvQkFBb0IsOEJBQThCLFNBQVM7QUFDakUsUUFBSSxtQkFBbUI7QUFDckIsYUFBTyxtQ0FBbUMsaUJBQWlCO0FBQUEsSUFDN0Q7QUFHQSxXQUFPO0FBQUEsRUFDVDtBQUdBLFNBQU8sbUNBQW1DLFNBQVM7QUFDckQ7OztBQ3JCTyxJQUFNLFFBQVEsb0JBQUksSUFBaUI7QUFFMUMsSUFBTSxvQkFBb0IsT0FBTyxNQUFXLFdBQWdCO0FBQzFELFFBQU0sY0FBYyxJQUFJLGdCQUFnQjtBQUFBLElBQ3RDLEdBQUc7QUFBQSxJQUNILE1BQU07QUFBQSxFQUNSLENBQUMsRUFBRSxTQUFTO0FBQ1osTUFBSSxNQUFNLElBQUksV0FBVyxHQUFHO0FBQzFCLFdBQU8sTUFBTSxJQUFJLFdBQVc7QUFBQSxFQUM5QjtBQUNBLFFBQU0sV0FBVyxNQUFNO0FBQUEsSUFDckIsbUNBQW1DLElBQUksU0FBUyxXQUFXO0FBQUEsRUFDN0Q7QUFDQSxRQUFNLGVBQWUsTUFBTSxTQUFTLEtBQUs7QUFDekMsUUFBTSxJQUFJLGFBQWEsWUFBWTtBQUNuQyxTQUFPO0FBQ1Q7QUFFQSxJQUFNLDBCQUEwQixDQUFDLFVBQTZCO0FBQzVELE1BQUksQ0FBQyxNQUFPLFFBQU8sQ0FBQztBQUNwQixTQUFPLENBQUMsR0FBRyxLQUFLLEVBQUU7QUFBQSxJQUNoQixDQUFDLEdBQUcsTUFBTSxPQUFPLEVBQUUsWUFBWSxLQUFLLElBQUksT0FBTyxFQUFFLFlBQVksS0FBSztBQUFBLEVBQ3BFO0FBQ0Y7QUFFTyxJQUFNLGlCQUE4QjtBQUFBLEVBQ3pDLFVBQVUsT0FBTztBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsRUFDRixNQUFvQztBQUNsQyxVQUFNLGdCQUFnQixxQkFBcUIsaUJBQWlCO0FBRTVELFFBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLG1CQUMxQjtBQUNBLFlBQU0sRUFBRSxVQUFVLElBQUksTUFBTSxrQkFBa0IsYUFBYTtBQUFBLFFBQ3pELFlBQVksZ0JBQWdCO0FBQUEsUUFDNUIsU0FBUztBQUFBLE1BQ1gsQ0FBQztBQUVELGFBQU87QUFBQSxRQUNMLFFBQVEsd0JBQXdCLFNBQVMsRUFDdEMsSUFBSSxDQUFDLE1BQVcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUM1QixNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUNGLFdBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLG9CQUMxQjtBQUNBLFlBQU0sRUFBRSxXQUFXLElBQUksTUFBTSxrQkFBa0IsY0FBYztBQUFBLFFBQzNELGFBQWEsZ0JBQWdCO0FBQUEsUUFDN0IsU0FBUztBQUFBLE1BQ1gsQ0FBQztBQUVELGFBQU87QUFBQSxRQUNMLFFBQVEsd0JBQXdCLFVBQVUsRUFDdkMsSUFBSSxDQUFDLE1BQVcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUM1QixNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUNGLFdBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLHFCQUMxQjtBQUNBLFVBQUk7QUFDSixVQUFJLG1CQUFtQixTQUFTLElBQUksR0FBRztBQUNyQyxnQkFBUSxPQUFPLGtCQUFrQixNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7QUFBQSxNQUNqRDtBQUNBLFlBQU0sRUFBRSxRQUFRLElBQUksTUFBTTtBQUFBLFFBQ3hCO0FBQUEsUUFDQSxRQUNJO0FBQUEsVUFDRTtBQUFBLFVBQ0EsVUFBVSxnQkFBZ0I7QUFBQSxVQUMxQixRQUFRLGdCQUFnQjtBQUFBLFFBQzFCLElBQ0E7QUFBQSxVQUNFLFVBQVUsZ0JBQWdCO0FBQUEsVUFDMUIsUUFBUSxnQkFBZ0I7QUFBQSxRQUMxQjtBQUFBLE1BQ047QUFDQSxhQUFPO0FBQUEsUUFDTCxRQUFRLHdCQUF3QixPQUFPLEVBQ3BDLElBQUksQ0FBQyxNQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsRUFDNUIsTUFBTSxHQUFHLENBQUM7QUFBQSxNQUNmO0FBQUEsSUFDRixXQUNFLGdCQUFnQixTQUFTLHNCQUN6QixnQkFBZ0IsVUFBVSx3QkFDMUI7QUFDQSxZQUFNLEVBQUUsZUFBZSxJQUFJLE1BQU0sa0JBQWtCLGtCQUFrQjtBQUFBLFFBQ25FLFlBQVksZ0JBQWdCO0FBQUEsUUFDNUIsU0FBUztBQUFBLE1BQ1gsQ0FBQztBQUNELGFBQU87QUFBQSxRQUNMLFFBQVEsd0JBQXdCLGNBQWMsRUFDM0MsSUFBSSxDQUFDLE1BQVcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUM1QixNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUNGLFdBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLGdCQUMxQjtBQUNBLFlBQU0sRUFBRSxPQUFPLElBQUksTUFBTSxrQkFBa0IsVUFBVTtBQUFBLFFBQ25ELFNBQVM7QUFBQSxNQUNYLENBQUM7QUFDRCxhQUFPO0FBQUEsUUFDTCxRQUFRLHdCQUF3QixNQUFNLEVBQ25DLElBQUksQ0FBQyxNQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsRUFDNUIsTUFBTSxHQUFHLENBQUM7QUFBQSxNQUNmO0FBQUEsSUFDRixXQUNFLGdCQUFnQixTQUFTLHNCQUN6QixnQkFBZ0IsVUFBVSxlQUMxQjtBQUNBLFlBQU0sRUFBRSxNQUFNLElBQUksTUFBTSxrQkFBa0IsU0FBUztBQUFBLFFBQ2pELFNBQVM7QUFBQSxNQUNYLENBQUM7QUFDRCxhQUFPO0FBQUEsUUFDTCxRQUFRLHdCQUF3QixLQUFLLEVBQ2xDLElBQUksQ0FBQyxNQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsRUFDNUIsTUFBTSxHQUFHLENBQUM7QUFBQSxNQUNmO0FBQUEsSUFDRixXQUNFLGdCQUFnQixTQUFTLHNCQUN6QixnQkFBZ0IsVUFBVSxxQkFDMUI7QUFDQSxZQUFNLEVBQUUsWUFBWSxJQUFJLE1BQU0sa0JBQWtCLGVBQWU7QUFBQSxRQUM3RCxTQUFTO0FBQUEsUUFDVCxpQkFBaUIsZ0JBQWdCO0FBQUEsTUFDbkMsQ0FBQztBQUNELGFBQU87QUFBQSxRQUNMLFFBQVEsd0JBQXdCLFdBQVcsRUFDeEMsSUFBSSxDQUFDLE1BQVcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUM1QixNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUNGLFdBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLHVCQUMxQjtBQUNBLFlBQU0sRUFBRSxjQUFjLElBQUksTUFBTSxrQkFBa0IsaUJBQWlCO0FBQUEsUUFDakUsU0FBUyxnQkFBZ0I7QUFBQSxRQUN6QixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsYUFBYSxFQUMxQyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsbUJBQzFCO0FBQ0EsWUFBTSxFQUFFLFVBQVUsSUFBSSxNQUFNLGtCQUFrQixhQUFhO0FBQUEsUUFDekQsWUFBWSxnQkFBZ0I7QUFBQSxRQUM1QixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsU0FBUyxFQUN0QyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsa0JBQzFCO0FBQ0EsWUFBTSxFQUFFLFNBQVMsSUFBSSxNQUFNLGtCQUFrQixZQUFZO0FBQUEsUUFDdkQsV0FBVyxnQkFBZ0I7QUFBQSxRQUMzQixrQkFBa0IsZ0JBQWdCO0FBQUEsUUFDbEMsU0FBUztBQUFBLE1BQ1gsQ0FBQztBQUNELGFBQU87QUFBQSxRQUNMLFFBQVEsd0JBQXdCLFFBQVEsRUFDckMsSUFBSSxDQUFDLE1BQVcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUM1QixNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUNGLFdBQ0UsZ0JBQWdCLFNBQVMsc0JBQ3pCLGdCQUFnQixVQUFVLGlCQUMxQjtBQUNBLFlBQU0sRUFBRSxRQUFRLElBQUksTUFBTSxrQkFBa0IsV0FBVztBQUFBLFFBQ3JELFNBQVM7QUFBQSxRQUNULGFBQWEsZ0JBQWdCO0FBQUEsUUFDN0IsY0FBYyxnQkFBZ0I7QUFBQSxNQUNoQyxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsT0FBTyxFQUNwQyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsb0JBQzFCO0FBQ0EsWUFBTSxFQUFFLFdBQVcsSUFBSSxNQUFNLGtCQUFrQixjQUFjO0FBQUEsUUFDM0QsV0FBVyxnQkFBZ0I7QUFBQSxRQUMzQixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsVUFBVSxFQUN2QyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsaUJBQzFCO0FBQ0EsWUFBTSxFQUFFLFNBQVMsSUFBSSxNQUFNLGtCQUFrQixZQUFZO0FBQUEsUUFDdkQsYUFBYSxnQkFBZ0I7QUFBQSxRQUM3QixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsUUFBUSxFQUNyQyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsY0FDMUI7QUFDQSxZQUFNLEVBQUUsS0FBSyxJQUFJLE1BQU0sa0JBQWtCLFFBQVE7QUFBQSxRQUMvQyxTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsSUFBSSxFQUNqQyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDRSxnQkFBZ0IsU0FBUyxzQkFDekIsZ0JBQWdCLFVBQVUsZUFDMUI7QUFDQSxZQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU0sa0JBQWtCLFNBQVM7QUFBQSxRQUNqRCxTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0wsUUFBUSx3QkFBd0IsS0FBSyxFQUNsQyxJQUFJLENBQUMsTUFBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQzVCLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDZjtBQUFBLElBQ0Y7QUFDQSxXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0Y7OztBQ3BQQSxTQUFTLGtDQUFrQzs7O0FDRnBDLElBQU0seUNBQXlDLE9BQ3BELGdCQUNpQjtBQUNqQixNQUFJO0FBRUYsVUFBTSxTQUFTLE1BQU0sT0FBTztBQUM1QixXQUFPLE9BQU87QUFBQSxFQUNoQixTQUFTLEdBQUc7QUFDVixZQUFRLElBQUksa0JBQWtCLFdBQVcsa0NBQWtDO0FBRTNFLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTTtBQUFBLFFBQ2hCLGdDQUFnQyxXQUFXO0FBQUEsTUFDN0M7QUFDQSxVQUFJLENBQUMsSUFBSSxJQUFJO0FBQ1gsY0FBTSxJQUFJO0FBQUEsVUFDUixtQkFBbUIsV0FBVyxjQUFjLElBQUksVUFBVTtBQUFBLFFBQzVEO0FBQUEsTUFDRjtBQUNBLFlBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixZQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxZQUFNLE1BQU0sSUFBSSxnQkFBZ0IsSUFBSTtBQUNwQyxVQUFJO0FBQ0YsY0FBTSxFQUFFLFNBQVMsYUFBYSxJQUFJLE1BQU0sT0FBTztBQUMvQyxlQUFPO0FBQUEsTUFDVCxVQUFFO0FBQ0EsWUFBSSxnQkFBZ0IsR0FBRztBQUFBLE1BQ3pCO0FBQUEsSUFDRixTQUFTLFVBQVU7QUFDakIsY0FBUSxNQUFNLG9CQUFvQixXQUFXLGlCQUFpQixRQUFRO0FBQ3RFLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUNGOzs7QUQ3QkEsSUFBTSw0QkFBNEI7QUFFbEMsSUFBSSxxQkFBeUM7QUFFdEMsSUFBTSxvQkFBb0IsT0FBdUI7QUFBQSxFQUN0RCxhQUFhO0FBQUEsRUFDYixnQkFBZ0I7QUFBQSxJQUNkLFNBQVM7QUFBQSxNQUNQLFVBQVUsT0FBTyxVQUFrQjtBQUNqQyxZQUFJLENBQUMsb0JBQW9CO0FBQ3ZCLGdCQUFNLDJCQUNKLE1BQU07QUFBQSxZQUNKO0FBQUEsVUFDRixFQUFFLE1BQU0sQ0FBQyxVQUFVO0FBQ2pCLGtCQUFNLElBQUk7QUFBQSxjQUNSO0FBQUEsY0FDQSxFQUFFLE9BQU8sTUFBTTtBQUFBLFlBQ2pCO0FBQUEsVUFDRixDQUFDO0FBRUgsY0FBSSwwQkFBMEI7QUFDNUIsaUNBQXFCLE1BQU0seUJBQXlCO0FBQUEsVUFDdEQ7QUFBQSxRQUNGO0FBRUEsWUFBSSxDQUFDLG9CQUFvQjtBQUN2QixnQkFBTSxJQUFJO0FBQUEsWUFDUjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBRUEsZUFBTyxtQkFBbUIsU0FBUyxLQUFLO0FBQUEsTUFDMUM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EscUJBQXFCO0FBQUEsSUFDbkIsT0FBTyxPQUFPLGtCQUEwQjtBQUN0QyxZQUFNLFVBQVUsR0FBRyx5QkFBeUIsSUFBSSxhQUFhO0FBQzdELFlBQU0saUJBQWlCLEdBQUcsT0FBTztBQUNqQyxZQUFNLE1BQU0sTUFBTSxNQUFNLGNBQWM7QUFDdEMsWUFBTSxNQUFNLE1BQU0sSUFBSSxLQUFLO0FBRzNCLFlBQU0sV0FBVyxNQUFNLFFBQVEsR0FBRyxJQUM5QixJQUFJO0FBQUEsUUFBTyxDQUFDLE9BQ1YsSUFBSSxTQUFTLHdCQUF3QixJQUFJLFNBQVMsVUFBVTtBQUFBLE1BQzlELElBQ0E7QUFDSixZQUFNLFNBQVMsR0FBRyxPQUFPO0FBQ3pCLGFBQU87QUFBQSxRQUNMLHNCQUFzQjtBQUFBLFFBQ3RCLFVBQVUsRUFBRSxRQUFRLG9CQUFvQixLQUFLO0FBQUEsTUFDL0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0Esd0JBQXdCO0FBQUEsSUFDdEIsV0FBVztBQUFBLE1BQ1QsYUFBYSxPQUFPLFFBQWdCO0FBQ2xDLGNBQU0sZUFBZSxNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO0FBQzlELGNBQU0sWUFBWSxNQUFNLDJCQUEyQixZQUFZO0FBQy9ELGVBQU87QUFBQSxVQUNMLHNCQUFzQixNQUFNLFFBQVEsU0FBUyxJQUN6QyxZQUNBLENBQUMsU0FBUztBQUFBLFFBQ2hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBTGhFQSxPQUFPLFdBQVc7QUFFbEIsSUFBTSxRQUFRLE1BQU0sNkJBQTZCO0FBbUIxQyxTQUFTLHVCQUNkLHdCQUNBLE9BS0ksQ0FBQyxHQUNhO0FBQ2xCLGFBQVcsUUFBUTtBQUVuQixRQUFNLGVBQWUsS0FBSyxZQUFZLGtCQUFrQjtBQUN4RCxRQUFNLFdBQVcsS0FBSyxnQkFDbEIsRUFBRSxHQUFHLGNBQWMsR0FBRyxLQUFLLGNBQWMsSUFDekM7QUFFSixNQUFJLFNBQVMscUJBQXFCO0FBQ2hDLGFBQVMsY0FBYztBQUFBLEVBQ3pCO0FBRUEsUUFBTSxVQUFVLElBQUksWUFBWTtBQUFBLElBQzlCO0FBQUEsRUFDRixDQUFDO0FBRUQsTUFBSSxLQUFLLE1BQU07QUFDYixZQUFRLE9BQU8sS0FBSztBQUFBLEVBQ3RCO0FBRUEsTUFBSSxLQUFLLGdCQUFnQjtBQUN2QixZQUFRLFlBQVksS0FBSyxjQUFjO0FBQUEsRUFDekM7QUFFQSxRQUFNLE9BQStCLENBQUM7QUFFdEMsU0FBTztBQUFBLElBQ0wsT0FBTyxDQUFDO0FBQUEsSUFDUixZQUFZO0FBQUEsSUFDWixRQUFRO0FBQUEsTUFDTixNQUFNLENBQUMsWUFBb0I7QUFDekIsYUFBSyxLQUFLLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFBQSxNQUM1QjtBQUFBLE1BQ0EsU0FBUyxNQUFNO0FBQUEsTUFDZixlQUFlLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFBRSxLQUFLLElBQUk7QUFBQSxJQUMzRDtBQUFBLElBQ0Esb0JBQW9CO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsTUFDbkIsV0FBVztBQUFBLE1BQ1gseUJBQXlCO0FBQUEsTUFDekIsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBO0FBQUE7QUFBQSxNQUlQLG9CQUFvQixDQUFDO0FBQUEsSUFDdkI7QUFBQSxJQUNBO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixhQUFhLENBQUM7QUFBQSxJQUNkLG9CQUFvQixvQkFBSSxJQUFZO0FBQUEsSUFDcEMsR0FBRztBQUFBLEVBQ0w7QUFDRjs7O0FPMUZPLFNBQVMsa0JBQWtCLFVBQWtCO0FBQ2xELE1BQUksZUFBZTtBQUNuQixpQkFBZSxhQUFhLFFBQVEsT0FBTyxHQUFHO0FBQzlDLGlCQUFlLGFBQWEsS0FBSztBQUNqQyxNQUFJLGFBQWEsV0FBVyxJQUFJLEdBQUc7QUFDakMsbUJBQWUsYUFBYSxNQUFNLENBQUM7QUFBQSxFQUNyQztBQUNBLE1BQUksYUFBYSxXQUFXLEdBQUcsR0FBRztBQUNoQyxtQkFBZSxhQUFhLE1BQU0sQ0FBQztBQUFBLEVBQ3JDO0FBQ0EsU0FBTztBQUNUO0FBRU8sU0FBUyxlQUFlLE9BQStCO0FBQzVELFFBQU0sa0JBQTBDLENBQUM7QUFDakQsYUFBVyxDQUFDLFFBQVEsV0FBVyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDekQsb0JBQWdCLGtCQUFrQixNQUFNLENBQUMsSUFBSTtBQUFBLEVBQy9DO0FBQ0EsU0FBTztBQUNUOzs7QUNITyxTQUFTLFlBQ2QscUJBQ2lCO0FBQ2pCLE1BQUksTUFBTSxRQUFRLG1CQUFtQixFQUFHLFFBQU87QUFDL0MsUUFBTSxrQkFBa0Isb0JBQW9CLGVBQWU7QUFDM0QsTUFBSSxDQUFDLGdCQUFpQixRQUFPO0FBQzdCLE1BQUk7QUFDRixVQUFNLG1CQUFtQixnQkFBZ0I7QUFBQSxNQUN2QztBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxTQUFTLEtBQUssTUFBTSxnQkFBZ0I7QUFDMUMsV0FBTztBQUFBLEVBQ1QsU0FBUyxHQUFRO0FBQ2YsVUFBTSxJQUFJLE1BQU0sa0NBQWtDLEVBQUUsT0FBTyxFQUFFO0FBQUEsRUFDL0Q7QUFDRjtBQUVPLFNBQVMseUJBQXlCLE1BTXZCO0FBQ2hCLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sUUFBUSxVQUFVLGlCQUFpQjtBQUN6QyxNQUFJLENBQUMsTUFBTyxRQUFPO0FBQ25CLFFBQU0sVUFBVSxVQUFVLGlCQUFpQixXQUFXO0FBRXRELFFBQU0sc0JBQXNCLENBQUMsY0FBc0I7QUFDakQsVUFBTSxzQkFBc0Isa0JBQWtCLFNBQVM7QUFDdkQsUUFBSSxzQkFBc0IsSUFBSSxtQkFBbUIsR0FBRztBQUNsRCxhQUFPLHNCQUFzQixJQUFJLG1CQUFtQjtBQUFBLElBQ3REO0FBQ0EsZUFBVyxPQUFPLFlBQVk7QUFDNUIsWUFBTSxVQUFVLEdBQUcsbUJBQW1CLElBQUksR0FBRztBQUM3QyxVQUFJLHNCQUFzQixJQUFJLE9BQU8sR0FBRztBQUN0QyxlQUFPLHNCQUFzQixJQUFJLE9BQU87QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLGFBQVcsQ0FBQyxPQUFPLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBRXBELFVBQU0sY0FBYyxNQUFNLFNBQVMsR0FBRztBQUN0QyxRQUFJLGFBQWE7QUFDZixZQUFNLENBQUMsUUFBUSxNQUFNLElBQUksTUFBTSxNQUFNLEdBQUc7QUFDeEMsVUFDRSxDQUFDLFdBQVcsV0FBVyxNQUFNLEtBQzdCLENBQUMsV0FBVyxTQUFTLFVBQVUsRUFBRSxHQUNqQztBQUNBO0FBQUEsTUFDRjtBQUNBLFlBQU0sWUFBWSxXQUFXO0FBQUEsUUFDM0IsT0FBTztBQUFBLFFBQ1AsV0FBVyxVQUFVLFNBQVMsT0FBTyxTQUFTO0FBQUEsTUFDaEQ7QUFDQSxpQkFBVyxVQUFVLFNBQVM7QUFDNUIsY0FBTSxXQUFXLE9BQU8sUUFBUSxLQUFLLFNBQVM7QUFDOUMsY0FBTSxZQUNKLFdBQVcsQ0FBQyxTQUFTLFdBQVcsSUFBSSxLQUFLLENBQUMsU0FBUyxXQUFXLEdBQUcsSUFDN0QsR0FBRyxPQUFPLElBQUksUUFBUSxLQUN0QjtBQUNOLGNBQU0sV0FBVyxvQkFBb0IsU0FBUztBQUM5QyxZQUFJLFNBQVUsUUFBTztBQUFBLE1BQ3ZCO0FBQUEsSUFDRixPQUFPO0FBQ0wsVUFBSSxlQUFlLE1BQU87QUFDMUIsaUJBQVcsVUFBVSxTQUFTO0FBQzVCLGNBQU0sWUFDSixXQUFXLENBQUMsT0FBTyxXQUFXLElBQUksS0FBSyxDQUFDLE9BQU8sV0FBVyxHQUFHLElBQ3pELEdBQUcsT0FBTyxJQUFJLE1BQU0sS0FDcEI7QUFDTixjQUFNLFdBQVcsb0JBQW9CLFNBQVM7QUFDOUMsWUFBSSxTQUFVLFFBQU87QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsUUFBTSwwQkFBMEIsbUJBQW1CO0FBQUEsSUFDakQ7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBRUQsTUFBSSx3QkFBeUIsUUFBTztBQUVwQyxTQUFPO0FBQ1Q7QUFFTyxTQUFTLG1CQUFtQixNQU1qQjtBQUNoQixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLFVBQVUsVUFBVSxpQkFBaUI7QUFDM0MsTUFBSSxDQUFDLFFBQVMsUUFBTztBQUdyQixRQUFNLFVBQVUsZUFBZTtBQUMvQixRQUFNLG9CQUFvQixHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksVUFBVSxHQUFHO0FBQUEsSUFDOUQ7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0scUJBQXFCLGtCQUFrQixpQkFBaUI7QUFFOUQsTUFBSSxzQkFBc0IsSUFBSSxrQkFBa0IsR0FBRztBQUNqRCxXQUFPLHNCQUFzQixJQUFJLGtCQUFrQjtBQUFBLEVBQ3JEO0FBRUEsYUFBVyxPQUFPLFlBQVk7QUFDNUIsVUFBTSxVQUFVLEdBQUcsa0JBQWtCLElBQUksR0FBRztBQUM1QyxRQUFJLHNCQUFzQixJQUFJLE9BQU8sR0FBRztBQUN0QyxhQUFPLHNCQUFzQixJQUFJLE9BQU87QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxTQUFTLDJCQUNkLFlBQ0EsVUFDUztBQUNULFFBQU0sUUFBUSxVQUFVLGlCQUFpQjtBQUN6QyxNQUFJLENBQUMsTUFBTyxRQUFPO0FBRW5CLGFBQVcsQ0FBQyxLQUFLLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUMzQyxVQUFNLGNBQWMsTUFBTSxTQUFTLEdBQUc7QUFDdEMsUUFBSSxhQUFhO0FBQ2YsWUFBTSxDQUFDLFFBQVEsTUFBTSxJQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ3hDLFVBQUksV0FBVyxXQUFXLE1BQU0sS0FBSyxXQUFXLFNBQVMsVUFBVSxFQUFFLEdBQUc7QUFDdEUsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLGVBQWUsTUFBTyxRQUFPO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOzs7QUN0S0EsT0FBdUI7OztBQ0poQixTQUFTLFFBQVEsTUFBc0I7QUFDNUMsTUFBSSxDQUFDLEtBQU0sUUFBTztBQUdsQixRQUFNLGlCQUFpQixLQUFLLFFBQVEsT0FBTyxHQUFHO0FBRzlDLFFBQU0sWUFBWSxlQUFlLFFBQVEsUUFBUSxFQUFFO0FBR25ELE1BQUksVUFBVSxRQUFRLEdBQUcsTUFBTSxHQUFJLFFBQU87QUFHMUMsU0FBTyxVQUFVLFVBQVUsR0FBRyxVQUFVLFlBQVksR0FBRyxDQUFDLEtBQUs7QUFDL0Q7OztBQ2ZPLFNBQVMsb0JBQW9CLFlBQW9CLEtBQXFCO0FBRTNFLE1BQUksV0FBVyxXQUFXLEtBQUssR0FBRztBQUNoQyxVQUFNLFlBQVksUUFBUSxHQUFHO0FBQzdCLFdBQU8sb0JBQW9CLFdBQVcsTUFBTSxDQUFDLEdBQUcsU0FBUztBQUFBLEVBQzNEO0FBRUEsTUFBSSxXQUFXLFdBQVcsSUFBSSxHQUFHO0FBQy9CLFdBQU8sb0JBQW9CLFdBQVcsTUFBTSxDQUFDLEdBQUcsR0FBRztBQUFBLEVBQ3JEO0FBRUEsTUFBSSxXQUFXLFdBQVcsR0FBRyxHQUFHO0FBQzlCLFdBQU8sV0FBVyxNQUFNLENBQUM7QUFBQSxFQUMzQjtBQUVBLFNBQU8sR0FBRyxHQUFHLElBQUksVUFBVTtBQUM3Qjs7O0FDYk8sSUFBTSxrQkFBa0IsQ0FDN0IsaUJBQ0EscUJBQ0EsS0FDQSxPQUE2RCxDQUFDLE1BQzNEO0FBRUgsUUFBTSxlQUFlLE1BQ2pCLG9CQUFvQixpQkFBaUIsR0FBRyxJQUN4QztBQUVKLFFBQU0sWUFBWSxJQUFJO0FBQUEsSUFDcEIsTUFBTSxRQUFRLG1CQUFtQixJQUM3QixzQkFDQSxPQUFPLEtBQUssbUJBQW1CO0FBQUEsRUFDckM7QUFFQSxNQUFJLFVBQVUsSUFBSSxZQUFZLEdBQUc7QUFDL0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLHdCQUF3QixvQkFBSSxJQUFvQjtBQUN0RCxhQUFXLFlBQVksV0FBVztBQUNoQywwQkFBc0IsSUFBSSxrQkFBa0IsUUFBUSxHQUFHLFFBQVE7QUFBQSxFQUNqRTtBQUVBLFFBQU0seUJBQXlCLGtCQUFrQixZQUFZO0FBRTdELE1BQUksc0JBQXNCLElBQUksc0JBQXNCLEdBQUc7QUFDckQsV0FBTyxzQkFBc0IsSUFBSSxzQkFBc0I7QUFBQSxFQUN6RDtBQUdBLFFBQU0sWUFBWSxDQUFDLE9BQU8sTUFBTSxRQUFRLE1BQU0sT0FBTyxPQUFPLFFBQVEsS0FBSztBQUN6RSxhQUFXLE9BQU8sV0FBVztBQUMzQixVQUFNLG1CQUFtQixHQUFHLHNCQUFzQixJQUFJLEdBQUc7QUFDekQsUUFBSSxzQkFBc0IsSUFBSSxnQkFBZ0IsR0FBRztBQUMvQyxhQUFPLHNCQUFzQixJQUFJLGdCQUFnQjtBQUFBLElBQ25EO0FBQUEsRUFDRjtBQUdBLFFBQU0sV0FBVyxLQUFLLFlBQVk7QUFFbEMsTUFBSSxDQUFDLGdCQUFnQixXQUFXLElBQUksS0FBSyxDQUFDLGdCQUFnQixXQUFXLEtBQUssR0FBRztBQUMzRSxVQUFNLHdCQUF3Qix5QkFBeUI7QUFBQSxNQUNyRCxZQUFZO0FBQUEsTUFDWjtBQUFBLE1BQ0EsWUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUNBLGFBQWEsS0FBSztBQUFBLElBQ3BCLENBQUM7QUFDRCxRQUFJLHNCQUF1QixRQUFPO0FBRWxDLFVBQU0sMEJBQTBCLG1CQUFtQjtBQUFBLE1BQ2pELFlBQVk7QUFBQSxNQUNaO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWjtBQUFBLE1BQ0EsYUFBYSxLQUFLO0FBQUEsSUFDcEIsQ0FBQztBQUNELFFBQUksd0JBQXlCLFFBQU87QUFBQSxFQUN0QztBQUdBLE1BQUksQ0FBQyxnQkFBZ0IsV0FBVyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsV0FBVyxLQUFLLEdBQUc7QUFDM0UsVUFBTSw0QkFBNEIsa0JBQWtCLGVBQWU7QUFDbkUsUUFBSSxzQkFBc0IsSUFBSSx5QkFBeUIsR0FBRztBQUN4RCxhQUFPLHNCQUFzQixJQUFJLHlCQUF5QjtBQUFBLElBQzVEO0FBQ0EsZUFBVyxPQUFPLFdBQVc7QUFDM0IsWUFBTSxtQkFBbUIsR0FBRyx5QkFBeUIsSUFBSSxHQUFHO0FBQzVELFVBQUksc0JBQXNCLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsZUFBTyxzQkFBc0IsSUFBSSxnQkFBZ0I7QUFBQSxNQUNuRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRU8sSUFBTSx5QkFBeUIsQ0FDcEMsaUJBQ0EscUJBQ0EsS0FDQSxPQUE2RCxDQUFDLE1BQzNEO0FBQ0gsUUFBTSxtQkFBbUI7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxNQUFJLENBQUMsa0JBQWtCO0FBQ3JCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsbUJBQW1CLGVBQWU7QUFBQTtBQUFBLEVBQTBCLE9BQU8sS0FBSyxtQkFBbUIsRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3pHO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDs7O0FDM0dPLElBQU0scUJBQXFCLENBQUMsU0FBMkI7QUFFNUQsUUFBTSxjQUNKO0FBQ0YsUUFBTSxVQUFvQixDQUFDO0FBQzNCLE1BQUk7QUFHSixVQUFRLFFBQVEsWUFBWSxLQUFLLElBQUksT0FBTyxNQUFNO0FBQ2hELFVBQU0sWUFBWSxNQUFNLENBQUM7QUFDekIsUUFBSSxzQkFBc0IsS0FBSyxTQUFTLEdBQUc7QUFDekM7QUFBQSxJQUNGO0FBQ0EsWUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDdkI7QUFHQSxRQUFNLGdCQUNKO0FBQ0YsTUFBSTtBQUVKLFVBQVEsZ0JBQWdCLGNBQWMsS0FBSyxJQUFJLE9BQU8sTUFBTTtBQUMxRCxVQUFNLFlBQVksY0FBYyxDQUFDO0FBQ2pDLFFBQUksc0JBQXNCLEtBQUssU0FBUyxHQUFHO0FBQ3pDO0FBQUEsSUFDRjtBQUNBLFlBQVEsS0FBSyxjQUFjLENBQUMsQ0FBQztBQUFBLEVBQy9CO0FBRUEsU0FBTztBQUNUOzs7QUM1Qk8sU0FBUyxlQUNkLGNBQ0Esb0JBQ0EsS0FDQTtBQUNBO0FBQUMsRUFBQyxXQUFtQixzQkFBc0IsQ0FBQyxTQUFpQjtBQUMzRCxVQUFNLG1CQUFtQixnQkFBZ0IsTUFBTSxvQkFBb0IsR0FBRztBQUV0RSxVQUFNLHNCQUNKLG9CQUFvQixtQkFBbUIsZ0JBQWdCO0FBRXpELFFBQUksQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMscUJBQXFCO0FBQ3JELFlBQU0sSUFBSSxNQUFNLFdBQVcsSUFBSSxlQUFlLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxFQUFFO0FBQUEsSUFDMUU7QUFFQSxVQUFNLE1BQ0osbUJBQW1CLElBQUksS0FBSyxtQkFBbUIsZ0JBQWlCO0FBQ2xFLFdBQU8sSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNwQixJQUFJLFFBQVEsTUFBTTtBQUNoQixZQUFJLEVBQUUsUUFBUSxTQUFTO0FBQ3JCLGNBQUksU0FBUyxXQUFXO0FBQ3RCLGdCQUFJLE9BQU8sWUFBWSxRQUFXO0FBQ2hDLHFCQUFPLE9BQU87QUFBQSxZQUNoQjtBQUVBLGdCQUFJLE9BQU8sWUFBWTtBQUNyQixxQkFBTztBQUFBLFlBQ1Q7QUFFQSxnQkFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLFdBQVcsVUFBVTtBQUM5RCxxQkFBTztBQUFBLFlBQ1Q7QUFFQSxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLFNBQVMsY0FBYztBQUN6QixtQkFBTztBQUFBLFVBQ1Q7QUFFQSxnQkFBTSxJQUFJO0FBQUEsWUFDUixjQUFjLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixJQUFJO0FBQUEsVUFDekQ7QUFBQSxRQUNGO0FBRUEsZUFBTyxPQUFPLElBQTJCO0FBQUEsTUFDM0M7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtuQixZQUFZO0FBQUEsa0JBQ0UsS0FBSztBQUNyQixTQUFPLFNBQVMsWUFBWSxFQUFFLEtBQUssVUFBVTtBQUMvQzs7O0FDdERBLE9BQU9BLFlBQVc7OztBQ05YLElBQU0sMEJBQTBCO0FBQUEsRUFDckM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFTyxJQUFNLG9CQUFvQixDQUFDLFNBQ2hDLHdCQUF3QixLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxDQUFDOzs7QUNUMUQsU0FBUyxpQkFBcUQ7QUFFOUQsSUFBTSxnQkFBZ0Isb0JBQUksSUFBSSxDQUFDLE9BQU8sUUFBUSxRQUFRLE1BQU0sQ0FBQztBQUM3RCxJQUFNLGlCQUFpQixvQkFBSSxJQUFJLENBQUMsUUFBUSxRQUFRLEtBQUssQ0FBQztBQUN0RCxJQUFNLHlCQUNKO0FBRUYsSUFBTSx1QkFBdUIsQ0FBQyxTQUM1QixLQUFLLFFBQVEsd0JBQXdCLEVBQUU7QUFFekMsSUFBTSxvQkFBb0IsQ0FBQyxhQUFxQjtBQUM5QyxRQUFNLGFBQWEsU0FBUyxRQUFRLEdBQUc7QUFDdkMsUUFBTSxZQUFZLFNBQVMsUUFBUSxHQUFHO0FBRXRDLE1BQUksV0FBVyxTQUFTO0FBRXhCLE1BQUksZUFBZSxNQUFNLGNBQWMsSUFBSTtBQUN6QyxlQUFXLEtBQUssSUFBSSxZQUFZLFNBQVM7QUFBQSxFQUMzQyxXQUFXLGVBQWUsSUFBSTtBQUM1QixlQUFXO0FBQUEsRUFDYixXQUFXLGNBQWMsSUFBSTtBQUMzQixlQUFXO0FBQUEsRUFDYjtBQUVBLFNBQU8sU0FBUyxNQUFNLEdBQUcsUUFBUTtBQUNuQztBQUVBLElBQU0sZUFBZSxDQUFDLGFBQXFCO0FBQ3pDLFFBQU0saUJBQWlCLGtCQUFrQixRQUFRO0FBQ2pELFFBQU0sZUFBZSxlQUFlLFlBQVksR0FBRztBQUVuRCxNQUFJLGlCQUFpQixJQUFJO0FBQ3ZCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxpQkFBaUIsS0FBSztBQUFBLElBQzFCLGVBQWUsWUFBWSxHQUFHO0FBQUEsSUFDOUIsZUFBZSxZQUFZLElBQUk7QUFBQSxFQUNqQztBQUVBLE1BQUksaUJBQWlCLGNBQWM7QUFDakMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsTUFBTSxZQUFZLEVBQUUsWUFBWTtBQUN4RDtBQUVBLElBQU0sMkJBQTJCLENBQUMsYUFBcUI7QUFDckQsUUFBTSxZQUFZLGFBQWEsUUFBUTtBQUV2QyxRQUFNLGFBQWlDLENBQUMsU0FBUztBQUVqRCxNQUFJLGNBQWMsSUFBSSxTQUFTLEdBQUc7QUFDaEMsZUFBVyxRQUFRLFlBQVk7QUFBQSxFQUNqQztBQUVBLE1BQUksZUFBZSxJQUFJLFNBQVMsR0FBRztBQUNqQyxlQUFXLEtBQUssS0FBSztBQUFBLEVBQ3ZCO0FBRUEsU0FBTztBQUNUO0FBRU8sSUFBTSx1QkFBdUIsQ0FBQyxNQUFjLGFBQXFCO0FBQ3RFLFFBQU0sYUFBYSx5QkFBeUIsUUFBUTtBQUNwRCxRQUFNLGdCQUFnQixxQkFBcUIsSUFBSTtBQUMvQyxRQUFNLEVBQUUsTUFBTSxnQkFBZ0IsSUFBSSxVQUFVLGVBQWU7QUFBQSxJQUN6RDtBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1o7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPO0FBQ1Q7OztBRmhFQSxTQUFTLG1DQUFtQztBQUU1QyxJQUFNQyxTQUFRQyxPQUFNLDZCQUE2QjtBQUUxQyxJQUFNLGtCQUFrQixPQUM3QixZQUNBLEtBQ0EsUUFBUSxNQUNMO0FBQ0gsRUFBQUQsT0FBTSxnQ0FBZ0M7QUFBQSxJQUNwQztBQUFBLEVBQ0YsQ0FBQztBQUVELFFBQU0sRUFBRSxPQUFPLG9CQUFvQixhQUFhLG1CQUFtQixJQUFJO0FBRXZFLFFBQU0sU0FBUyx1QkFBdUIsWUFBWSxPQUFPLFFBQVc7QUFBQSxJQUNsRSxVQUFVLElBQUk7QUFBQSxFQUNoQixDQUFDO0FBQ0QsRUFBQUEsT0FBTSxXQUFXLE1BQU07QUFDdkIsTUFBSSxtQkFBbUIsSUFBSSxNQUFNLEdBQUc7QUFDbEMsVUFBTSxrQkFBa0IsWUFBWSxRQUFRLE1BQU07QUFDbEQsVUFBTSxZQUNKLG1CQUFtQixJQUNmLFlBQVksTUFBTSxlQUFlLEVBQUUsT0FBTyxNQUFNLElBQ2hELENBQUMsR0FBRyxhQUFhLE1BQU07QUFDN0IsVUFBTSxJQUFJO0FBQUEsTUFDUixpREFBaUQsTUFBTTtBQUFBO0FBQUEsRUFBbUQsVUFBVTtBQUFBLFFBQ2xIO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsSUFBSSxNQUFNLE1BQU0sR0FBRztBQUN0QixJQUFBQSxPQUFNLDhCQUE4QixNQUFNO0FBQzFDLFVBQU0sSUFBSSxNQUFNLFNBQVMsTUFBTSxhQUFhO0FBQUEsRUFDOUM7QUFDQSxRQUFNLGNBQWMsTUFBTSxNQUFNO0FBQ2hDLEVBQUFBLE9BQU0sZ0JBQWdCLGFBQWEsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUNoRCxxQkFBbUIsSUFBSSxNQUFNO0FBQzdCLGNBQVksS0FBSyxNQUFNO0FBQ3ZCLE1BQUk7QUFDRixRQUFJLE9BQU8sU0FBUyxPQUFPLEdBQUc7QUFDNUIsWUFBTSxXQUFXLEtBQUssTUFBTSxXQUFXO0FBQ3ZDLHlCQUFtQixNQUFNLElBQUk7QUFBQSxRQUMzQixZQUFZO0FBQUEsUUFDWixTQUFTO0FBQUEsTUFDWDtBQUFBLElBQ0YsV0FBVyxPQUFPLFNBQVMsWUFBWSxHQUFHO0FBQ3hDLFlBQU0sWUFBWSxJQUFJLDRCQUE0QjtBQUNsRCxnQkFBVSxRQUFRLFFBQVEsV0FBVztBQUNyQyxnQkFBVSxpQkFBaUI7QUFDM0IsWUFBTSxjQUFjLFVBQVUsVUFBVTtBQUN4Qyx5QkFBbUIsTUFBTSxJQUFJO0FBQUEsUUFDM0IsWUFBWTtBQUFBLFFBQ1o7QUFBQSxNQUNGO0FBQUEsSUFDRixXQUFXLGtCQUFrQixNQUFNLEdBQUc7QUFDcEMsVUFBSTtBQUVKLFVBQUksZ0JBQWdCLG9CQUFvQjtBQUV0QyxjQUFNLGlCQUFpQixJQUFJLFFBQVE7QUFDbkMsb0JBQVksR0FBRyxnQkFBZ0Isa0JBQWtCLEVBQUUsSUFDakQsT0FBTyxXQUFXLElBQUksSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLE1BQzlDO0FBQUEsTUFDRixPQUFPO0FBRUwsY0FBTSxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRztBQUFBLFVBQ25DLE1BQU0sT0FBTyxTQUFTLFlBQVksSUFDOUIsZUFDQTtBQUFBLFFBQ04sQ0FBQztBQUNELG9CQUFZLElBQUksZ0JBQWdCLElBQUk7QUFBQSxNQUN0QztBQUVBLHlCQUFtQixNQUFNLElBQUk7QUFBQSxRQUMzQixZQUFZO0FBQUEsUUFDWixTQUFTO0FBQUEsTUFDWDtBQUFBLElBQ0YsV0FBVyxPQUFPLFNBQVMsTUFBTSxLQUFLLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFDNUQsWUFBTSxjQUFjLG1CQUFtQixXQUFXO0FBRWxELGlCQUFXRSxlQUFjLGFBQWE7QUFDcEMsWUFBSSxDQUFDLG1CQUFtQkEsV0FBVSxHQUFHO0FBQ25DLGdCQUFNLGVBQWVBLGFBQVksS0FBSyxRQUFRLEdBQUc7QUFBQSxZQUMvQyxLQUFLLFFBQVEsTUFBTTtBQUFBLFVBQ3JCLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUVBLFVBQUk7QUFDRixjQUFNLGtCQUFrQixxQkFBcUIsYUFBYSxNQUFNO0FBQ2hFLFFBQUFGLE9BQU0sK0JBQStCO0FBQUEsVUFDbkMsTUFBTSxnQkFBZ0IsTUFBTSxHQUFHLEdBQUc7QUFBQSxVQUNsQyxTQUFTLFFBQVEsTUFBTTtBQUFBLFFBQ3pCLENBQUM7QUFDRCxjQUFNLGtCQUFrQjtBQUFBLFVBQ3RCO0FBQUEsVUFDQTtBQUFBLFVBQ0EsUUFBUSxNQUFNO0FBQUEsUUFDaEI7QUFDQSxRQUFBQSxPQUFNLG9CQUFvQjtBQUFBLFVBQ3hCO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUNELDJCQUFtQixNQUFNLElBQUksZ0JBQWdCO0FBQUEsTUFDL0MsU0FBUyxPQUFZO0FBQ25CLGNBQU0sSUFBSTtBQUFBLFVBQ1IsK0JBQStCLFVBQVUsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUM5RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLFdBQVcsT0FBTyxTQUFTLEtBQUssR0FBRztBQUVqQyx5QkFBbUIsTUFBTSxJQUFJO0FBQUEsUUFDM0IscUJBQXFCLGFBQWEsTUFBTTtBQUFBLFFBQ3hDO0FBQUEsUUFDQSxRQUFRLE1BQU07QUFBQSxNQUNoQixFQUFFO0FBQUEsSUFDSixPQUFPO0FBQ0wsWUFBTSxJQUFJO0FBQUEsUUFDUiwrQkFBK0IsT0FBTyxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxNQUFNO0FBQUEsTUFDeEU7QUFBQSxJQUNGO0FBQUEsRUFDRixVQUFFO0FBQ0EsZ0JBQVksSUFBSTtBQUNoQix1QkFBbUIsT0FBTyxNQUFNO0FBQUEsRUFDbEM7QUFDRjs7O0FHcklBLGVBQXNCLGNBQ3BCLFlBQ0EsS0FDQSxRQUFRLEdBQ1I7QUFDQSxRQUFNLEVBQUUsbUJBQW1CLElBQUk7QUFDL0IsUUFBTSxrQkFBa0IsV0FBVyxRQUFRLFVBQVUsRUFBRSxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBRXpFLFFBQU0sRUFBRSxLQUFLLE1BQU0sSUFBSSxNQUFNLFdBQzFCLE1BQU0sR0FBRyxJQUFJLGNBQWMsSUFBSSxlQUFlLEVBQUUsRUFDaEQsS0FBSyxPQUFPLFNBQVMsRUFBRSxLQUFLLE1BQU0sSUFBSSxLQUFLLEdBQUcsT0FBTyxLQUFLLEVBQUUsRUFDNUQsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsS0FBSyxLQUFLLEVBQUU7QUFFekMsTUFBSSxPQUFPO0FBQ1QsWUFBUSxNQUFNLHlCQUF5QixZQUFZLEtBQUs7QUFDeEQ7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNGLHVCQUFtQixVQUFVLElBQUk7QUFBQSxNQUMvQjtBQUFBLE1BQ0E7QUFBQSxJQUNGLEVBQUU7QUFBQSxFQUNKLFNBQVMsR0FBRztBQUNWLFlBQVEsTUFBTSwyQkFBMkIsQ0FBQztBQUFBLEVBQzVDO0FBQ0Y7OztBQ2RBLFNBQVMsY0FDUCxZQUNBLE9BQ0EsVUFDdUI7QUFDdkIsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFlBQVksQ0FBQyxPQUFPLFFBQVEsT0FBTyxRQUFRLE9BQU87QUFBQSxJQUNsRDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixpQkFBeUIsS0FBNEI7QUFDNUUsUUFBTSxrQkFBa0IsR0FBRyxlQUFlO0FBQzFDLE1BQUksQ0FBQyxJQUFJLE1BQU0sZUFBZSxFQUFHLFFBQU87QUFDeEMsTUFBSTtBQUNGLFdBQU8sS0FBSyxNQUFNLElBQUksTUFBTSxlQUFlLENBQUM7QUFBQSxFQUM5QyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMseUJBQ1AsTUFDQSxLQUNlO0FBQ2YsTUFBSSxJQUFJLE1BQU0sSUFBSSxFQUFHLFFBQU87QUFFNUIsYUFBVyxPQUFPLElBQUksWUFBWTtBQUNoQyxVQUFNLGNBQWMsS0FBSyxRQUFRLGdCQUFnQixFQUFFLElBQUk7QUFDdkQsUUFBSSxJQUFJLE1BQU0sV0FBVyxFQUFHLFFBQU87QUFBQSxFQUNyQztBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsa0JBQ1AsaUJBQ0EsWUFDQSxLQUNlO0FBQ2YsUUFBTSxpQkFBaUIsR0FBRyxlQUFlLElBQUksV0FBVyxRQUFRLFNBQVMsRUFBRSxDQUFDO0FBQzVFLFNBQU8seUJBQXlCLGdCQUFnQixHQUFHO0FBQ3JEO0FBRUEsU0FBUyxzQkFDUCxpQkFDQSxhQUNBLGVBQ0EsS0FDZTtBQUNmLE1BQUksQ0FBQyxZQUFZLFFBQVMsUUFBTztBQUdqQyxRQUFNLGdCQUFnQixZQUFZLFFBQVEsR0FBRztBQUM3QyxNQUFJLGtCQUFrQixNQUFNLGVBQWU7QUFDekMsUUFBSSxPQUFPLGtCQUFrQixVQUFVO0FBQ3JDLFlBQU0sV0FBVyxrQkFBa0IsaUJBQWlCLGVBQWUsR0FBRztBQUN0RSxVQUFJLFNBQVUsUUFBTztBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUdBLFFBQU0sZ0JBQWdCLGdCQUNsQixZQUFZLFFBQVEsS0FBSyxhQUFhLEVBQUUsSUFDeEM7QUFDSixNQUFJLGlCQUFpQixPQUFPLGtCQUFrQixVQUFVO0FBQ3RELFVBQU0sV0FBVyxrQkFBa0IsaUJBQWlCLGVBQWUsR0FBRztBQUN0RSxRQUFJLFNBQVUsUUFBTztBQUFBLEVBQ3ZCO0FBR0EsUUFBTSxlQUFlLFlBQVksUUFBUSxRQUFRO0FBQ2pELE1BQ0Usa0JBQWtCLE1BQ2xCLGdCQUNBLE9BQU8saUJBQWlCLFVBQ3hCO0FBQ0EsVUFBTSxXQUFXLGtCQUFrQixpQkFBaUIsY0FBYyxHQUFHO0FBQ3JFLFFBQUksU0FBVSxRQUFPO0FBQUEsRUFDdkI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHlCQUNQLGlCQUNBLGFBQ0EsS0FDZTtBQUNmLFFBQU0sYUFBYSxZQUFZLFVBQVUsWUFBWSxRQUFRO0FBQzdELFFBQU0sV0FBVyxHQUFHLGVBQWUsSUFBSSxVQUFVO0FBQ2pELFNBQU8seUJBQXlCLFVBQVUsR0FBRztBQUMvQztBQUVBLFNBQVMscUJBQ1AsaUJBQ0EsZUFDQSxLQUNlO0FBQ2YsTUFBSSxDQUFDLGVBQWU7QUFFbEIsZUFBVyxPQUFPLElBQUksWUFBWTtBQUNoQyxZQUFNLFlBQVksR0FBRyxlQUFlLFNBQVMsR0FBRztBQUNoRCxVQUFJLElBQUksTUFBTSxTQUFTLEVBQUcsUUFBTztBQUFBLElBQ25DO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFdBQVcsR0FBRyxlQUFlLElBQUksYUFBYTtBQUNwRCxRQUFNLGNBQWMseUJBQXlCLFVBQVUsR0FBRztBQUMxRCxNQUFJLFlBQWEsUUFBTztBQUd4QixhQUFXLE9BQU8sSUFBSSxZQUFZO0FBQ2hDLFVBQU0sWUFBWSxHQUFHLFFBQVEsU0FBUyxHQUFHO0FBQ3pDLFFBQUksSUFBSSxNQUFNLFNBQVMsRUFBRyxRQUFPO0FBQUEsRUFDbkM7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHdCQUNQLFlBQ0EsS0FDZTtBQUNmLFFBQU0sY0FBYyxJQUFJLFdBQVcsTUFBTSxHQUFHO0FBQzVDLFFBQU0sUUFBUSxZQUFZLENBQUMsRUFBRSxXQUFXLEdBQUcsSUFDdkMsWUFBWSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUNoQyxZQUFZLENBQUM7QUFDakIsUUFBTSxnQkFBZ0IsWUFBWSxNQUFNLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHO0FBQzdFLFFBQU0sa0JBQWtCLEdBQUcsY0FBYyxNQUFNLEtBQUssR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLEtBQUs7QUFHekYsUUFBTSxjQUFjLGdCQUFnQixpQkFBaUIsR0FBRztBQUN4RCxNQUFJLGFBQWE7QUFFZixVQUFNLG9CQUFvQjtBQUFBLE1BQ3hCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUNBLFFBQUksa0JBQW1CLFFBQU87QUFHOUIsVUFBTSx1QkFBdUI7QUFBQSxNQUMzQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUNBLFFBQUkscUJBQXNCLFFBQU87QUFBQSxFQUNuQztBQUdBLFFBQU0sMEJBQTBCO0FBQUEsSUFDOUI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxNQUFJLHdCQUF5QixRQUFPO0FBR3BDLFFBQU0sYUFBYSxRQUFRLFVBQVU7QUFDckMsTUFBSSxjQUFjLGVBQWUsWUFBWTtBQUMzQyxXQUFPLHdCQUF3QixZQUFZLEdBQUc7QUFBQSxFQUNoRDtBQUVBLFNBQU87QUFDVDtBQUVPLFNBQVMsa0JBQ2QsWUFDQSxPQUNBLFVBQ2U7QUFDZixRQUFNLE1BQU0sY0FBYyxZQUFZLE9BQU8sUUFBUTtBQUNyRCxTQUFPLHdCQUF3QixJQUFJLFVBQVUsR0FBRztBQUNsRDs7O0FDN0xBLE9BQU9HLFlBQVc7QUFFbEIsSUFBTUMsU0FBUUQsT0FBTSw4QkFBOEI7QUFFM0MsSUFBTSxtQkFBbUIsT0FDOUIsWUFDQSxLQUNBLFFBQVEsTUFDTDtBQUNILFFBQU0sRUFBRSxtQkFBbUIsSUFBSTtBQUUvQixNQUFJLG1CQUFtQixVQUFVLEdBQUc7QUFDbEM7QUFBQSxFQUNGO0FBRUEsUUFBTSx5QkFBeUIsa0JBQWtCLFlBQVksSUFBSSxPQUFPLEVBQUU7QUFFMUUsTUFBSSxDQUFDLHdCQUF3QjtBQUMzQixVQUFNLFdBQVcsSUFBSSxTQUFTO0FBQzlCLFFBQUksVUFBVSxxQkFBcUI7QUFDakMsTUFBQUMsT0FBTSwwQkFBMEIsVUFBVSw2QkFBNkI7QUFFdkUsVUFBSTtBQUNGLGNBQU0sY0FBYyxNQUFNLFNBQVMsb0JBQW9CLFVBQVU7QUFFakUsWUFBSSxhQUFhO0FBQ2YsVUFBQUEsT0FBTSwwQkFBMEIsVUFBVSwyQkFBMkI7QUFJckUsZ0JBQU0sZ0JBQWdCLGdCQUFnQixVQUFVO0FBQ2hELGNBQUksTUFBTSxhQUFhLElBQUk7QUFHM0IsZ0JBQU0sZ0JBQWdCLGVBQWUsS0FBSyxLQUFLO0FBRy9DLDZCQUFtQixVQUFVLElBQUksbUJBQW1CLGFBQWE7QUFHakUsZ0JBQU1DLGtCQUFpQixjQUFjLFFBQVEsbUJBQW1CLEVBQUU7QUFDbEUsNkJBQW1CQSxlQUFjLElBQUksbUJBQW1CLGFBQWE7QUFFckU7QUFBQSxRQUNGO0FBRUEsUUFBQUQsT0FBTSwwQ0FBMEMsVUFBVSxHQUFHO0FBQUEsTUFDL0QsU0FBUyxPQUFPO0FBQ2QsUUFBQUEsT0FBTSxtQ0FBbUMsVUFBVSxNQUFNLEtBQUs7QUFBQSxNQUNoRTtBQUFBLElBQ0Y7QUFFQSxVQUFNLElBQUksTUFBTSxnQkFBZ0IsVUFBVSxhQUFhO0FBQUEsRUFDekQ7QUFHQSxRQUFNLGdCQUFnQix3QkFBd0IsS0FBSyxLQUFLO0FBR3hELHFCQUFtQixVQUFVLElBQUksbUJBQW1CLHNCQUFzQjtBQUcxRSxRQUFNLGlCQUFpQix1QkFBdUIsUUFBUSxtQkFBbUIsRUFBRTtBQUMzRSxxQkFBbUIsY0FBYyxJQUMvQixtQkFBbUIsc0JBQXNCO0FBRzNDLE1BQ0UsdUJBQXVCLFNBQVMsWUFBWSxLQUM1Qyx1QkFBdUIsU0FBUyxXQUFXLEtBQzNDLHVCQUF1QixTQUFTLFdBQVcsR0FDM0M7QUFDQSxVQUFNLFVBQVUsdUJBQXVCLFFBQVEsdUJBQXVCLEVBQUU7QUFDeEUsVUFBTSxvQkFBb0IsUUFBUSxRQUFRLG1CQUFtQixFQUFFO0FBQy9ELHVCQUFtQixpQkFBaUIsSUFDbEMsbUJBQW1CLHNCQUFzQjtBQUczQyxRQUFJLGtCQUFrQixXQUFXLEdBQUcsR0FBRztBQUNyQyxZQUFNLGFBQWEsa0JBQWtCLE1BQU0sR0FBRztBQUM5QyxVQUFJLFdBQVcsVUFBVSxHQUFHO0FBQzFCLGNBQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUM7QUFDcEQsMkJBQW1CLFVBQVUsSUFDM0IsbUJBQW1CLHNCQUFzQjtBQUFBLE1BQzdDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FDdkZBLE9BQU9FLFlBQVc7QUFLbEIsSUFBTUMsU0FBUUMsT0FBTSw4QkFBOEI7QUFFbEQsU0FBUywrQkFBK0IsS0FBYTtBQUNuRCxRQUFNLFNBQVM7QUFDZixNQUFJLElBQUksV0FBVyxNQUFNLEdBQUc7QUFDMUIsV0FBTyxJQUFJLFVBQVUsT0FBTyxNQUFNLEVBQUUsUUFBUSxZQUFZLEVBQUU7QUFBQSxFQUM1RDtBQUNBLFNBQU87QUFDVDtBQUVBLGVBQXNCLGlCQUNwQixZQUNBLEtBQ0EsUUFBUSxHQUNSO0FBQ0EsRUFBQUQsT0FBTSwwQkFBMEIsVUFBVSxFQUFFO0FBQzVDLFFBQU0sRUFBRSxtQkFBbUIsSUFBSTtBQUUvQixNQUFJLG1CQUFtQixVQUFVLEVBQUc7QUFFcEMsUUFBTSxZQUFZLGdDQUFnQyxVQUFVO0FBRTVELE1BQUk7QUFDSixRQUFNLEVBQUUsU0FBUyxNQUFNLElBQUksTUFBTSxXQUM5QixNQUFNLFNBQVMsRUFDZixLQUFLLE9BQU8sUUFBUTtBQUNuQixlQUFXLElBQUk7QUFDZixRQUFJLENBQUMsSUFBSTtBQUNQLFlBQU0sSUFBSTtBQUFBLFFBQ1Isb0JBQW9CLFVBQVUsb0JBQW9CLElBQUksVUFBVTtBQUFBO0FBQUEsRUFBTyxJQUFJLE9BQU8sY0FBYyxDQUFDO0FBQUEsTUFDbkc7QUFDRixXQUFPLEVBQUUsU0FBUyxNQUFNLElBQUksS0FBSyxHQUFHLE9BQU8sS0FBSztBQUFBLEVBQ2xELENBQUMsRUFDQSxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxTQUFTLEtBQUssRUFBRTtBQUU3QyxNQUFJLE9BQU87QUFDVCxZQUFRLE1BQU0sNkJBQTZCLFlBQVksS0FBSztBQUM1RCxVQUFNO0FBQUEsRUFDUjtBQUVBLFFBQU0sa0JBQWtCLCtCQUErQixRQUFTO0FBQ2hFLFFBQU0sTUFBTSxRQUFRLGVBQWU7QUFFbkMsUUFBTSxjQUFjLG1CQUFtQixPQUFRO0FBQy9DLGFBQVcsaUJBQWlCLGFBQWE7QUFDdkMsUUFBSSxDQUFDLG1CQUFtQixhQUFhLEdBQUc7QUFDdEMsWUFBTSxlQUFlLGVBQWUsS0FBSyxRQUFRLEdBQUc7QUFBQSxRQUNsRDtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBRUEsUUFBTSxrQkFBa0I7QUFBQSxJQUN0QjtBQUFBLElBQ0EsbUJBQW1CO0FBQUEsRUFDckI7QUFDQSxNQUFJO0FBQ0YsVUFBTSxVQUFVO0FBQUEsTUFDZDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixFQUFFO0FBQ0YsdUJBQW1CLFVBQVUsSUFBSTtBQUNqQyx1QkFBbUIsZUFBZSxJQUFJO0FBQ3RDLHVCQUFtQixRQUFTLElBQUk7QUFBQSxFQUNsQyxTQUFTLEdBQVE7QUFDZixVQUFNLElBQUk7QUFBQSxNQUNSLCtCQUErQixVQUFVLE1BQU0sRUFBRSxPQUFPO0FBQUE7QUFBQSxFQUFPLElBQUksT0FBTyxjQUFjLENBQUM7QUFBQSxJQUMzRjtBQUFBLEVBQ0Y7QUFDRjs7O0FDbkVBLE9BQU9FLFlBQVc7QUFFbEIsSUFBTUMsU0FBUUQsT0FBTSw0QkFBNEI7QUFFaEQsZUFBc0IsZUFDcEIsWUFDQSxLQUNBLFFBQVEsR0FDUixPQUVJLENBQUMsR0FDTDtBQUNBLEVBQUFDLE9BQU0sK0JBQStCO0FBQUEsSUFDbkM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNELE1BQUksT0FBTztBQUFBLElBQ1QsbUJBQW1CLFVBQVUsYUFBYSxLQUFLLEdBQUcsYUFBYSxLQUFLO0FBQUEsRUFDdEU7QUFFQSxFQUFBQSxPQUFNLEdBQUcsS0FBSyxPQUFPLEtBQUssQ0FBQyxnQkFBTSxVQUFVO0FBQzNDLFFBQU0sRUFBRSxtQkFBbUIsSUFBSTtBQUUvQixNQUFJLG1CQUFtQixVQUFVLEdBQUc7QUFDbEMsUUFBSSxPQUFPLEtBQUssV0FBVyxVQUFVLDRCQUE0QjtBQUNqRTtBQUFBLEVBQ0Y7QUFDQSxNQUFJLFdBQVcsV0FBVyxJQUFJLEtBQUssbUJBQW1CLFdBQVcsTUFBTSxDQUFDLENBQUMsR0FBRztBQUMxRSxRQUFJLE9BQU8sS0FBSyxXQUFXLFVBQVUsNEJBQTRCO0FBQ2pFO0FBQUEsRUFDRjtBQUVBLE1BQUksUUFBUSxJQUFJO0FBQ2QsVUFBTSxJQUFJO0FBQUEsTUFDUixtREFBbUQsSUFBSSxZQUFZLEtBQUssTUFBTSxDQUFDO0FBQUEsSUFDakY7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXLFdBQVcsT0FBTyxHQUFHO0FBQ2xDLFVBQU0sVUFBVSxXQUFXLFFBQVEsWUFBWSxFQUFFLEVBQUUsUUFBUSxZQUFZLEVBQUU7QUFDekUsUUFBSSxPQUFPLEtBQUsscUJBQXFCLE9BQU8sSUFBSTtBQUNoRCxVQUFNLGlCQUFpQixTQUFTLEtBQUssS0FBSztBQUMxQyxVQUFNLE1BQU0sbUJBQW1CLE9BQU87QUFDdEMsUUFBSSxLQUFLO0FBQ1AseUJBQW1CLFVBQVUsSUFBSTtBQUFBLElBQ25DO0FBQ0E7QUFBQSxFQUNGO0FBR0EsTUFBSSxjQUFjO0FBQ2xCLE1BQUksSUFBSSxZQUFZLEtBQUssS0FBSztBQUc1QixVQUFNLG1CQUFtQixLQUFLLElBQUksTUFBTSx5QkFBeUI7QUFDakUsUUFBSSxrQkFBa0I7QUFDcEIsb0JBQWMsaUJBQWlCLENBQUM7QUFBQSxJQUNsQztBQUFBLEVBQ0Y7QUFFQSxRQUFNLDBCQUEwQjtBQUFBLElBQzlCO0FBQUEsSUFDQSxJQUFJO0FBQUEsSUFDSixLQUFLO0FBQUEsSUFDTCxFQUFFLFVBQVUsSUFBSSxVQUFVLFlBQVk7QUFBQSxFQUN4QztBQUNBLE1BQUkseUJBQXlCO0FBQzNCLFFBQUksT0FBTyxLQUFLLG9CQUFvQix1QkFBdUIsSUFBSTtBQUMvRCxVQUFNLGdCQUFnQix5QkFBeUIsS0FBSyxLQUFLO0FBRXpELFFBQUksZUFBZSx5QkFBeUI7QUFDMUMseUJBQW1CLFVBQVUsSUFDM0IsbUJBQW1CLHVCQUF1QjtBQUFBLElBQzlDO0FBQ0E7QUFBQSxFQUNGO0FBSUEsUUFBTSxXQUFXLElBQUksWUFBWSxZQUFZLElBQUksS0FBSztBQUN0RCxNQUFJLENBQUMsSUFBSSxZQUFZLFVBQVU7QUFDN0IsUUFBSSxXQUFXO0FBQUEsRUFDakI7QUFDQSxNQUFJLDJCQUEyQixZQUFZLFFBQVEsR0FBRztBQUNwRCxVQUFNLElBQUk7QUFBQSxNQUNSLFdBQVcsVUFBVSxnRkFBZ0YsS0FBSyxNQUFNLG9CQUFvQixLQUFLLEdBQUcsTUFBTSxFQUFFO0FBQUE7QUFBQSxFQUFPLElBQUksT0FBTyxjQUFjLENBQUM7QUFBQSxJQUN2TDtBQUFBLEVBQ0Y7QUFHQSxRQUFNLHlCQUF5QjtBQUFBLElBQzdCO0FBQUEsSUFDQSxJQUFJO0FBQUEsSUFDSixLQUFLLE9BQU87QUFBQSxFQUNkO0FBQ0EsTUFBSSx3QkFBd0I7QUFDMUIsUUFBSSxPQUFPLEtBQUssMkJBQTJCLHNCQUFzQixHQUFHO0FBQ3BFLFFBQUksT0FBTyxLQUFLLHFCQUFxQixVQUFVLElBQUk7QUFDbkQsV0FBTyxpQkFBaUIsWUFBWSxLQUFLLEtBQUs7QUFBQSxFQUNoRDtBQUlBLE1BQ0UsQ0FBQyxXQUFXLFdBQVcsR0FBRyxLQUMxQixDQUFDLFdBQVcsV0FBVyxHQUFHLEtBQzFCLENBQUMsV0FBVyxXQUFXLFFBQVEsR0FDL0I7QUFDQSxVQUFNLFdBQVcsSUFBSSxTQUFTO0FBQzlCLFFBQUksVUFBVSxxQkFBcUI7QUFDakMsVUFBSSxPQUFPO0FBQUEsUUFDVCxxQkFBcUIsVUFBVTtBQUFBLE1BQ2pDO0FBQ0EsVUFBSTtBQUNGLGNBQU0saUJBQWlCLFlBQVksS0FBSyxLQUFLO0FBQzdDO0FBQUEsTUFDRixTQUFTLE9BQU87QUFDZCxZQUFJLE9BQU87QUFBQSxVQUNULG1DQUFtQyxVQUFVO0FBQUEsUUFDL0M7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLFdBQVcsV0FBVyxRQUFRLEdBQUc7QUFDbkMsUUFBSSxPQUFPLEtBQUssa0JBQWtCLFVBQVUsSUFBSTtBQUNoRCxXQUFPLGNBQWMsWUFBWSxLQUFLLEtBQUs7QUFBQSxFQUM3QztBQUVBLE1BQUksQ0FBQyxXQUFXLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxXQUFXLEdBQUcsR0FBRztBQUM5RCxRQUFJLE9BQU8sS0FBSyxxQkFBcUIsVUFBVSxJQUFJO0FBQ25ELFdBQU8saUJBQWlCLFlBQVksS0FBSyxLQUFLO0FBQUEsRUFDaEQ7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLHNCQUFzQixVQUFVLEtBQUssS0FBSyxNQUFNLG1CQUFtQixLQUFLLEdBQUcsTUFBTSxFQUFFO0FBQUE7QUFBQSxFQUFPLElBQUksT0FBTyxjQUFjLENBQUM7QUFBQSxFQUN0SDtBQUNGOzs7QUNwSkEsT0FBT0MsWUFBVztBQUVsQixJQUFNQyxTQUFRRCxPQUFNLDBDQUEwQztBQUV2RCxJQUFNLGlDQUFpQyxDQUFDLFNBT3pDO0FBQ0osTUFBSSxDQUFDLEtBQUssY0FBYyxDQUFDLEtBQUssbUJBQW1CO0FBQy9DLFFBQUksZUFBZSxLQUFLLE9BQU87QUFDN0IsV0FBSyxvQkFBb0I7QUFBQSxJQUMzQixXQUFXLGNBQWMsS0FBSyxPQUFPO0FBQ25DLFdBQUssb0JBQW9CO0FBQUEsSUFDM0IsV0FDRSxPQUFPLEtBQUssS0FBSyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU0sQ0FBQyxFQUFFLFdBQVcsR0FDckU7QUFDQSxXQUFLLG9CQUFvQixPQUFPLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztBQUFBLElBQ3BELFdBQVcsMkJBQTJCLEtBQUssT0FBTztBQUNoRCxZQUFNLGdCQUFnQixLQUFLLE1BQU0sdUJBQXVCO0FBQ3hELFVBQUk7QUFDRixjQUFNLFNBQVMsS0FBSyxNQUFNLGFBQWE7QUFDdkMsWUFBSSxPQUFPLGdCQUFnQjtBQUN6QixlQUFLLGFBQWEsT0FBTztBQUFBLFFBQzNCO0FBQUEsTUFDRixTQUFTLEdBQUc7QUFDVixnQkFBUSxLQUFLLDBDQUEwQyxDQUFDO0FBQUEsTUFDMUQ7QUFBQSxJQUNGLE9BQU87QUFDTCxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLEtBQUssY0FBYyxLQUFLLG1CQUFtQjtBQUM5QyxTQUFLLGFBQWE7QUFDbEIsVUFBTSxvQkFDSixLQUFLLE1BQU0sdUJBQXVCLEtBQUssbUJBQW1CLEtBQUssS0FBSyxDQUFDO0FBQ3ZFLFFBQUksQ0FBQyxtQkFBbUI7QUFDdEIsWUFBTSxJQUFJO0FBQUEsUUFDUix3QkFBd0IsS0FBSyxpQkFBaUIsMENBQTBDLE9BQU8sS0FBSyxLQUFLLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLE1BQzVIO0FBQUEsSUFDRjtBQUNBLFNBQUssTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLDBDQUNRLEtBQUssaUJBQWlCO0FBQUE7QUFBQSxRQUd4RCxLQUFLLG9CQUNEO0FBQUEsb0RBQ3dDLEtBQUssaUJBQWlCO0FBQUEsWUFFOUQ7QUFBQTtBQUFBO0FBQUEsa0VBSU47QUFBQTtBQUFBLGFBR09DLE9BQU0sVUFDRjtBQUFBO0FBQUE7QUFBQSxTQUlBLEVBQ047QUFBQTtBQUFBO0FBQUEsK0JBR29CLEtBQUsscUJBQXFCLE9BQU8sS0FBSyxVQUFVLEtBQUssb0JBQW9CLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUFBO0FBQUE7QUFBQSxFQUd0SDtBQUVBLE1BQUksQ0FBQyxLQUFLLFFBQVEsS0FBSyxtQkFBbUI7QUFDeEMsU0FBSyxPQUFPLEtBQUs7QUFBQSxFQUNuQjtBQUNGOzs7QUNoRk8sSUFBTSx1Q0FBdUMsQ0FDbEQsT0FDQSxlQUNHO0FBQ0gsTUFDRSxpQkFBaUIsU0FDakIsY0FDQSxNQUFNLFFBQVEsU0FBUyw2QkFBNkIsS0FDcEQsQ0FBQyxNQUFNLFFBQVEsU0FBUyxlQUFlLEdBQ3ZDO0FBQ0EsVUFBTSxvQkFBb0IsV0FBVyxXQUFXLElBQUksSUFDaEQsV0FBVyxNQUFNLENBQUMsSUFDbEI7QUFDSixVQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sb0JBQW9CLGlCQUFpQjtBQUFBLEVBQ3ZFO0FBRUEsU0FBTztBQUNUOzs7QWZIQSxPQUFPQyxZQUFXOzs7QWdCaUNYLFNBQVMsZUFDZCxLQUNBLE1BQ0EsT0FDQTtBQUNBLFFBQU0sT0FBTyxLQUFLLE1BQU0sR0FBRztBQUMzQixNQUFJLFVBQVU7QUFDZCxXQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLFVBQU0sTUFBTSxLQUFLLENBQUM7QUFHbEIsUUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHO0FBQ3pCLGNBQVEsR0FBRyxJQUFJO0FBQUEsSUFDakIsT0FBTztBQUVMLFVBQ0UsQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLFNBQVMsR0FBRyxLQUNsRCxPQUFPLFFBQVEsR0FBRyxNQUFNLFlBQ3hCLFFBQVEsR0FBRyxNQUFNLFFBQ2pCLE1BQU0sUUFBUSxRQUFRLEdBQUcsQ0FBQyxHQUMxQjtBQUNBLGdCQUFRLEdBQUcsSUFBSSxDQUFDO0FBQUEsTUFDbEI7QUFDQSxnQkFBVSxRQUFRLEdBQUc7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFDRjs7O0FoQnhEQSxJQUFNQyxTQUFRQyxPQUFNLHlCQUF5QjtBQUV0QyxJQUFNLGdCQUFOLE1BQWdEO0FBQUEsRUFVckQsWUFBWSxnQkFBcUQsQ0FBQyxHQUFHO0FBVHJFLDZCQUFzRTtBQUN0RSx1Q0FBMEQ7QUFBQSxNQUN4RCxvQkFBb0I7QUFBQSxNQUNwQixnQkFBZ0I7QUFBQSxNQUNoQixTQUFTO0FBQUEsSUFDWDtBQUNBLDJCQUFnRSxDQUFDO0FBSS9ELFdBQU8sT0FBTyxLQUFLLDZCQUE2QixhQUFhO0FBQUEsRUFDL0Q7QUFBQSxFQUVBLE1BQU0sVUFBMkI7QUFDL0IsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE1BQU0saUJBQWlCLFFBT0w7QUFDaEIsVUFBTSxPQUFPLEVBQUUsR0FBRyxPQUFPO0FBRXpCLFFBQUksS0FBSyw0QkFBNEIsU0FBUztBQUM1QyxNQUFBQSxPQUFNLE9BQU8sYUFBYTtBQUFBLElBQzVCO0FBRUEsSUFBQUQsT0FBTSxpQ0FBaUM7QUFBQSxNQUNyQyxZQUFZLEtBQUs7QUFBQSxNQUNqQixXQUFXLE9BQU8sS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUNqQyxNQUFNLEtBQUs7QUFBQSxJQUNiLENBQUM7QUFFRCxtQ0FBK0IsSUFBSTtBQUVuQyxJQUFBQSxPQUFNLG9EQUFvRDtBQUFBLE1BQ3hELFlBQVksS0FBSztBQUFBLElBQ25CLENBQUM7QUFFRCxTQUFLLG9CQUFvQjtBQUFBLE1BQ3ZCLEtBQUs7QUFBQSxNQUNMO0FBQUEsUUFDRSxNQUFNLEtBQUs7QUFBQSxRQUNYLFVBQVUsS0FBSyw0QkFBNEI7QUFBQSxRQUMzQyxlQUFlLEtBQUssNEJBQTRCO0FBQUEsUUFDaEQsZ0JBQWdCLEtBQUs7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFDQSxTQUFLLG9CQUFvQixLQUFLLGtCQUFrQixPQUFPO0FBRXZELFNBQUssa0JBQWtCLGFBQWEsS0FBSztBQUN6QyxTQUFLLGtCQUFrQixRQUFRLGVBQWUsS0FBSyxLQUFLO0FBQ3hELFNBQUssa0JBQWtCLFdBQVcsWUFBWSxLQUFLLGtCQUFrQixLQUFLO0FBQzFFLFFBQUksQ0FBQyxLQUFLLGtCQUFrQixNQUFNLEtBQUssVUFBVyxHQUFHO0FBQ25ELFlBQU0sSUFBSSxNQUFNLGVBQWUsS0FBSyxVQUFVLGFBQWE7QUFBQSxJQUM3RDtBQUNBO0FBQUMsSUFBQyxXQUFtQixzQkFBc0IsS0FBSyxrQkFBa0I7QUFFbEUsVUFBTSxhQUFhLEtBQUssV0FBWSxXQUFXLElBQUksSUFDL0MsS0FBSyxhQUNMLEtBQUssS0FBSyxVQUFVO0FBRXhCLElBQUFBLE9BQU0scUJBQXFCLFVBQVU7QUFDckMsVUFBTSxlQUFlLFlBQWEsS0FBSyxpQkFBaUI7QUFBQSxFQUMxRDtBQUFBLEVBRUEsTUFBTSxRQUFRLE1BQWMsT0FBMEIsQ0FBQyxHQUFHO0FBQ3hELFFBQUksS0FBSyw0QkFBNEIsU0FBUztBQUM1QyxjQUFRO0FBQUEsUUFDTjtBQUFBLFFBQ0EsS0FBSztBQUFBLE1BQ1A7QUFBQSxJQUNGO0FBRUEsU0FBSyxvQkFBb0I7QUFBQSxNQUN2QixLQUFLO0FBQUEsTUFDTDtBQUFBLFFBQ0UsR0FBRztBQUFBLFFBQ0gsVUFBVSxLQUFLLDRCQUE0QjtBQUFBLFFBQzNDLGVBQWUsS0FBSyw0QkFBNEI7QUFBQSxRQUNoRCxnQkFBZ0IsS0FBSztBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUNBLFNBQUssb0JBQW9CLEtBQUssa0JBQWtCLE9BQU87QUFDdkQsU0FBSyxrQkFBa0IsTUFBTSxnQkFBZ0IsSUFBSTtBQUNqRCxTQUFLLGtCQUFrQixXQUFXLFlBQVksS0FBSyxrQkFBa0IsS0FBSztBQUN6RSxJQUFDLFdBQW1CLHNCQUFzQixLQUFLLGtCQUFrQjtBQUVsRSxVQUFNLGVBQWUsb0JBQW9CLEtBQUssaUJBQWlCO0FBQUEsRUFDakU7QUFBQSxFQUVBLE1BQU0saUJBQWlCLFdBQWdCLE9BQTBCLENBQUMsR0FBRztBQUNuRSxRQUFJLEtBQUssNEJBQTRCLFNBQVM7QUFDNUMsY0FBUSxJQUFJLHlDQUF5QztBQUFBLElBQ3ZEO0FBRUEsU0FBSyxvQkFBb0I7QUFBQSxNQUN2QixLQUFLO0FBQUEsTUFDTDtBQUFBLFFBQ0UsR0FBRztBQUFBLFFBQ0gsVUFBVSxLQUFLLDRCQUE0QjtBQUFBLFFBQzNDLGVBQWUsS0FBSyw0QkFBNEI7QUFBQSxRQUNoRCxnQkFBZ0IsS0FBSztBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUNBLFNBQUssb0JBQW9CLEtBQUssa0JBQWtCLE9BQU87QUFDdEQsSUFBQyxXQUFtQixzQkFBc0IsS0FBSyxrQkFBa0I7QUFDbEUsU0FBSyxrQkFBa0IsV0FBVztBQUVsQyxVQUFNLFVBQVUsT0FBTyxjQUFjLGFBQWEsVUFBVSxJQUFJO0FBQ2hFLFNBQUssa0JBQWtCLFFBQVEsSUFBSSxPQUFjO0FBQUEsRUFDbkQ7QUFBQSxFQUVBLEdBQUcsT0FBZSxVQUFvQztBQXpJeEQ7QUEwSUksZUFBSyxpQkFBTCx1QkFBZ0MsQ0FBQztBQUNqQyxTQUFLLGdCQUFnQixLQUFLLEVBQUUsS0FBSyxRQUFRO0FBQ3pDLFNBQUssbUJBQW1CLFFBQVEsR0FBRyxPQUFjLFFBQVE7QUFBQSxFQUMzRDtBQUFBLEVBRUEsTUFBTSxxQkFBb0M7QUFDeEMsUUFBSSxDQUFDLEtBQUssbUJBQW1CO0FBQzNCLFlBQU0sSUFBSSxNQUFNLDZCQUE2QjtBQUFBLElBQy9DO0FBQ0EsUUFBSTtBQUNGLFlBQU0sS0FBSyxrQkFBa0IsUUFBUSxtQkFBbUI7QUFBQSxJQUMxRCxTQUFTLE9BQU87QUFDZCxZQUFNO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSyxrQkFBa0I7QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLGlCQUErQztBQUNuRCxRQUFJLENBQUMsS0FBSyxtQkFBbUI7QUFDM0IsWUFBTSxJQUFJLE1BQU0sNkJBQTZCO0FBQUEsSUFDL0M7QUFDQSxRQUFJO0FBQ0YsYUFBTyxLQUFLLGtCQUFrQixRQUFRLGVBQWU7QUFBQSxJQUN2RCxTQUFTLE9BQU87QUFDZCxZQUFNO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSyxrQkFBa0I7QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxzQkFBc0I7QUFDcEIsUUFBSSxLQUFLLG1CQUFtQixTQUFTO0FBQ25DLGlCQUFXLFNBQVMsS0FBSyxpQkFBaUI7QUFDeEMsbUJBQVcsWUFBWSxLQUFLLGdCQUFnQixLQUFLLEdBQUc7QUFDbEQsZ0JBQU0sVUFBVSxLQUFLLGtCQUFrQjtBQUl2QyxrQkFBUSxpQkFBaUIsT0FBTyxRQUFRO0FBQUEsUUFDMUM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLGVBQVcsU0FBUyxLQUFLLGlCQUFpQjtBQUN4QyxhQUFPLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxJQUNuQztBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU0sT0FBTztBQUVYLFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE1BQU0sc0JBQXNCLFNBQWlCO0FBQzNDLFNBQUssNEJBQTRCLHFCQUFxQjtBQUFBLEVBQ3hEO0FBQUEsRUFFQSxNQUFNLGtCQUFrQixVQUEwQjtBQUNoRCxTQUFLLDRCQUE0QixXQUFXO0FBQUEsRUFDOUM7QUFBQSxFQUVBLE1BQU0sMEJBQTBCLFVBQWtCLE9BQVk7QUFDNUQsUUFBSSxDQUFDLEtBQUssNEJBQTRCLFVBQVU7QUFDOUMsV0FBSyw0QkFBNEIsV0FBVyxDQUFDO0FBQUEsSUFDL0M7QUFDQSxtQkFBZSxLQUFLLDRCQUE0QixVQUFVLFVBQVUsS0FBSztBQUFBLEVBQzNFO0FBQUEsRUFFQSxNQUFNLGlCQUFpQixTQUFrQztBQUN2RCxTQUFLLDRCQUE0QixnQkFBZ0I7QUFBQSxFQUNuRDtBQUFBLEVBRUEsTUFBTSx5QkFBeUIsVUFBa0IsT0FBWTtBQUMzRCxRQUFJLENBQUMsS0FBSyw0QkFBNEIsZUFBZTtBQUNuRCxXQUFLLDRCQUE0QixnQkFBZ0IsQ0FBQztBQUFBLElBQ3BEO0FBQ0E7QUFBQSxNQUNFLEtBQUssNEJBQTRCO0FBQUEsTUFDakM7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU0sWUFBWSxXQUFtQjtBQUNuQyxTQUFLLGtCQUFrQjtBQUN2QixRQUFJLEtBQUssbUJBQW1CO0FBQzFCLFlBQU0sVUFBVSxLQUFLLGtCQUFrQjtBQUN2QyxjQUFRLGNBQWMsU0FBUztBQUFBLElBQ2pDO0FBQUEsRUFDRjtBQUFBLEVBRVEsb0JBQW9CLFNBQXNCO0FBQ2hELGVBQVcsU0FBUyxLQUFLLGlCQUFpQjtBQUN4QyxpQkFBVyxZQUFZLEtBQUssZ0JBQWdCLEtBQUssR0FBRztBQUNsRCxnQkFBUSxHQUFHLE9BQWMsUUFBZTtBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FpQjdPQSxlQUFzQixpQkFDcEIsd0JBQ0EsTUFDQTtBQUNBLE1BQ0UsT0FBTywyQkFBMkIsWUFDbEMsQ0FBQyx1QkFBdUIsU0FBUyxRQUFRLEdBQ3pDO0FBQ0EsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxRQUFNLGFBQ0osT0FBTywyQkFBMkIsV0FDOUIsRUFBRSxpQkFBaUIsdUJBQXVCLElBQzFDO0FBRU4sUUFBTSxnQkFBZ0IsSUFBSSxjQUFjO0FBRXhDLFFBQU0sY0FBYyxpQkFBaUI7QUFBQSxJQUNuQyxPQUFPO0FBQUEsSUFDUCxHQUFHO0FBQUEsRUFDTCxDQUFDO0FBRUQsUUFBTSxjQUFjLG1CQUFtQjtBQUV2QyxTQUFPLE1BQU0sY0FBYyxlQUFlO0FBQzVDOzs7QUMzQk8sSUFBTSxxQkFBcUIsT0FDaEMsUUFDQSxPQUE2RCxDQUFDLE1BQzNEO0FBQ0gsTUFBSSxDQUFDLE9BQU8sV0FBVyxHQUFHLEdBQUc7QUFDM0IsYUFBUyxTQUFTLE9BQU8sUUFBUSxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQzdDO0FBQ0EsUUFBTSxjQUFjLE1BQU07QUFBQSxJQUN4QjtBQUFBO0FBQUE7QUFBQSxNQUdFLGlCQUFpQjtBQUFBLDZDQUNzQixNQUFNO0FBQUE7QUFBQSx3QkFFM0IsS0FBSyxjQUFjLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBY3pDO0FBQUEsSUFDQTtBQUFBLE1BQ0Usb0JBQW9CLEtBQUs7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiZGVidWciLCAidW5wcmVmaXhlZFBhdGgiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciXQp9Cg==
1521
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cC50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0TWF0aFV0aWxzIGZyb20gXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcImxpYi9nZXRQbGF0Zm9ybUNvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnIH0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGlmIChwbGF0Zm9ybS5wYXJ0c0VuZ2luZURpc2FibGVkKSB7XG4gICAgcGxhdGZvcm0ucGFydHNFbmdpbmUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICAvLyBSZXNvbHZlIGJhc2VVcmwgcmVsYXRpdmUgdG8gdHNjb25maWcgbG9jYXRpb25cbiAgY29uc3QgYmFzZURpciA9IHRzY29uZmlnRGlyIHx8IFwiLlwiXG4gIGxldCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VEaXJ9LyR7YmFzZVVybH0vJHtpbXBvcnRQYXRofWBcbiAgLy8gQ2xlYW4gdXAgbXVsdGlwbGUgc2xhc2hlcyBhbmQgbGVhZGluZyBkb3RzXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvKy9nLCBcIi9cIikgLy8gUmVwbGFjZSBtdWx0aXBsZSBzbGFzaGVzIHdpdGggc2luZ2xlIHNsYXNoXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvXFwuXFwvL2csIFwiL1wiKSAvLyBSZXBsYWNlIC8uLyB3aXRoIC9cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGhUb1Jlc29sdmUpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRGaWxlUGF0aCkhXG4gIH1cblxuICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRGaWxlUGF0aH0uJHtleHR9YFxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oXG4gIGltcG9ydFBhdGg6IHN0cmluZyxcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRocyA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gIGlmICghcGF0aHMpIHJldHVybiBmYWxzZVxuXG4gIGZvciAoY29uc3QgW2FsaWFzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpICYmIGltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoID09PSBhbGlhcykgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuLi8uLi93ZWJ3b3JrZXIvZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyBnZXRUc0NvbmZpZyB9IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIndlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCB9IGZyb20gXCIuL3NldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiXG5pbXBvcnQgeyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgfSBmcm9tIFwibGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgc2V0VmFsdWVBdFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9vYmotcGF0aFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IG51bGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgPyBjb21wb25lbnQoKSA6IGNvbXBvbmVudFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfVxuXG4gIGFzeW5jIHJlbmRlclVudGlsU2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcmN1aXQucmVtb3ZlTGlzdGVuZXI/LihldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpIHtcbiAgICAvLyBDbGVhbnVwIHJlc291cmNlc1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBudWxsXG4gIH1cblxuICBhc3luYyBzZXRTbmlwcGV0c0FwaUJhc2VVcmwoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgYXN5bmMgc2V0UGxhdGZvcm1Db25maWcocGxhdGZvcm06IFBsYXRmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybVxuICB9XG5cbiAgYXN5bmMgc2V0UGxhdGZvcm1Db25maWdQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0gPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aCh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSwgcHJvcGVydHksIHZhbHVlKVxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZyhwcm9qZWN0OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPikge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSBwcm9qZWN0XG4gIH1cblxuICBhc3luYyBzZXRQcm9qZWN0Q29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykge1xuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgIHByb3BlcnR5LFxuICAgICAgdmFsdWUsXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZW5hYmxlRGVidWcobmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWJ1Z05hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIGFueVxuICAgICAgY2lyY3VpdC5lbmFibGVEZWJ1Zz8uKG5hbWVzcGFjZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbi8qKlxuICogUmVzb2x2ZSBhbiBpbXBvcnRQYXRoIHJlbGF0aXZlIHRvIGEgY3dkLCBzdXBwb3J0aW5nIC4uLywgLi8gYW5kIGFic29sdXRlIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvblxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyID0gZGlybmFtZShjd2QpXG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgzKSwgcGFyZW50RGlyKVxuICB9XG4gIC8vIEhhbmRsZSBjdXJyZW50IGRpcmVjdG9yeVxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDIpLCBjd2QpXG4gIH1cbiAgLy8gSGFuZGxlIGFic29sdXRlIHBhdGhcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0UGF0aC5zbGljZSgxKVxuICB9XG4gIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiBgJHtjd2R9LyR7aW1wb3J0UGF0aH1gXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyByZXNvbHZlUmVsYXRpdmVQYXRoIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlUmVsYXRpdmVQYXRoXCJcbmltcG9ydCB7XG4gIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyxcbiAgdHlwZSBUc0NvbmZpZyxcbiAgcmVzb2x2ZVdpdGhCYXNlVXJsLFxufSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcblxuY29uc3QgRklMRV9FWFRFTlNJT05TID0gW1widHN4XCIsIFwidHNcIiwgXCJqc29uXCIsIFwianNcIiwgXCJqc3hcIiwgXCJvYmpcIiwgXCJnbHRmXCIsIFwiZ2xiXCJdXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0czogeyB0c0NvbmZpZz86IFRzQ29uZmlnIHwgbnVsbDsgdHNjb25maWdEaXI/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRzQ29uZmlnID0gb3B0cy50c0NvbmZpZyA/PyBudWxsXG4gIGNvbnN0IGlzUmVsYXRpdmVJbXBvcnQgPVxuICAgIHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIilcbiAgY29uc3QgaGFzQmFzZVVybCA9ICEhdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybFxuXG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb24gcHJvcGVybHlcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID1cbiAgICBjd2QgJiYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpXG4gICAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgICA6IHVua25vd25GaWxlUGF0aFxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IG5ldyBTZXQoXG4gICAgQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKVxuICAgICAgPyBmc01hcE9yQWxsRmlsZVBhdGhzXG4gICAgICA6IE9iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLFxuICApXG5cbiAgaWYgKGZpbGVQYXRocy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiByZXNvbHZlZFBhdGhcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAuc2V0KG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoKSwgZmlsZVBhdGgpXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgocmVzb2x2ZWRQYXRoKVxuXG4gIC8vIFdoZW4gYmFzZVVybCBpcyBzZXQsIG5vbi1yZWxhdGl2ZSBpbXBvcnRzIHNob3VsZCBnbyB0aHJvdWdoIGJhc2VVcmwgcmVzb2x1dGlvblxuICBpZiAoaXNSZWxhdGl2ZUltcG9ydCB8fCAhaGFzQmFzZVVybCkge1xuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSFcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGZpbGUgd2l0aCBhIHNldCBvZiBkaWZmZXJlbnQgZXh0ZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZXh0IG9mIEZJTEVfRVhURU5TSU9OUykge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRSZXNvbHZlZFBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBpZiAoIWlzUmVsYXRpdmVJbXBvcnQpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tUGF0aHMgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogRklMRV9FWFRFTlNJT05TLFxuICAgICAgdHNDb25maWcsXG4gICAgICB0c2NvbmZpZ0Rpcjogb3B0cy50c2NvbmZpZ0RpcixcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tUGF0aHMpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tUGF0aHNcblxuICAgIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhYnNvbHV0ZSBpbXBvcnQgKG9ubHkgaWYgbm8gYmFzZVVybCBpcyBjb25maWd1cmVkIGluIHRzY29uZmlnKVxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHZpYSBiYXNlVXJsIG9yIGZhaWwsIG5vdCBmYWxsIGJhY2sgdG8gYWJzb2x1dGUgcGF0aHNcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0ICYmICFoYXNCYXNlVXJsKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIEZJTEVfRVhURU5TSU9OUykge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIHVua25vd25GaWxlUGF0aCxcbiAgICBmc01hcE9yQWxsRmlsZVBhdGhzLFxuICAgIGN3ZCxcbiAgICBvcHRzLFxuICApXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IG1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmltcG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OnR5cGVcXHMrKT8oPzpcXCpcXHMrYXNcXHMrW1xcdyRdK3xcXCp8XFx7W159XStcXH0pXFxzK2Zyb21cXHMqWydcIl0oLis/KVsnXCJdL2dtXG4gIGxldCByZUV4cG9ydE1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgocmVFeHBvcnRNYXRjaCA9IHJlRXhwb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSByZUV4cG9ydE1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmV4cG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcbiAgICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gdHJhbnNmb3JtIHRoZW1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgIHRyYW5zZm9ybVdpdGhTdWNyYXNlKGZpbGVDb250ZW50LCBmc1BhdGgpLFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICkuZXhwb3J0c1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbiBcIiR7ZnNQYXRoLnNwbGl0KFwiLlwiKS5wb3AoKX1cIiBmb3IgXCIke2ZzUGF0aH1cImAsXG4gICAgICApXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGltcG9ydFN0YWNrLnBvcCgpXG4gICAgY3VycmVudGx5SW1wb3J0aW5nLmRlbGV0ZShmc1BhdGgpXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMgPSBbXG4gIFwiLmdsYlwiLFxuICBcIi5raWNhZF9tb2RcIixcbiAgXCIuZ2x0ZlwiLFxuICBcIi5vYmpcIixcbiAgXCIuc3RsXCIsXG5dXG5cbmV4cG9ydCBjb25zdCBpc1N0YXRpY0Fzc2V0UGF0aCA9IChwYXRoOiBzdHJpbmcpID0+XG4gIFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT4gcGF0aC5lbmRzV2l0aChleHQpKVxuIiwgImltcG9ydCB7IHRyYW5zZm9ybSwgdHlwZSBUcmFuc2Zvcm0gYXMgU3VjcmFzZVRyYW5zZm9ybSB9IGZyb20gXCJzdWNyYXNlXCJcblxuY29uc3QgVFNfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzXCIsIFwiLnRzeFwiLCBcIi5tdHNcIiwgXCIuY3RzXCJdKVxuY29uc3QgSlNYX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c3hcIiwgXCIuanN4XCIsIFwiLnRzXCJdKVxuY29uc3QgVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCA9XG4gIC9eXFxzKmV4cG9ydFxccyt0eXBlXFxzK1xcKlxccysoPzphc1xccytbXFx3JF0rXFxzKyk/ZnJvbVxccytbJ1wiXVteJ1wiXStbJ1wiXVxccyo7P1xccyokL2dpbVxuXG5jb25zdCBzdHJpcFR5cGVTdGFyRXhwb3J0cyA9IChjb2RlOiBzdHJpbmcpID0+XG4gIGNvZGUucmVwbGFjZShUWVBFX1NUQVJfRVhQT1JUX1JFR0VYLCBcIlwiKVxuXG5jb25zdCBzdHJpcFF1ZXJ5QW5kSGFzaCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiP1wiKVxuICBjb25zdCBoYXNoSW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiI1wiKVxuXG4gIGxldCBlbmRJbmRleCA9IGZpbGVQYXRoLmxlbmd0aFxuXG4gIGlmIChxdWVyeUluZGV4ICE9PSAtMSAmJiBoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBNYXRoLm1pbihxdWVyeUluZGV4LCBoYXNoSW5kZXgpXG4gIH0gZWxzZSBpZiAocXVlcnlJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IHF1ZXJ5SW5kZXhcbiAgfSBlbHNlIGlmIChoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBoYXNoSW5kZXhcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5zbGljZSgwLCBlbmRJbmRleClcbn1cblxuY29uc3QgZ2V0RXh0ZW5zaW9uID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBzdHJpcFF1ZXJ5QW5kSGFzaChmaWxlUGF0aClcbiAgY29uc3QgbGFzdERvdEluZGV4ID0gbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIuXCIpXG5cbiAgaWYgKGxhc3REb3RJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi9cIiksXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCJcXFxcXCIpLFxuICApXG5cbiAgaWYgKGxhc3RTbGFzaEluZGV4ID4gbGFzdERvdEluZGV4KSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkUGF0aC5zbGljZShsYXN0RG90SW5kZXgpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGVQYXRoKVxuXG4gIGNvbnN0IHRyYW5zZm9ybXM6IFN1Y3Jhc2VUcmFuc2Zvcm1bXSA9IFtcImltcG9ydHNcIl1cblxuICBpZiAoVFNfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMudW5zaGlmdChcInR5cGVzY3JpcHRcIilcbiAgfVxuXG4gIGlmIChKU1hfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMucHVzaChcImpzeFwiKVxuICB9XG5cbiAgcmV0dXJuIHRyYW5zZm9ybXNcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVdpdGhTdWNyYXNlID0gKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1zID0gZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoKGZpbGVQYXRoKVxuICBjb25zdCBzYW5pdGl6ZWRDb2RlID0gc3RyaXBUeXBlU3RhckV4cG9ydHMoY29kZSlcbiAgY29uc3QgeyBjb2RlOiB0cmFuc2Zvcm1lZENvZGUgfSA9IHRyYW5zZm9ybShzYW5pdGl6ZWRDb2RlLCB7XG4gICAgZmlsZVBhdGgsXG4gICAgcHJvZHVjdGlvbjogdHJ1ZSxcbiAgICB0cmFuc2Zvcm1zLFxuICB9KVxuXG4gIHJldHVybiB0cmFuc2Zvcm1lZENvZGVcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0U25pcHBldChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG4gIGNvbnN0IGZ1bGxTbmlwcGV0TmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5yZXBsYWNlKFwiLlwiLCBcIi9cIilcblxuICBjb25zdCB7IGNqcywgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+ICh7IGNqczogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfSkpXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY2pzOiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgY2pzISxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICApLmV4cG9ydHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgc25pcHBldFwiLCBlKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbn1cblxuaW50ZXJmYWNlIE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIGJhc2VQYXRoOiBzdHJpbmdcbiAgbW9kdWxlUGF0aDogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGZzTWFwLFxuICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc3hcIiwgXCIudHNcIiwgXCIudHN4XCIsIFwiLmpzb25cIl0sXG4gICAgYmFzZVBhdGgsXG4gICAgbW9kdWxlUGF0aCxcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vcGFja2FnZS5qc29uYFxuICBpZiAoIWN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSBhcyBQYWNrYWdlSnNvblxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhcbiAgcGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY3R4LmZzTWFwW3BhdGhdKSByZXR1cm4gcGF0aFxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgcGF0aFdpdGhFeHQgPSBwYXRoLnJlcGxhY2UoL1xcLmpzJHxcXC5qc3gkLywgXCJcIikgKyBleHRcbiAgICBpZiAoY3R4LmZzTWFwW3BhdGhXaXRoRXh0XSkgcmV0dXJuIHBhdGhXaXRoRXh0XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFBhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBleHBvcnRQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZ1bGxFeHBvcnRQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2V4cG9ydFBhdGgucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWBcbiAgcmV0dXJuIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsRXhwb3J0UGF0aCwgY3R4KVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHJlbWFpbmluZ1BhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFwYWNrYWdlSnNvbi5leHBvcnRzKSByZXR1cm4gbnVsbFxuXG4gIC8vIEhhbmRsZSBkZWZhdWx0IGV4cG9ydCBjb25kaXRpb25cbiAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCIuXCJdXG4gIGlmIChyZW1haW5pbmdQYXRoID09PSBcIlwiICYmIGRlZmF1bHRFeHBvcnQpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRFeHBvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBkZWZhdWx0RXhwb3J0LCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGV4cG9ydHNcbiAgY29uc3Qgc3VicGF0aEV4cG9ydCA9IHJlbWFpbmluZ1BhdGhcbiAgICA/IHBhY2thZ2VKc29uLmV4cG9ydHNbYC4vJHtyZW1haW5pbmdQYXRofWBdXG4gICAgOiBudWxsXG4gIGlmIChzdWJwYXRoRXhwb3J0ICYmIHR5cGVvZiBzdWJwYXRoRXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIHN1YnBhdGhFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHNcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcImltcG9ydFwiXVxuICBpZiAoXG4gICAgcmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJlxuICAgIGltcG9ydEV4cG9ydCAmJlxuICAgIHR5cGVvZiBpbXBvcnRFeHBvcnQgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGltcG9ydEV4cG9ydCwgY3R4KVxuICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT0gXCIuXCIgPyBcIlwiIDogYCR7c2VhcmNoUGF0aH0vYH1ub2RlX21vZHVsZXMvJHtzY29wZX1gXG5cbiAgLy8gVHJ5IHRvIGZpbmQgcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aCwgY3R4KVxuICBpZiAocGFja2FnZUpzb24pIHtcbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggZXhwb3J0cyBmaWVsZFxuICAgIGNvbnN0IGV4cG9ydHNSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICByZW1haW5pbmdQYXRoLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZXhwb3J0c1Jlc29sdXRpb24pIHJldHVybiBleHBvcnRzUmVzb2x1dGlvblxuXG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIG1haW4vbW9kdWxlIGZpZWxkc1xuICAgIGNvbnN0IGVudHJ5UG9pbnRSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChlbnRyeVBvaW50UmVzb2x1dGlvbikgcmV0dXJuIGVudHJ5UG9pbnRSZXNvbHV0aW9uXG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHJlbWFpbmluZyBwYXRoXG4gIGNvbnN0IHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uID0gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgY3R4LFxuICApXG4gIGlmIChyZW1haW5pbmdQYXRoUmVzb2x1dGlvbikgcmV0dXJuIHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uXG5cbiAgLy8gSWYgbm90IGZvdW5kIGFuZCB3ZSBoYXZlIGEgcGFyZW50IGRpcmVjdG9yeSwgdHJ5IHRoZXJlXG4gIGNvbnN0IHBhcmVudFBhdGggPSBkaXJuYW1lKHNlYXJjaFBhdGgpXG4gIGlmIChwYXJlbnRQYXRoICYmIHBhcmVudFBhdGggIT09IHNlYXJjaFBhdGgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgocGFyZW50UGF0aCwgY3R4KVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlKFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGN0eCA9IGNyZWF0ZUNvbnRleHQobW9kdWxlUGF0aCwgZnNNYXAsIGJhc2VQYXRoKVxuICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgoY3R4LmJhc2VQYXRoLCBjdHgpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5vZGUtbW9kdWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LmZzTWFwLCBcIlwiKVxuXG4gIGlmICghcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY3R4LmNpcmN1aXQ/LnBsYXRmb3JtXG4gICAgaWYgKHBsYXRmb3JtPy5ub2RlTW9kdWxlc1Jlc29sdmVyKSB7XG4gICAgICBkZWJ1ZyhgQXR0ZW1wdGluZyB0byByZXNvbHZlIFwiJHtpbXBvcnROYW1lfVwiIHVzaW5nIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHBsYXRmb3JtLm5vZGVNb2R1bGVzUmVzb2x2ZXIoaW1wb3J0TmFtZSlcblxuICAgICAgICBpZiAoZmlsZUNvbnRlbnQpIHtcbiAgICAgICAgICBkZWJ1ZyhgU3VjY2Vzc2Z1bGx5IHJlc29sdmVkIFwiJHtpbXBvcnROYW1lfVwiIHZpYSBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb2x2ZWQgY29udGVudCB0byBmc01hcCB3aXRoIGEgc3ludGhldGljIHBhdGhcbiAgICAgICAgICAvLyBBZGQgLnRzIGV4dGVuc2lvbiB0byBlbnN1cmUgaXQncyB0cmVhdGVkIGFzIGEgbW9kdWxlIGZpbGVcbiAgICAgICAgICBjb25zdCBzeW50aGV0aWNQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2ltcG9ydE5hbWV9LnRzYFxuICAgICAgICAgIGN0eC5mc01hcFtzeW50aGV0aWNQYXRoXSA9IGZpbGVDb250ZW50XG5cbiAgICAgICAgICAvLyBJbXBvcnQgdGhlIGZpbGUgdXNpbmcgdGhlIG5vcm1hbCBmbG93XG4gICAgICAgICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHN5bnRoZXRpY1BhdGgsIGN0eCwgZGVwdGgpXG5cbiAgICAgICAgICAvLyBNYXAgdGhlIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIC8vIEFsc28gbWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeFxuICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gc3ludGhldGljUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKGBub2RlTW9kdWxlc1Jlc29sdmVyIHJldHVybmVkIG51bGwgZm9yIFwiJHtpbXBvcnROYW1lfVwiYClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRlYnVnKGBub2RlTW9kdWxlc1Jlc29sdmVyIGZhaWxlZCBmb3IgXCIke2ltcG9ydE5hbWV9XCI6YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBub3QgZm91bmRgKVxuICB9XG5cbiAgLy8gVXNlIGltcG9ydExvY2FsRmlsZSB0byBoYW5kbGUgdGhlIG5vZGUgbW9kdWxlXG4gIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZE5vZGVNb2R1bGVQYXRoLCBjdHgsIGRlcHRoKVxuXG4gIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZSdzIGV4cG9ydHNcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gTWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeCBmb3IgZGlyZWN0IGltcG9ydHNcbiAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBIYW5kbGUgaW5kZXggZmlsZXMgc3BlY2lhbGx5XG4gIGlmIChcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzeFwiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHNcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LmpzXCIpXG4gICkge1xuICAgIGNvbnN0IGRpclBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL1xcL2luZGV4XFwuKHRzeD98anMpJC8sIFwiXCIpXG4gICAgY29uc3QgdW5wcmVmaXhlZERpclBhdGggPSBkaXJQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkRGlyUGF0aF0gPVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgICAvLyBIYW5kbGUgc2NvcGVkIHBhY2thZ2VzXG4gICAgaWYgKHVucHJlZml4ZWREaXJQYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzY29wZVBhcnRzID0gdW5wcmVmaXhlZERpclBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBzY29wZWROYW1lID0gYCR7c2NvcGVQYXJ0c1swXX0vJHtzY29wZVBhcnRzWzFdfWBcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Njb3BlZE5hbWVdID1cbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBkZWJ1ZyhgaW1wb3J0aW5nIG5wbSBwYWNrYWdlOiAke2ltcG9ydE5hbWV9YClcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIGNvbnN0IG5wbUNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7aW1wb3J0TmFtZX0vK2VzbWBcblxuICBsZXQgZmluYWxVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCB7IGNvbnRlbnQsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKG5wbUNkblVybClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICBmaW5hbFVybCA9IHJlcy51cmxcbiAgICAgIGlmICghcmVzLm9rKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmZXRjaCBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIGpzZGVsaXZyOiAke3Jlcy5zdGF0dXNUZXh0fVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgcmV0dXJuIHsgY29udGVudDogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY29udGVudDogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgbnBtIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgY29uc3QgZmluYWxJbXBvcnROYW1lID0gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKGZpbmFsVXJsISlcbiAgY29uc3QgY3dkID0gZGlybmFtZShmaW5hbEltcG9ydE5hbWUpXG5cbiAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoY29udGVudCEpXG4gIGZvciAoY29uc3Qgc3ViSW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW3N1YkltcG9ydE5hbWVdKSB7XG4gICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChzdWJJbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICBjd2QsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ldmFsLXBhdGhcIilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChkZXB0aCA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkICgzMCkgSW1wb3J0IFBhdGg6ICR7Y3R4LmltcG9ydFN0YWNrLmpvaW4oXCIgLT4gXCIpfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9ucG0vXCIpKSB7XG4gICAgY29uc3QgcGtnTmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZSgvXlxcL25wbVxcLy8sIFwiXCIpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7cGtnTmFtZX1cIilgKVxuICAgIGF3YWl0IGltcG9ydE5wbVBhY2thZ2UocGtnTmFtZSwgY3R4LCBkZXB0aClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgd2hlcmUgdHNjb25maWcuanNvbiBpcyBsb2NhdGVkXG4gIGxldCB0c2NvbmZpZ0RpciA9IFwiLlwiXG4gIGlmIChjdHgudHNDb25maWcgJiYgb3B0cy5jd2QpIHtcbiAgICAvLyBJZiBjd2QgaXMgaW4gbm9kZV9tb2R1bGVzLCBmaW5kIHRoZSBwYWNrYWdlIHJvb3RcbiAgICAvLyBlLmcuLCBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnkvbGliL2dlbmVyYXRlZFwiIC0+IFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeVwiXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNNYXRjaCA9IG9wdHMuY3dkLm1hdGNoKC9eKG5vZGVfbW9kdWxlc1xcL1teXFwvXSspLylcbiAgICBpZiAobm9kZU1vZHVsZXNNYXRjaCkge1xuICAgICAgdHNjb25maWdEaXIgPSBub2RlTW9kdWxlc01hdGNoWzFdXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLCB0c2NvbmZpZ0RpciB9LFxuICApXG4gIGlmIChyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TG9jYWxGaWxlKFwiJHtyZXNvbHZlZExvY2FsSW1wb3J0UGF0aH1cIilgKVxuICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lICh3aGljaCBtaWdodCBiZSBhIHRzY29uZmlnIHBhdGggYWxpYXMpIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICBpZiAoaW1wb3J0TmFtZSAhPT0gcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9XG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZExvY2FsSW1wb3J0UGF0aF1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGlzIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIHBhdHRlcm4gYnV0IGZhaWxlZCB0byByZXNvbHZlXG4gIC8vIElmIHNvLCB0aHJvdyBhbiBlcnJvciBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byBucG1cbiAgY29uc3QgdHNDb25maWcgPSBjdHgudHNDb25maWcgPz8gZ2V0VHNDb25maWcoY3R4LmZzTWFwKVxuICBpZiAoIWN0eC50c0NvbmZpZyAmJiB0c0NvbmZpZykge1xuICAgIGN0eC50c0NvbmZpZyA9IHRzQ29uZmlnXG4gIH1cbiAgaWYgKG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKGltcG9ydE5hbWUsIHRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggYWxpYXMgYnV0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyBmaWxlJHtvcHRzLmN3ZCA/IGAgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCB8fCBcIlwiLFxuICApXG4gIGlmIChyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGByZXNvbHZlZE5vZGVNb2R1bGVQYXRoPVwiJHtyZXNvbHZlZE5vZGVNb2R1bGVQYXRofVwiYClcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgLy8gSWYgbm90IGZvdW5kIGluIGZzTWFwIGJ1dCBtaWdodCBiZSBhIG5vZGUgbW9kdWxlLCB0cnkgaW1wb3J0Tm9kZU1vZHVsZVxuICAvLyB3aGljaCB3aWxsIGF0dGVtcHQgdG8gdXNlIG5vZGVNb2R1bGVzUmVzb2x2ZXIgaWYgY29uZmlndXJlZFxuICBpZiAoXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIilcbiAgKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpIHZpYSBub2RlTW9kdWxlc1Jlc29sdmVyYCxcbiAgICAgIClcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIiwgZmFsbGluZyBiYWNrIHRvIG5wbSBDRE5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwiLi9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6c2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCIpXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gb3B0cy5mc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgICAgICBpZiAoY29uZmlnLm1haW5FbnRyeXBvaW50KSB7XG4gICAgICAgICAgb3B0cy5lbnRyeXBvaW50ID0gY29uZmlnLm1haW5FbnRyeXBvaW50XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRzY2lyY3VpdC5jb25maWcuanNvbjpcIiwgZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciBlbnRyeXBvaW50IG9yIG1haW5Db21wb25lbnRQYXRoIG11c3QgYmUgcHJvdmlkZWQgKG5vIGluZGV4IGZpbGUsIGNvdWxkIG5vdCBpbmZlciBlbnRyeXBvaW50KVwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmIG9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBvcHRzLmVudHJ5cG9pbnQgPSBcImVudHJ5cG9pbnQudHN4XCJcbiAgICBjb25zdCBtYWluQ29tcG9uZW50Q29kZSA9XG4gICAgICBvcHRzLmZzTWFwW3Jlc29sdmVGaWxlUGF0aE9yVGhyb3cob3B0cy5tYWluQ29tcG9uZW50UGF0aCwgb3B0cy5mc01hcCldXG4gICAgaWYgKCFtYWluQ29tcG9uZW50Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWFpbiBjb21wb25lbnQgcGF0aCBcIiR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIiBub3QgZm91bmQgaW4gZnNNYXAuIEF2YWlsYWJsZSBwYXRoczogJHtPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIClcbiAgICB9XG4gICAgb3B0cy5mc01hcFtvcHRzLmVudHJ5cG9pbnRdID0gYFxuICAgICBpbXBvcnQgKiBhcyBVc2VyQ29tcG9uZW50cyBmcm9tIFwiLi8ke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCI7XG4gICAgICAgICAgXG4gICAgICAke1xuICAgICAgICBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gICAgICAgICAgPyBgXG4gICAgICAgIGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHNbXCIke29wdHMubWFpbkNvbXBvbmVudE5hbWV9XCJdXG4gICAgICAgIGBcbiAgICAgICAgICA6IGBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzLmRlZmF1bHQgfHwgXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgICAgLmZpbHRlcigoW25hbWVdKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwidXNlXCIpKVxuICAgICAgICAgIC5tYXAoKFtfLCBjb21wb25lbnRdKSA9PiBjb21wb25lbnQpWzBdIHx8ICgoKSA9PiBudWxsKTtgXG4gICAgICB9XG5cbiAgICAgICAgICAgJHtcbiAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkXG4gICAgICAgICAgICAgICA/IGBcbiAgICAgY29uc29sZS5sb2coeyBVc2VyQ29tcG9uZW50cyB9KVxuICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudFRvUmVuZGVyIFwiICsgQ29tcG9uZW50VG9SZW5kZXIudG9TdHJpbmcoKSwgIHsgQ29tcG9uZW50VG9SZW5kZXIgfSlcbiAgICAgYFxuICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoICAgICAgIFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+IFxuICAgICAgKTtcbmBcbiAgfVxuXG4gIGlmICghb3B0cy5uYW1lICYmIG9wdHMubWFpbkNvbXBvbmVudE5hbWUpIHtcbiAgICBvcHRzLm5hbWUgPSBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgZW50cnlwb2ludD86IHN0cmluZyxcbikgPT4ge1xuICBpZiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgIGVudHJ5cG9pbnQgJiZcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUm9vdENpcmN1aXQgaGFzIG5vIGNoaWxkcmVuXCIpICYmXG4gICAgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1wiZW50cnlwb2ludFwiOicpXG4gICkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRNZXNzYWdlID0gZW50cnlwb2ludC5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gZW50cnlwb2ludC5zbGljZSgyKVxuICAgICAgOiBlbnRyeXBvaW50XG4gICAgZXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLm1lc3NhZ2V9LiBcImVudHJ5cG9pbnRcIjogXCIke2VudHJ5cG9pbnRNZXNzYWdlfVwiIGlzIHNldCBpbiB0aGUgcnVubmVyIGNvbmZpZ3VyYXRpb24sIGVudHJ5cG9pbnRzIG11c3QgY29udGFpbiBcImNpcmN1aXQuYWRkKC4uLilcIiwgeW91IG1pZ2h0IGJlIGxvb2tpbmcgdG8gdXNlIG1haW5Db21wb25lbnRQYXRoIGluc3RlYWQgaWYgeW91ciBmaWxlIGV4cG9ydHMgYSBjb21wb25lbnQuYFxuICB9XG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiLyoqXG4gKiBHZXQgYWxsIHBhdGhzIG9mIGFuIG9iamVjdFxuICpcbiAqIGdldE9iamVjdFBhdGhzKHsgYTogeyBiOiAyLCBjOiB7IGQ6IDMgfSB9LCBlOiA1IH0pXG4gKlxuICogLy8gT3V0cHV0OiBbJ2EuYicsICdhLmMuZCcsICdlJ11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdFBhdGhzKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHByZWZpeCA9IFwiXCIsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cbiAgICBjb25zdCBwYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3Qgc3ViUGF0aHMgPSBnZXRPYmplY3RQYXRocyh2YWx1ZSwgcGF0aClcbiAgICAgIHBhdGhzLnB1c2goLi4uc3ViUGF0aHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhzLnB1c2gocGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGF0aHNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQXRQYXRoKG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRcbn1cbi8qKlxuICogU2V0IGEgdmFsdWUgYXQgYSBwYXRoIGluIGFuIG9iamVjdFxuICpcbiAqIHNldFZhbHVlQXRQYXRoKHsgYTogeyBiOiAyIH0gfSwgXCJhLmMuZFwiLCA1KVxuICpcbiAqIC8vIE91dHB1dDogeyBhOiB7IGI6IDIsIGM6IHsgZDogNSB9IH0gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVBdFBhdGgoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuKSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2ldXG5cbiAgICAvLyBJZiB3ZSdyZSBhdCB0aGUgbGFzdCBrZXksIHNldCB0aGUgdmFsdWUuXG4gICAgaWYgKGkgPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgY3VycmVudFtrZXldID0gdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCBhbiBvYmplY3QgKGF2b2lkIG92ZXJ3cml0aW5nIGFycmF5cyksIGNyZWF0ZSBhIG5ldyBvYmplY3RcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpIHx8XG4gICAgICAgIHR5cGVvZiBjdXJyZW50W2tleV0gIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgY3VycmVudFtrZXldID09PSBudWxsIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkoY3VycmVudFtrZXldKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRba2V5XSA9IHt9XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ2lyY3VpdFJ1bm5lciB9IGZyb20gXCIuL0NpcmN1aXRSdW5uZXJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4sXG4pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiICYmXG4gICAgIWZpbGVzeXN0ZW1PckNvZGVTdHJpbmcuaW5jbHVkZXMoXCJleHBvcnRcIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBcImV4cG9ydFwiIGtleXdvcmQgd2Fzbid0IGZvdW5kIGluIHlvdXIgcHJvdmlkZWQgY29kZS4gWW91IG5lZWQgdG8gZXhwb3J0IGEgY29tcG9uZW50IGluIHlvdXIgY29kZSwgZS5nLlxcblxcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcXG4gIDxyZXNpc3RvciBuYW1lPVwiUjFcIiByZXNpc3RhbmNlPVwiMWtcIiAvPlxcbilgLFxuICAgIClcbiAgfVxuICBjb25zdCBmaWxlc3lzdGVtID1cbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7IFwidXNlci1jb2RlLnRzeFwiOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nIH1cbiAgICAgIDogZmlsZXN5c3RlbU9yQ29kZVN0cmluZ1xuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcigpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czogeyBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47IGV4cG9ydE5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGlmICghbW9kdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgbW9kdWxlID0gYEB0c2NpLyR7bW9kdWxlLnJlcGxhY2UoL1xcLy8sIFwiLlwiKX1gXG4gIH1cbiAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCBydW5Uc2NpcmN1aXRDb2RlKFxuICAgIHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIGV4cG9ydHMgdGhhdCBhcmUgbm90IHRoZSBkZWZhdWx0IGV4cG9ydCBieSBzY2FubmluZ1xuICAgICAgLy8gb3RoZXJFeHBvcnRzIGZvciBjb21wb25lbnRzXG4gICAgICBcInVzZXItY29kZS50c3hcIjogYFxuICAgIGltcG9ydCBNb2R1bGUsICogYXMgb3RoZXJFeHBvcnRzIGZyb20gXCIke21vZHVsZX1cIjtcblxuICAgIGxldCBleHBvcnROYW1lID0gXCIke29wdHMuZXhwb3J0TmFtZSA/PyBcIlwifVwiXG5cbiAgICBpZiAoKCFNb2R1bGUgfHwgdHlwZW9mIE1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSAmJiAhQm9vbGVhbihleHBvcnROYW1lKSkge1xuICAgICAgZXhwb3J0TmFtZSA9IE9iamVjdC5rZXlzKG90aGVyRXhwb3J0cykuZmlsdGVyKGtleSA9PiBrZXlbMF0gPT09IGtleVswXS50b1VwcGVyQ2FzZSgpICYmIHR5cGVvZiBvdGhlckV4cG9ydHNba2V5XSA9PT0gXCJmdW5jdGlvblwiKVswXVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBleHBvcnROYW1lID8gb3RoZXJFeHBvcnRzW2V4cG9ydE5hbWVdIDogTW9kdWxlXG5cbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXGBObyBleHBvcnQgZm91bmQgZm9yIG1vZHVsZSBcIlxcJHttb2R1bGV9XCIgKHRyaWVkIFwiXFwke2V4cG9ydE5hbWUgPz8gXCJkZWZhdWx0XCJ9XCIpXFxgKVxuICAgIH1cblxuICAgIGV4cG9ydCBkZWZhdWx0IGRlZmF1bHRFeHBvcnQ7XG4gICAgYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1haW5Db21wb25lbnRQcm9wczogb3B0cy5wcm9wcyxcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsbUJBQW1CO0FBRTVCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksV0FBVztBQUN2QixZQUFZLHdCQUF3Qjs7O0FDQzdCLElBQU0sZ0NBQWdDLENBQzNDLG1CQUN1QjtBQUV2QixNQUFJLFFBQVEsZUFBZSxNQUFNLGdCQUFnQjtBQUNqRCxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFJekIs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QUFDQSxVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLFFBQU0sYUFDSixPQUFPLDJCQUEyQixXQUM5QixFQUFFLGlCQUFpQix1QkFBdUIsSUFDMUM7QUFFTixRQUFNLGdCQUFnQixJQUFJLGNBQWM7QUFFeEMsUUFBTSxjQUFjLGlCQUFpQjtBQUFBLElBQ25DLE9BQU87QUFBQSxJQUNQLEdBQUc7QUFBQSxFQUNMLENBQUM7QUFFRCxRQUFNLGNBQWMsbUJBQW1CO0FBRXZDLFNBQU8sTUFBTSxjQUFjLGVBQWU7QUFDNUM7OztBQzNCTyxJQUFNLHFCQUFxQixPQUNoQyxRQUNBLE9BQTZELENBQUMsTUFDM0Q7QUFDSCxNQUFJLENBQUMsT0FBTyxXQUFXLEdBQUcsR0FBRztBQUMzQixhQUFTLFNBQVMsT0FBTyxRQUFRLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFDN0M7QUFDQSxRQUFNLGNBQWMsTUFBTTtBQUFBLElBQ3hCO0FBQUE7QUFBQTtBQUFBLE1BR0UsaUJBQWlCO0FBQUEsNkNBQ3NCLE1BQU07QUFBQTtBQUFBLHdCQUUzQixLQUFLLGNBQWMsRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFjekM7QUFBQSxJQUNBO0FBQUEsTUFDRSxvQkFBb0IsS0FBSztBQUFBLElBQzNCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiaW1wb3J0TmFtZSIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJ1bnByZWZpeGVkUGF0aCIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyJdCn0K