path-terminal-init 0.2.11 → 0.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -34,7 +34,7 @@ const ANDROID_SDK_GITHUB_URL = "https://github.com/keyman12/path-terminal-sdk-an
34
34
  const SDK_VERSION = "1.5.0";
35
35
  const PATH_MAVEN_URL = "https://mcp.path2ai.tech/maven";
36
36
  const ANDROID_SDK_GROUP = "tech.path2ai.sdk";
37
- const ANDROID_SDK_VERSION = "1.6.0";
37
+ const ANDROID_SDK_VERSION = "1.8.0";
38
38
  const ANDROID_SDK_MODULES = ["path-core-models", "path-terminal-sdk", "path-emulator-adapter", "path-psdk-adapter"];
39
39
  const MCP_SERVER_URL = "https://mcp.path2ai.tech/sse";
40
40
  const RULES_FETCH_URL = "https://mcp.path2ai.tech/rules";
@@ -337,7 +337,7 @@ function checkAndroidManifest(dir) {
337
337
  function findCsprojFiles(dir) {
338
338
  const found = [];
339
339
  const walk = (d, depth) => {
340
- if (depth > 1) return;
340
+ if (depth > 3) return;
341
341
  let entries = [];
342
342
  try {
343
343
  entries = fs.readdirSync(d);
@@ -345,7 +345,7 @@ function findCsprojFiles(dir) {
345
345
  return;
346
346
  }
347
347
  for (const e of entries) {
348
- if (e.startsWith(".") || e === "bin" || e === "obj") continue;
348
+ if (e.startsWith(".") || e === "bin" || e === "obj" || e === "node_modules" || e === "packages") continue;
349
349
  const full = path.join(d, e);
350
350
  try {
351
351
  const st = fs.statSync(full);
@@ -434,6 +434,31 @@ ${refs}
434
434
  fs.writeFileSync(target, content, "utf-8");
435
435
  return target;
436
436
  }
437
+ function hasClaudeCli() {
438
+ try {
439
+ (0, import_child_process.execSync)(process.platform === "win32" ? "where claude" : "which claude", { stdio: "ignore" });
440
+ return true;
441
+ } catch {
442
+ return false;
443
+ }
444
+ }
445
+ function findClaudeBinary() {
446
+ const home = process.env.USERPROFILE || process.env.HOME || "";
447
+ if (!home) return null;
448
+ const candidate = process.platform === "win32" ? path.join(home, ".local", "bin", "claude.exe") : path.join(home, ".local", "bin", "claude");
449
+ return fs.existsSync(candidate) ? candidate : null;
450
+ }
451
+ function addClaudeDirToUserPath() {
452
+ try {
453
+ (0, import_child_process.execSync)(
454
+ `powershell -NoProfile -Command "$u=[Environment]::GetEnvironmentVariable('Path','User'); if ($u -notlike '*\\.local\\bin*') { [Environment]::SetEnvironmentVariable('Path', ($u.TrimEnd(';') + ';' + $env:USERPROFILE + '\\.local\\bin'), 'User') }"`,
455
+ { stdio: "ignore" }
456
+ );
457
+ return true;
458
+ } catch {
459
+ return false;
460
+ }
461
+ }
437
462
  function platformLabel(platform) {
438
463
  switch (platform) {
439
464
  case "android":
@@ -446,7 +471,7 @@ function platformLabel(platform) {
446
471
  return "iOS";
447
472
  }
448
473
  }
449
- function printSummary(agent, platform, actions, warnings, manualSteps) {
474
+ async function printSummary(agent, platform, actions, warnings, manualSteps) {
450
475
  const isAndroid = platform === "android";
451
476
  const isWindows = platform === "windows11" || platform === "windows10";
452
477
  console.log("\n" + import_chalk.default.bold("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
@@ -470,6 +495,38 @@ function printSummary(agent, platform, actions, warnings, manualSteps) {
470
495
  const mcpPrompt = platform === "android" ? "integrate-path-android" : platform === "windows11" ? "integrate-path-windows11" : platform === "windows10" ? "integrate-path-windows10" : "integrate-path-sale";
471
496
  const firstPrompt = ' "Integrate the Path Terminal SDK into this EPOS app. Read CLAUDE.md\n for the integration rules, then use the Path MCP ' + mcpPrompt + '\n prompt to add a Path POS Adapter in Settings \u2014 a backend switcher for the\n Path POS Emulator (Wi-Fi/IP or Bluetooth) and a real Verifone terminal."';
472
497
  if (agent === "claude") {
498
+ if (!hasClaudeCli()) {
499
+ const binary = findClaudeBinary();
500
+ if (binary) {
501
+ console.log(import_chalk.default.yellow(`\u26A0 Claude Code is installed (${binary}) but its folder is not on your PATH,`));
502
+ console.log(import_chalk.default.yellow(" so the `claude` command won't work."));
503
+ if (process.platform === "win32") {
504
+ const fix = (await ask(import_chalk.default.bold(" Add it to your user PATH now? (y/n): "))).toLowerCase();
505
+ if (fix === "y" && addClaudeDirToUserPath()) {
506
+ console.log(import_chalk.default.green(" \u2713 Added to your user PATH."));
507
+ } else {
508
+ console.log(import_chalk.default.yellow(" To fix it yourself, run this in PowerShell:"));
509
+ console.log(import_chalk.default.cyan(" [Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path','User') + ';' + $env:USERPROFILE + '\\.local\\bin', 'User')"));
510
+ }
511
+ } else {
512
+ console.log(import_chalk.default.yellow(" Add it to your shell profile (~/.zshrc or ~/.bashrc):"));
513
+ console.log(import_chalk.default.cyan(` echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc`));
514
+ }
515
+ console.log(import_chalk.default.yellow(" \u2026then open a NEW terminal (PATH changes don't reach this one) and come back here."));
516
+ console.log();
517
+ } else {
518
+ console.log(import_chalk.default.yellow("\u26A0 Claude Code is not installed (the `claude` command was not found)."));
519
+ console.log(import_chalk.default.yellow(" Install it first:"));
520
+ if (process.platform === "win32") {
521
+ console.log(import_chalk.default.cyan(" irm https://claude.ai/install.ps1 | iex") + import_chalk.default.dim(" (PowerShell)"));
522
+ console.log(import_chalk.default.cyan(" curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd") + import_chalk.default.dim(" (CMD)"));
523
+ } else {
524
+ console.log(import_chalk.default.cyan(" curl -fsSL https://claude.ai/install.sh | bash"));
525
+ }
526
+ console.log(import_chalk.default.yellow(" \u2026then restart your terminal, run `claude` once to log in, and come back here."));
527
+ console.log();
528
+ }
529
+ }
473
530
  console.log(import_chalk.default.bold("\u{1F680} Start Claude Code in this directory:"));
474
531
  console.log(import_chalk.default.cyan(" claude --model sonnet"));
475
532
  console.log();
@@ -588,13 +645,18 @@ import_commander.program.name("path-terminal-init").description(
588
645
  }
589
646
  if (csproj) {
590
647
  actions.push(
591
- `SDK packages added to ${path.basename(csproj)} (x64): ${WINDOWS_SDK_PACKAGES.join(", ")}`
648
+ `SDK packages added to ${path.relative(cwd, csproj)} (x64): ${WINDOWS_SDK_PACKAGES.join(", ")}`
592
649
  );
593
650
  } else {
651
+ const candidates = findCsprojFiles(cwd);
652
+ const where = candidates.length > 0 ? `Open ${path.relative(cwd, candidates[0])} in a text editor` : `No .csproj was found under this directory \u2014 open your app project's .csproj (usually src\\<App>\\<App>.csproj) in a text editor`;
594
653
  manualSteps.push(
595
- `Add the Path SDK PackageReferences to your .csproj (versions ${WINDOWS_SDK_VERSION}):
596
- ` + WINDOWS_SDK_PACKAGES.map((p) => ` <PackageReference Include="${p}" Version="${WINDOWS_SDK_VERSION}" />`).join("\n") + `
597
- \u2026and set <PlatformTarget>x64</PlatformTarget> (the Verifone binding is x64 mixed-mode).`
654
+ `${where} and paste this block just above the closing </Project> line:
655
+ <ItemGroup>
656
+ ` + WINDOWS_SDK_PACKAGES.map((p) => ` <PackageReference Include="${p}" Version="${WINDOWS_SDK_VERSION}" />`).join("\n") + `
657
+ </ItemGroup>
658
+ Then inside the first <PropertyGroup> add: <PlatformTarget>x64</PlatformTarget>
659
+ (the Verifone binding is x64 mixed-mode). Save the file \u2014 no other change is needed.`
598
660
  );
599
661
  }
600
662
  if (feedOk && csproj) {
@@ -798,7 +860,7 @@ import_commander.program.name("path-terminal-init").description(
798
860
  }
799
861
  }
800
862
  }
801
- printSummary(agent, platform, actions, warnings, manualSteps);
863
+ await printSummary(agent, platform, actions, warnings, manualSteps);
802
864
  });
803
865
  import_commander.program.parse(process.argv);
804
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwicmVhZGxpbmVcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBvcmEgZnJvbSBcIm9yYVwiO1xuXG4vLyBpT1MgaW5zdGFsbHMgdGhlIENPTVBJTEVEIFNESyBmcm9tIHRoZSBwdWJsaWMgcmVsZWFzZSByZXBvIChYQ0ZyYW1ld29ya3MgaG9zdGVkIG9uIHRoZVxuLy8gUGF0aCBib3g7IG1hbmlmZXN0ICsgY2hlY2tzdW1zIG9ubHkpLiBUaGUgc291cmNlIHJlcG8gaXMgcHJpdmF0ZSBcdTIwMTQgbmV2ZXIgcG9pbnQgaGVyZSBhdCBpdC5cbmNvbnN0IFNES19HSVRIVUJfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20va2V5bWFuMTIvUGF0aC10ZXJtaW5hbC1zZGstSU9TLVJlbGVhc2VcIjtcbmNvbnN0IEFORFJPSURfU0RLX0dJVEhVQl9VUkwgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9rZXltYW4xMi9wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkXCI7XG5jb25zdCBTREtfVkVSU0lPTiA9IFwiMS41LjBcIjsgLy8gbWluaW11bSB2ZXJzaW9uIHRvIHJlZmVyZW5jZVxuLy8gQW5kcm9pZCBTREsgaXMgc2VydmVkIGZyb20gdGhlIFBhdGgtaG9zdGVkIE1hdmVuIHJlcG8gKG9uZSBVUkwsIGluY2wuIHRoZSBWZXJpZm9uZVxuLy8gYmFja2VuZCArIGl0cyAuYWFyKS4gTm8gSml0UGFjaywgbm8gc2libGluZyBjaGVja291dCBcdTIwMTQgbWlycm9ycyB0aGUgaU9TIFNQTS1VUkwgbW9kZWwuXG5jb25zdCBQQVRIX01BVkVOX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL21hdmVuXCI7XG5jb25zdCBBTkRST0lEX1NES19HUk9VUCA9IFwidGVjaC5wYXRoMmFpLnNka1wiO1xuY29uc3QgQU5EUk9JRF9TREtfVkVSU0lPTiA9IFwiMS42LjBcIjtcbmNvbnN0IEFORFJPSURfU0RLX01PRFVMRVMgPSBbXCJwYXRoLWNvcmUtbW9kZWxzXCIsIFwicGF0aC10ZXJtaW5hbC1zZGtcIiwgXCJwYXRoLWVtdWxhdG9yLWFkYXB0ZXJcIiwgXCJwYXRoLXBzZGstYWRhcHRlclwiXTtcbmNvbnN0IE1DUF9TRVJWRVJfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvc3NlXCI7XG5jb25zdCBSVUxFU19GRVRDSF9VUkwgPSBcImh0dHBzOi8vbWNwLnBhdGgyYWkudGVjaC9ydWxlc1wiO1xuY29uc3QgQU5EUk9JRF9SVUxFU19GRVRDSF9VUkwgPSBcImh0dHBzOi8vbWNwLnBhdGgyYWkudGVjaC9ydWxlcy9hbmRyb2lkXCI7XG5jb25zdCBXSU5ET1dTMTFfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvd2luZG93czExXCI7XG5jb25zdCBXSU5ET1dTMTBfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvd2luZG93czEwXCI7XG5cbmNvbnN0IFJVTEVTX1NPVVJDRSA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vcnVsZXMvaW9zL3BhdGgtaW50ZWdyYXRpb24ubWRjXCIpO1xuY29uc3QgQU5EUk9JRF9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL2FuZHJvaWQvcGF0aC1pbnRlZ3JhdGlvbi1hbmRyb2lkLm1kY1wiKTtcbmNvbnN0IFdJTkRPV1MxMV9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL3dpbmRvd3MtMTEvcGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTEubWRjXCIpO1xuY29uc3QgV0lORE9XUzEwX1JVTEVTX1NPVVJDRSA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vcnVsZXMvd2luZG93cy0xMC9wYXRoLWludGVncmF0aW9uLXdpbmRvd3MxMC5tZGNcIik7XG5cbi8vIFRoZSBXaW5kb3dzIFNESyBpcyBzZXJ2ZWQgZnJvbSB0aGUgUGF0aC1ob3N0ZWQgTnVHZXQgZmVlZCAob25lIGZlZWQgVVJMLCBpbmNsLiB0aGVcbi8vIFZlcmlmb25lIGJhY2tlbmQgKyBpdHMgYnVuZGxlZCBiaW5kaW5nKS4gTm8gc2libGluZyBjaGVja291dCBcdTIwMTQgbWlycm9ycyB0aGUgQW5kcm9pZFxuLy8gTWF2ZW4tVVJMIC8gaU9TIFNQTS1VUkwgbW9kZWwuIE9uZSBwYWNrYWdlIHNldCBzZXJ2ZXMgYm90aCB0aGUgV2luVUkgMyAvIC5ORVQgMTAgYW5kXG4vLyBXUEYgLyAuTkVUIEZXIDQuOCBzdGFja3MgKE51R2V0IHBpY2tzIHRoZSByaWdodCBmbGF2b3VyIHBlciB0YXJnZXQgZnJhbWV3b3JrKS5cbmNvbnN0IFBBVEhfTlVHRVRfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvbnVnZXQvaW5kZXguanNvblwiO1xuY29uc3QgV0lORE9XU19TREtfVkVSU0lPTiA9IFwiMS41LjBcIjtcbi8vIENvcmVNb2RlbHMgYXJyaXZlcyB0cmFuc2l0aXZlbHkgdmlhIFBhdGguVGVybWluYWwuU2RrOyBQc2RrQWRhcHRlciBjYXJyaWVzIFZlcmlmb25lICh4NjQpLlxuY29uc3QgV0lORE9XU19TREtfUEFDS0FHRVMgPSBbXG4gIFwiUGF0aC5UZXJtaW5hbC5TZGtcIixcbiAgXCJQYXRoLlRlcm1pbmFsLkVtdWxhdG9yQWRhcHRlclwiLFxuICBcIlBhdGguVGVybWluYWwuTW9ja0FkYXB0ZXJcIixcbiAgXCJQYXRoLlRlcm1pbmFsLkRpYWdub3N0aWNzXCIsXG4gIFwiUGF0aC5UZXJtaW5hbC5Qc2RrQWRhcHRlclwiLFxuXTtcbi8vIFRoZSBTREsgcmVwbyBuYW1lIFx1MjAxNCBrZXB0IG9ubHkgZm9yIHRoZSBub3RlIHRoYXQgdGhlIGluLXJlcG8gZGVtb3MgYnVpbGQgZnJvbSBzb3VyY2UuXG5jb25zdCBXSU5ET1dTX1NES19SRVBPID0gXCJQYXRoLXRlcm1pbmFsLXNkay13aW5kb3dzMTFcIjtcblxudHlwZSBBZ2VudFR5cGUgPSBcImN1cnNvclwiIHwgXCJjbGF1ZGVcIjtcbnR5cGUgUGxhdGZvcm0gPSBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFV0aWxpdGllcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXNrKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluLCBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0IH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihxdWVzdGlvbiwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaW5kWGNvZGVQcm9qZWN0KGRpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGlzWGNvZGVBcnRpZmFjdCA9IChlOiBzdHJpbmcpID0+XG4gICAgZS5lbmRzV2l0aChcIi54Y29kZXByb2pcIikgfHwgZS5lbmRzV2l0aChcIi54Y3dvcmtzcGFjZVwiKTtcblxuICAvLyBDaGVjayB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3RcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7XG4gIGNvbnN0IHByb2ogPSBlbnRyaWVzLmZpbmQoaXNYY29kZUFydGlmYWN0KTtcbiAgaWYgKHByb2opIHJldHVybiBwYXRoLmpvaW4oZGlyLCBwcm9qKTtcblxuICAvLyBTZWFyY2ggb25lIGxldmVsIGRlZXAgaW4gc3ViZGlyZWN0b3JpZXMgKGhhbmRsZXMgcmVwb3Mgd2hlcmUgdGhlXG4gIC8vIFhjb2RlIHByb2plY3Qgc2l0cyBpbnNpZGUgYSBuYW1lZCBzdWJmb2xkZXIsIGUuZy4gT3JkZXJjaGFtcGlvbkVQT1MvKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN1YiA9IHBhdGguam9pbihkaXIsIGVudHJ5KTtcbiAgICB0cnkge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHN1YikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb25zdCBzdWJFbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc3ViKTtcbiAgICAgICAgY29uc3Qgc3ViUHJvaiA9IHN1YkVudHJpZXMuZmluZChpc1hjb2RlQXJ0aWZhY3QpO1xuICAgICAgICBpZiAoc3ViUHJvaikgcmV0dXJuIHBhdGguam9pbihzdWIsIHN1YlByb2opO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBza2lwIHVucmVhZGFibGUgZGlycyAqLyB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VTd2lmdChkaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwID0gcGF0aC5qb2luKGRpciwgXCJQYWNrYWdlLnN3aWZ0XCIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwKSA/IHAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBoYXNTREtEZXBlbmRlbmN5KHBhY2thZ2VTd2lmdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZVN3aWZ0LCBcInV0Zi04XCIpO1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcyhcInBhdGgtdGVybWluYWwtc2RrXCIpIHx8IGNvbnRlbnQuaW5jbHVkZXMoXCJQYXRoVGVybWluYWxTREtcIik7XG59XG5cbmZ1bmN0aW9uIGhhc1hjb2RlUHJvamVjdFNES0RlcGVuZGVuY3koeGNvZGVQcm9qZWN0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gWGNvZGUgc3RvcmVzIHJlc29sdmVkIFNQTSBwYWNrYWdlcyBpbiB0aGUgd29ya3NwYWNlJ3MgUGFja2FnZS5yZXNvbHZlZFxuICBjb25zdCByZXNvbHZlZFBhdGhzID0gW1xuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwicHJvamVjdC54Y3dvcmtzcGFjZVwiLCBcInhjc2hhcmVkZGF0YVwiLCBcInN3aWZ0cG1cIiwgXCJQYWNrYWdlLnJlc29sdmVkXCIpLFxuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwieGNzaGFyZWRkYXRhXCIsIFwic3dpZnRwbVwiLCBcIlBhY2thZ2UucmVzb2x2ZWRcIiksXG4gIF07XG4gIGZvciAoY29uc3QgcCBvZiByZXNvbHZlZFBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgXCJ1dGYtOFwiKTtcbiAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFwicGF0aC10ZXJtaW5hbC1zZGtcIikgfHwgY29udGVudC5pbmNsdWRlcyhcIlBhdGhUZXJtaW5hbFNES1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlU3dpZnRQYXRoLCBcInV0Zi04XCIpO1xuXG4gIC8vIEFscmVhZHkgcHJlc2VudD9cbiAgaWYgKGhhc1NES0RlcGVuZGVuY3kocGFja2FnZVN3aWZ0UGF0aCkpIHJldHVybiBmYWxzZTtcblxuICAvLyBBZGQgdGhlIHBhY2thZ2UgZGVwZW5kZW5jeSBcdTIwMTQgZmluZCB0aGUgZGVwZW5kZW5jaWVzOiBbIGFycmF5XG4gIGNvbnN0IGRlcHNSZWdleCA9IC8oZGVwZW5kZW5jaWVzOlxccypcXFspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gQ2FuJ3Qgc2FmZWx5IGluamVjdCBcdTIwMTQgc3RydWN0dXJlIG5vdCByZWNvZ25pc2VkXG4gIH1cblxuICBjb25zdCBkZXBFbnRyeSA9IGBcXG4gICAgICAgIC5wYWNrYWdlKHVybDogXCIke1NES19HSVRIVUJfVVJMfVwiLCBmcm9tOiBcIiR7U0RLX1ZFUlNJT059XCIpLGA7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGVwc1JlZ2V4LCBgJDEke2RlcEVudHJ5fWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VTd2lmdFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ3Vyc29yLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgY29uc3QgY3Vyc29yRGlyID0gcGF0aC5qb2luKGRpciwgXCIuY3Vyc29yXCIpO1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGN1cnNvckRpciwgXCJtY3AuanNvblwiKTtcblxuICBmcy5ta2RpclN5bmMoY3Vyc29yRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBwYXRoRW50cnkgPSB7XG4gICAgXCJwYXRoLXRlcm1pbmFsXCI6IHsgdXJsOiBNQ1BfU0VSVkVSX1VSTCB9LFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gcGF0aEVudHJ5W1wicGF0aC10ZXJtaW5hbFwiXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiB0cnVlIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIEpTT04gXHUyMDE0IGRvbid0IG92ZXJ3cml0ZVxuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7IG1jcFNlcnZlcnM6IHBhdGhFbnRyeSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZpbGVuYW1lOiBzdHJpbmcgPSBcInBhdGgtaW50ZWdyYXRpb24ubWRjXCIsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihkaXIsIFwiLmN1cnNvclwiLCBcInJ1bGVzXCIpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZmlsZW5hbWUpO1xuXG4gIGZzLm1rZGlyU3luYyhydWxlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghY29udGVudCkgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG5cbiAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENsYXVkZSBDb2RlLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgLy8gQ2xhdWRlIENvZGUgcmVhZHMgLm1jcC5qc29uIGF0IHRoZSBwcm9qZWN0IHJvb3QgKHNhbWUgbWNwU2VydmVycyBmb3JtYXQgYXMgQ3Vyc29yKVxuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCIubWNwLmpzb25cIik7XG5cbiAgY29uc3Qgc2VydmVyRW50cnkgPSB7XG4gICAgdHlwZTogXCJzc2VcIixcbiAgICB1cmw6IE1DUF9TRVJWRVJfVVJMLFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gc2VydmVyRW50cnk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7XG4gICAgbWNwU2VydmVyczoge1xuICAgICAgXCJwYXRoLXRlcm1pbmFsXCI6IHNlcnZlckVudHJ5LFxuICAgIH0sXG4gIH07XG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiBmYWxzZSB9O1xufVxuXG4vLyBQcmUtYXBwcm92ZSB0aGUgcGF0aC10ZXJtaW5hbCBNQ1Agc2VydmVyIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiBzbyBDbGF1ZGVcbi8vIENvZGUgbG9hZHMgaXRzIHRvb2xzIG9uIHRoZSB2ZXJ5IGZpcnN0IHNlc3Npb24gd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgdG9cbi8vIGNsaWNrIHRocm91Z2ggYW4gYXBwcm92YWwgcHJvbXB0ICh3aGljaCBpcyBlYXN5IHRvIG1pc3MgYW5kIGxlYXZlcyB0aGUgYWdlbnRcbi8vIHJ1bm5pbmcgd2l0aG91dCBNQ1AgdG9vbHMpLlxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVTZXR0aW5ncyhkaXI6IHN0cmluZyk6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuOyBhbHJlYWR5QXBwcm92ZWQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihkaXIsIFwiLmNsYXVkZVwiKTtcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJzZXR0aW5ncy5qc29uXCIpO1xuICBjb25zdCBNQ1BfTkFNRSA9IFwicGF0aC10ZXJtaW5hbFwiO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGF1ZGVEaXIpKSB7XG4gICAgZnMubWtkaXJTeW5jKGNsYXVkZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQ6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShleGlzdGluZy5lbmFibGVkTWNwanNvblNlcnZlcnMpID8gZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzIDogW107XG4gICAgICBpZiAoY3VycmVudC5pbmNsdWRlcyhNQ1BfTkFNRSkpIHtcbiAgICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzID0gWy4uLmN1cnJlbnQsIE1DUF9OQU1FXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShleGlzdGluZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IHRydWUsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlLCBhbHJlYWR5QXBwcm92ZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGVuYWJsZWRNY3Bqc29uU2VydmVyczogW01DUF9OQU1FXSxcbiAgfTtcbiAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkaXIsIFwiQ0xBVURFLm1kXCIpO1xuXG4gIC8vIERvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBDTEFVREUubWQgXHUyMDE0IGl0IG1heSBoYXZlIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhkZXN0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcyhcIlBhdGggVGVybWluYWwgU0RLXCIpKSB7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgc2tpcHBlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgQ0xBVURFLm1kXG4gICAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gICAgaWYgKCFydWxlcykgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZGVzdFBhdGgsIFwiXFxuXFxuXCIgKyBydWxlcywgXCJ1dGYtOFwiKTtcbiAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghcnVsZXMpIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiBmYWxzZSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBydWxlcywgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZTogc3RyaW5nID0gUlVMRVNfU09VUkNFLCBmYWxsYmFja1VybD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmF3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhydWxlc1NvdXJjZSkpIHtcbiAgICByYXcgPSBmcy5yZWFkRmlsZVN5bmMocnVsZXNTb3VyY2UsIFwidXRmLThcIik7XG4gIH0gZWxzZSBpZiAoZmFsbGJhY2tVcmwpIHtcbiAgICB0cnkge1xuICAgICAgcmF3ID0gZXhlY1N5bmMoYGN1cmwgLXNmIC0tbWF4LXRpbWUgMTAgXCIke2ZhbGxiYWNrVXJsfVwiYCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuXG4gIC8vIFN0cmlwIHRoZSBZQU1MIGZyb250bWF0dGVyICgtLS0gLi4uIC0tLSkgdGhhdCBDdXJzb3IgdXNlc1xuICBjb25zdCBzdHJpcHBlZCA9IHJhdy5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLVxccyovLCBcIlwiKTtcbiAgcmV0dXJuIHN0cmlwcGVkLnRyaW0oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNoYXJlZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gY2hlY2tJbmZvUGxpc3QoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGxpc3RGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiBmaW5kUGxpc3RzKGQ6IHN0cmluZywgZGVwdGg6IG51bWJlciA9IDApIHtcbiAgICBpZiAoZGVwdGggPiA0KSByZXR1cm47XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGQpO1xuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZSA9PT0gXCJub2RlX21vZHVsZXNcIiB8fCBlLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZCwgZSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSBmaW5kUGxpc3RzKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICBlbHNlIGlmIChlID09PSBcIkluZm8ucGxpc3RcIikgcGxpc3RGaWxlcy5wdXNoKGZ1bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRQbGlzdHMoZGlyKTtcblxuICBmb3IgKGNvbnN0IHBsaXN0IG9mIHBsaXN0RmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBsaXN0LCBcInV0Zi04XCIpO1xuICAgIGlmICghY29udGVudC5pbmNsdWRlcyhcIk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvblwiKSkge1xuICAgICAgaXNzdWVzLnB1c2gocGxpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBbmRyb2lkIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGZpbmRBbmRyb2lkUHJvamVjdChkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIikpICYmXG4gICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXIsIFwiYXBwXCIsIFwiYnVpbGQuZ3JhZGxlLmt0c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEluc3RhbGxlZCA9IHRoZSBQYXRoIE1hdmVuIHJlcG8gaXMgcmVnaXN0ZXJlZCBBTkQgYSB0ZWNoLnBhdGgyYWkuc2RrIGRlcCBpcyBwcmVzZW50LlxuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHNldHRpbmdzID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlcyhQQVRIX01BVkVOX1VSTCkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5qb2luKGRpciwgXCJhcHBcIiwgXCJidWlsZC5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYnVpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGJ1aWxkID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIC9eXFxzKmltcGxlbWVudGF0aW9uXFwoXCJ0ZWNoXFwucGF0aDJhaVxcLnNkazpwYXRoLXRlcm1pbmFsLXNkay9tLnRlc3QoYnVpbGQpO1xufVxuXG5mdW5jdGlvbiBpbmplY3RQYXRoTWF2ZW5SZXBvKGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNldHRpbmdzUGF0aCA9IHBhdGguam9pbihkaXIsIFwic2V0dGluZ3MuZ3JhZGxlLmt0c1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNldHRpbmdzUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpO1xuICBpZiAoY29udGVudC5pbmNsdWRlcyhQQVRIX01BVkVOX1VSTCkpIHJldHVybiB0cnVlOyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgLy8gQWRkIHRoZSBQYXRoIE1hdmVuIHJlcG8gaW5zaWRlIGRlcGVuZGVuY3lSZXNvbHV0aW9uTWFuYWdlbWVudCByZXBvc2l0b3JpZXMgYmxvY2tcbiAgY29uc3QgcmVwb1JlZ2V4ID0gLyhkZXBlbmRlbmN5UmVzb2x1dGlvbk1hbmFnZW1lbnRcXHMqXFx7W159XSpyZXBvc2l0b3JpZXNcXHMqXFx7KS9zO1xuICBpZiAoIXJlcG9SZWdleC50ZXN0KGNvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVwb1JlZ2V4LCBgJDFcXG4gICAgICAgIG1hdmVuIHsgdXJsID0gdXJpKFwiJHtQQVRIX01BVkVOX1VSTH1cIikgfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBidWlsZFBhdGggPSBwYXRoLmpvaW4oZGlyLCBcImFwcFwiLCBcImJ1aWxkLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhidWlsZFBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAvLyBBbHJlYWR5IHByZXNlbnQgYW5kIHVuY29tbWVudGVkIFx1MjAxNCBub3RoaW5nIHRvIGRvXG4gIGlmICgvXlxccyppbXBsZW1lbnRhdGlvblxcKFwidGVjaFxcLnBhdGgyYWlcXC5zZGs6cGF0aC10ZXJtaW5hbC1zZGsvbS50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCBkZXBzID0gQU5EUk9JRF9TREtfTU9EVUxFU1xuICAgIC5tYXAoKG0pID0+IGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0dST1VQfToke219OiR7QU5EUk9JRF9TREtfVkVSU0lPTn1cIilgKVxuICAgIC5qb2luKFwiXFxuXCIpICsgXCJcXG5cIjtcblxuICAvLyBQcmVzZW50IGJ1dCBjb21tZW50ZWQgb3V0IChvbGRlciBoYXJuZXNzIHNjYWZmb2xkcykgXHUyMDE0IHVuY29tbWVudC9yZXBsYWNlIHRob3NlIGxpbmVzXG4gIGlmICgvcGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZHx0ZWNoXFwucGF0aDJhaVxcLnNkay8udGVzdChjb250ZW50KSkge1xuICAgIGZvciAoY29uc3QgbSBvZiBBTkRST0lEX1NES19NT0RVTEVTKSB7XG4gICAgICBjb25zdCBjb21tZW50ZWQgPSBuZXcgUmVnRXhwKGBeXFxcXHMqLy9cXFxccyppbXBsZW1lbnRhdGlvblxcXFwoKD86XCJ8JykoPzpjb21cXFxcLmdpdGh1YlxcXFwua2V5bWFuMTJcXFxcLnBhdGgtdGVybWluYWwtc2RrLWFuZHJvaWR8dGVjaFxcXFwucGF0aDJhaVxcXFwuc2RrKToke219W15cIicpXSooPzpcInwnKVxcXFwpYCwgXCJnbVwiKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoY29tbWVudGVkLCBgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19HUk9VUH06JHttfToke0FORFJPSURfU0RLX1ZFUlNJT059XCIpYCk7XG4gICAgfVxuICAgIC8vIElmIHBhdGgtcHNkay1hZGFwdGVyIHdhc24ndCBpbiB0aGUgb2xkIHNjYWZmb2xkLCBhZGQgdGhlIHdob2xlIGJsb2NrIG9uY2UuXG4gICAgaWYgKCEvdGVjaFxcLnBhdGgyYWlcXC5zZGs6cGF0aC1wc2RrLWFkYXB0ZXIvLnRlc3QoY29udGVudCkpIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyhkZXBlbmRlbmNpZXNcXHMqXFx7KS8sIGAkMVxcbiR7ZGVwc31gKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhidWlsZFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBOb3QgcHJlc2VudCBhdCBhbGwgXHUyMDE0IGluamVjdCBhZnRlciB0aGUgZGVwZW5kZW5jaWVzIHsgb3BlbmluZyBicmFjZVxuICBjb25zdCBkZXBzUmVnZXggPSAvKGRlcGVuZGVuY2llc1xccypcXHspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkgcmV0dXJuIGZhbHNlO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGRlcHNSZWdleCwgYCQxXFxuJHtkZXBzfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKGJ1aWxkUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQW5kcm9pZE1hbmlmZXN0KGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZ1bmN0aW9uIGZpbmRNYW5pZmVzdHMoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyID0gMCkge1xuICAgIGlmIChkZXB0aCA+IDQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZnMucmVhZGRpclN5bmMoZCkpIHtcbiAgICAgIGlmIChlLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGUgPT09IFwiYnVpbGRcIikgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGQsIGUpO1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGwpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgZmluZE1hbmlmZXN0cyhmdWxsLCBkZXB0aCArIDEpO1xuICAgICAgZWxzZSBpZiAoZSA9PT0gXCJBbmRyb2lkTWFuaWZlc3QueG1sXCIpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsLCBcInV0Zi04XCIpO1xuICAgICAgICBpZiAoIWNvbnRlbnQuaW5jbHVkZXMoXCJCTFVFVE9PVEhfU0NBTlwiKSkgaXNzdWVzLnB1c2goZnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZpbmRNYW5pZmVzdHMoZGlyKTtcbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdpbmRvd3MgaGVscGVycyAoLk5FVCBcdTIwMTQgV2luVUkgMyAvIC5ORVQgMTAgYW5kIFdQRiAvIC5ORVQgRlcgNC44KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gQ29sbGVjdCAuY3Nwcm9qIGZpbGUgcGF0aHMgaW4gY3dkIGFuZCBvbmUgbGV2ZWwgZGVlcC5cbmZ1bmN0aW9uIGZpbmRDc3Byb2pGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHdhbGsgPSAoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGRlcHRoID4gMSkgcmV0dXJuO1xuICAgIGxldCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkKTsgfSBjYXRjaCB7IHJldHVybjsgfVxuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZS5zdGFydHNXaXRoKFwiLlwiKSB8fCBlID09PSBcImJpblwiIHx8IGUgPT09IFwib2JqXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnVsbCA9IHBhdGguam9pbihkLCBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICAgIGlmIChzdC5pc0RpcmVjdG9yeSgpKSB3YWxrKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICAgIGVsc2UgaWYgKGUuZW5kc1dpdGgoXCIuY3Nwcm9qXCIpKSBmb3VuZC5wdXNoKGZ1bGwpO1xuICAgICAgfSBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgIH1cbiAgfTtcbiAgd2FsayhkaXIsIDApO1xuICByZXR1cm4gZm91bmQ7XG59XG5cbi8vIEEgV2luZG93cyBwcm9qZWN0ID0gYSAuc2xuIG9yIGEgLmNzcHJvaiBpbiBjd2Qgb3Igb25lIGxldmVsIGRlZXAuXG5mdW5jdGlvbiBmaW5kV2luZG93c1Byb2plY3QoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUuZW5kc1dpdGgoXCIuc2xuXCIpKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5sZW5ndGggPiAwO1xufVxuXG4vLyBXaW4xMSA9IFdpblVJIDMgLyAuTkVUIDEwIChuZXQxMC4wLXdpbmRvd3MpOyBXaW4xMCA9IFdQRiAvIC5ORVQgRnJhbWV3b3JrIDQuOCAobmV0NDgpLlxuLy8gRGVmYXVsdCB0byBXaW5kb3dzIDExICh0aGUgbW9kZXJuIHN0YWNrKSB3aGVuIHRoZSBzaWduYWwgaXMgYW1iaWd1b3VzLlxuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZsYXZvdXIoZGlyOiBzdHJpbmcpOiBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIiB7XG4gIGNvbnN0IGJsb2IgPSBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5tYXAoKGYpID0+IHtcbiAgICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGYsIFwidXRmLThcIik7IH0gY2F0Y2ggeyByZXR1cm4gXCJcIjsgfVxuICB9KS5qb2luKFwiXFxuXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChibG9iLmluY2x1ZGVzKFwibmV0NDhcIikgfHwgYmxvYi5pbmNsdWRlcyhcIjx1c2V3cGY+dHJ1ZVwiKSB8fCBibG9iLmluY2x1ZGVzKFwidjQuOFwiKSkgcmV0dXJuIFwid2luZG93czEwXCI7XG4gIHJldHVybiBcIndpbmRvd3MxMVwiO1xufVxuXG5mdW5jdGlvbiBoYXNXaW5kb3dzU0RLRGVwZW5kZW5jeShkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmluZENzcHJvakZpbGVzKGRpcikuc29tZSgoZikgPT4ge1xuICAgIHRyeSB7IHJldHVybiAvUGF0aFxcLlRlcm1pbmFsXFwuU2RrLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmLCBcInV0Zi04XCIpKTsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbn1cblxuLy8gQWRkIHRoZSBQYXRoIE51R2V0IGZlZWQgdG8gYSBudWdldC5jb25maWcgYmVzaWRlIHRoZSBwcm9qZWN0IChjcmVhdGUgaXQgaWYgYWJzZW50KS5cbmZ1bmN0aW9uIGluamVjdFBhdGhOdWdldENvbmZpZyhkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjZmdQYXRoID0gcGF0aC5qb2luKGRpciwgXCJudWdldC5jb25maWdcIik7XG4gIGlmIChmcy5leGlzdHNTeW5jKGNmZ1BhdGgpKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY2ZnUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcyhQQVRIX05VR0VUX1VSTCkpIHJldHVybiB0cnVlOyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICBpZiAoLzxwYWNrYWdlU291cmNlcz4vLnRlc3QoY29udGVudCkpIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLzxwYWNrYWdlU291cmNlcz4vLCBgPHBhY2thZ2VTb3VyY2VzPlxcbiAgICA8YWRkIGtleT1cInBhdGhcIiB2YWx1ZT1cIiR7UEFUSF9OVUdFVF9VUkx9XCIgLz5gKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY2ZnUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7IC8vIHVuZXhwZWN0ZWQgc2hhcGUgXHUyMDE0IGxlYXZlIGl0IGZvciBhIG1hbnVhbCBzdGVwXG4gIH1cbiAgY29uc3QgY2ZnID1cbiAgICBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+XFxuYCArXG4gICAgYDxjb25maWd1cmF0aW9uPlxcbmAgK1xuICAgIGAgIDxwYWNrYWdlU291cmNlcz5cXG5gICtcbiAgICBgICAgIDxhZGQga2V5PVwicGF0aFwiIHZhbHVlPVwiJHtQQVRIX05VR0VUX1VSTH1cIiAvPlxcbmAgK1xuICAgIGAgIDwvcGFja2FnZVNvdXJjZXM+XFxuYCArXG4gICAgYDwvY29uZmlndXJhdGlvbj5cXG5gO1xuICBmcy53cml0ZUZpbGVTeW5jKGNmZ1BhdGgsIGNmZywgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIEFkZCB0aGUgUGF0aCBTREsgUGFja2FnZVJlZmVyZW5jZXMgdG8gdGhlIGFwcCdzIC5jc3Byb2ogYW5kIGVuc3VyZSBpdCBidWlsZHMgeDY0ICh0aGVcbi8vIFZlcmlmb25lIGJpbmRpbmcgaXMgeDY0IG1peGVkLW1vZGUpLiBSZXR1cm5zIHRoZSBtb2RpZmllZCBmaWxlIHBhdGgsIG9yIG51bGwgaWYgbm9uZSBmb3VuZC5cbmZ1bmN0aW9uIGluamVjdFdpbmRvd3NQYWNrYWdlUmVmZXJlbmNlcyhkaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjc3Byb2pzID0gZmluZENzcHJvakZpbGVzKGRpcik7XG4gIGlmIChjc3Byb2pzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIC8vIFByZWZlciBhIG5vbi10ZXN0Ly1oYXJuZXNzIHByb2plY3Q7IGZhbGwgYmFjayB0byB0aGUgZmlyc3QgZm91bmQuXG4gIGNvbnN0IHRhcmdldCA9IGNzcHJvanMuZmluZCgoZikgPT4gIS90ZXN0fGhhcm5lc3MvaS50ZXN0KHBhdGguYmFzZW5hbWUoZikpKSA/PyBjc3Byb2pzWzBdO1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0YXJnZXQsIFwidXRmLThcIik7XG4gIGlmICgvUGFja2FnZVJlZmVyZW5jZVxccytJbmNsdWRlPVwiUGF0aFxcLlRlcm1pbmFsXFwuLy50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdGFyZ2V0OyAvLyBhbHJlYWR5IHRoZXJlXG5cbiAgY29uc3QgcmVmcyA9IFdJTkRPV1NfU0RLX1BBQ0tBR0VTXG4gICAgLm1hcCgocCkgPT4gYCAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPVwiJHtwfVwiIFZlcnNpb249XCIke1dJTkRPV1NfU0RLX1ZFUlNJT059XCIgLz5gKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBpdGVtR3JvdXAgPVxuICAgIGBcXG4gIDwhLS0gUGF0aCBUZXJtaW5hbCBTREsgXHUyMDE0IGZyb20gdGhlIFBhdGggTnVHZXQgZmVlZCAoc2VlIG51Z2V0LmNvbmZpZykuIC0tPlxcbmAgK1xuICAgIGAgIDxJdGVtR3JvdXA+XFxuJHtyZWZzfVxcbiAgPC9JdGVtR3JvdXA+XFxuYDtcblxuICAvLyBFbnN1cmUgeDY0IChWZXJpZm9uZSBiaW5kaW5nKS4gQWRkIHRvIHRoZSBmaXJzdCBQcm9wZXJ0eUdyb3VwIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgaWYgKCEvPFBsYXRmb3JtVGFyZ2V0Pi8udGVzdChjb250ZW50KSAmJiAvPFByb3BlcnR5R3JvdXA+Ly50ZXN0KGNvbnRlbnQpKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPFByb3BlcnR5R3JvdXA+LywgYDxQcm9wZXJ0eUdyb3VwPlxcbiAgICA8UGxhdGZvcm1UYXJnZXQ+eDY0PC9QbGF0Zm9ybVRhcmdldD5gKTtcbiAgfVxuICAvLyBJbnNlcnQgdGhlIEl0ZW1Hcm91cCBqdXN0IGJlZm9yZSB0aGUgY2xvc2luZyA8L1Byb2plY3Q+LlxuICBpZiAoIS88XFwvUHJvamVjdD5cXHMqJC8udGVzdChjb250ZW50KSkgcmV0dXJuIG51bGw7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLzxcXC9Qcm9qZWN0PlxccyokLywgYCR7aXRlbUdyb3VwfTwvUHJvamVjdD5cXG5gKTtcbiAgZnMud3JpdGVGaWxlU3luYyh0YXJnZXQsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdW1tYXJ5IGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHBsYXRmb3JtTGFiZWwocGxhdGZvcm06IFBsYXRmb3JtKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgIGNhc2UgXCJhbmRyb2lkXCI6IHJldHVybiBcIkFuZHJvaWRcIjtcbiAgICBjYXNlIFwid2luZG93czExXCI6IHJldHVybiBcIldpbmRvd3MgMTEgKFdpblVJIDMgLyAuTkVUIDEwKVwiO1xuICAgIGNhc2UgXCJ3aW5kb3dzMTBcIjogcmV0dXJuIFwiV2luZG93cyAxMCAoV1BGIC8gLk5FVCBGVyA0LjgpXCI7XG4gICAgZGVmYXVsdDogcmV0dXJuIFwiaU9TXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRTdW1tYXJ5KGFnZW50OiBBZ2VudFR5cGUsIHBsYXRmb3JtOiBQbGF0Zm9ybSwgYWN0aW9uczogc3RyaW5nW10sIHdhcm5pbmdzOiBzdHJpbmdbXSwgbWFudWFsU3RlcHM6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IGlzQW5kcm9pZCA9IHBsYXRmb3JtID09PSBcImFuZHJvaWRcIjtcbiAgY29uc3QgaXNXaW5kb3dzID0gcGxhdGZvcm0gPT09IFwid2luZG93czExXCIgfHwgcGxhdGZvcm0gPT09IFwid2luZG93czEwXCI7XG4gIGNvbnNvbGUubG9nKFwiXFxuXCIgKyBjaGFsay5ib2xkKFwiXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXCIpKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgICBQYXRoIFRlcm1pbmFsIFNESyBcdTIwMTQgU2V0dXAgQ29tcGxldGUgKCR7cGxhdGZvcm1MYWJlbChwbGF0Zm9ybSl9KWApKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxcblwiKSk7XG5cbiAgaWYgKGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiXHUyNzEzIERvbmU6XCIpKTtcbiAgICBhY3Rpb25zLmZvckVhY2goKGEpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAgIFx1MjAyMiAke2F9YCkpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgaWYgKG1hbnVhbFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcdTI2QTAgTWFudWFsIHN0ZXBzIHJlcXVpcmVkOlwiKSk7XG4gICAgbWFudWFsU3RlcHMuZm9yRWFjaCgocywgaSkgPT4gY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgICR7aSArIDF9LiAke3N9YCkpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJcdTIxMzkgTm90ZXM6XCIpKTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKCh3KSA9PiBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgXHUyMDIyICR7d31gKSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICAvLyBDYW5vbmljYWwgZmlyc3QtcHJvbXB0IHRleHQgXHUyMDE0IGlkZW50aWNhbCBmb3IgQ2xhdWRlIENvZGUgYW5kIEN1cnNvciBzbyB0aGVcbiAgLy8gYWdlbnQgcmVjZWl2ZXMgdGhlIHNhbWUgZGlyZWN0aXZlIHJlZ2FyZGxlc3Mgb2YgdGhlIGRldmVsb3BlcidzIElERS5cbiAgY29uc3QgbWNwUHJvbXB0ID1cbiAgICBwbGF0Zm9ybSA9PT0gXCJhbmRyb2lkXCIgPyBcImludGVncmF0ZS1wYXRoLWFuZHJvaWRcIiA6XG4gICAgcGxhdGZvcm0gPT09IFwid2luZG93czExXCIgPyBcImludGVncmF0ZS1wYXRoLXdpbmRvd3MxMVwiIDpcbiAgICBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTBcIiA/IFwiaW50ZWdyYXRlLXBhdGgtd2luZG93czEwXCIgOlxuICAgIFwiaW50ZWdyYXRlLXBhdGgtc2FsZVwiO1xuICBjb25zdCBmaXJzdFByb21wdCA9XG4gICAgJyAgXCJJbnRlZ3JhdGUgdGhlIFBhdGggVGVybWluYWwgU0RLIGludG8gdGhpcyBFUE9TIGFwcC4gUmVhZCBDTEFVREUubWRcXG4nICtcbiAgICAnICAgZm9yIHRoZSBpbnRlZ3JhdGlvbiBydWxlcywgdGhlbiB1c2UgdGhlIFBhdGggTUNQICcgKyBtY3BQcm9tcHQgKyAnXFxuJyArXG4gICAgJyAgIHByb21wdCB0byBhZGQgYSBQYXRoIFBPUyBBZGFwdGVyIGluIFNldHRpbmdzIFx1MjAxNCBhIGJhY2tlbmQgc3dpdGNoZXIgZm9yIHRoZVxcbicgK1xuICAgICcgICBQYXRoIFBPUyBFbXVsYXRvciAoV2ktRmkvSVAgb3IgQmx1ZXRvb3RoKSBhbmQgYSByZWFsIFZlcmlmb25lIHRlcm1pbmFsLlwiJztcblxuICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXHVEODNEXHVERTgwIFN0YXJ0IENsYXVkZSBDb2RlIGluIHRoaXMgZGlyZWN0b3J5OlwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgY2xhdWRlIC0tbW9kZWwgc29ubmV0XCIpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCIgIFRoZW4gcGFzdGUgdGhpcyBwcm9tcHQ6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGZpcnN0UHJvbXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlx1RDgzRFx1REU4MCBZb3VyIGZpcnN0IHByb21wdCBpbiBDdXJzb3I6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGZpcnN0UHJvbXB0KSk7XG4gIH1cblxuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgTUNQIHNlcnZlcjogJHtNQ1BfU0VSVkVSX1VSTH1gKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIiAgRG9jczogICAgICAgaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL2hlYWx0aFwiKSk7XG4gIGNvbnNvbGUubG9nKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNYWluIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5wcm9ncmFtXG4gIC5uYW1lKFwicGF0aC10ZXJtaW5hbC1pbml0XCIpXG4gIC5kZXNjcmlwdGlvbihcbiAgICBcIlNldCB1cCB0aGUgUGF0aCBUZXJtaW5hbCBTREsgaW50ZWdyYXRpb24gYXNzaXN0YW50IGZvciB5b3VyIEVQT1MgcHJvamVjdC5cXG5cIiArXG4gICAgICBcIkF1dG8tZGV0ZWN0cyBwbGF0Zm9ybSAoaU9TLCBBbmRyb2lkLCBvciBXaW5kb3dzKSBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cXG5cIiArXG4gICAgICBcIkNvbmZpZ3VyZXMgTUNQIHNlcnZlciBhY2Nlc3MsIGRyb3BzIHRoZSBpbnRlZ3JhdGlvbiByZWNpcGUsIGFuZCBvcHRpb25hbGx5XFxuXCIgK1xuICAgICAgXCJhZGRzIHRoZSBTREsgZGVwZW5kZW5jeS5cXG5cXG5cIiArXG4gICAgICBcIlN1cHBvcnRlZCBhZ2VudHM6IGNsYXVkZSAoZGVmYXVsdCksIGN1cnNvclxcblwiICtcbiAgICAgIFwiU3VwcG9ydGVkIHBsYXRmb3JtczogaW9zIChkZWZhdWx0KSwgYW5kcm9pZCwgd2luZG93czExIChXaW5VSSAzIC8gLk5FVCAxMCksXFxuXCIgK1xuICAgICAgXCJ3aW5kb3dzMTAgKFdQRiAvIC5ORVQgRlcgNC44KS4gVXNlICd3aW5kb3dzJyB0byBhdXRvLXBpY2sgdGhlIFdpbmRvd3MgZmxhdm91ci5cIlxuICApXG4gIC52ZXJzaW9uKFwiMC4yLjBcIilcbiAgLm9wdGlvbihcIi0tdG9vbHMtb25seVwiLCBcIk9ubHkgY29uZmlndXJlIE1DUCArIHJ1bGVzLiBTa2lwIFNESyBpbnN0YWxsYXRpb24uXCIpXG4gIC5vcHRpb24oXCItLWFnZW50IDxuYW1lPlwiLCBcIkFJIGFnZW50IHRvIGNvbmZpZ3VyZTogJ2NsYXVkZScgKGRlZmF1bHQpIG9yICdjdXJzb3InLlwiLCBcImNsYXVkZVwiKVxuICAub3B0aW9uKFwiLS1wbGF0Zm9ybSA8bmFtZT5cIiwgXCJQbGF0Zm9ybTogaW9zIHwgYW5kcm9pZCB8IHdpbmRvd3MgfCB3aW5kb3dzMTEgfCB3aW5kb3dzMTAuIEF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNwZWNpZmllZC5cIilcbiAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHRvb2xzT25seTogYm9vbGVhbiA9IG9wdGlvbnMudG9vbHNPbmx5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGFnZW50OiBBZ2VudFR5cGUgPSAob3B0aW9ucy5hZ2VudCA/PyBcImNsYXVkZVwiKSBhcyBBZ2VudFR5cGU7XG4gICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIEF1dG8tZGV0ZWN0IHBsYXRmb3JtLiBPcmRlcjogQW5kcm9pZCAoR3JhZGxlKSBcdTIxOTIgV2luZG93cyAoLmNzcHJvai8uc2xuKSBcdTIxOTIgaU9TIChkZWZhdWx0KS5cbiAgICBjb25zdCByYXdQbGF0Zm9ybTogc3RyaW5nID0gb3B0aW9ucy5wbGF0Zm9ybSA/PyBcImF1dG9cIjtcbiAgICBjb25zdCBWQUxJRF9QTEFURk9STVMgPSBbXCJpb3NcIiwgXCJhbmRyb2lkXCIsIFwid2luZG93c1wiLCBcIndpbmRvd3MxMVwiLCBcIndpbmRvd3MxMFwiXTtcbiAgICBsZXQgcGxhdGZvcm06IFBsYXRmb3JtO1xuICAgIGlmIChyYXdQbGF0Zm9ybSA9PT0gXCJhdXRvXCIgfHwgIVZBTElEX1BMQVRGT1JNUy5pbmNsdWRlcyhyYXdQbGF0Zm9ybSkpIHtcbiAgICAgIGlmIChmaW5kQW5kcm9pZFByb2plY3QoY3dkKSkgcGxhdGZvcm0gPSBcImFuZHJvaWRcIjtcbiAgICAgIGVsc2UgaWYgKGZpbmRXaW5kb3dzUHJvamVjdChjd2QpKSBwbGF0Zm9ybSA9IGRldGVjdFdpbmRvd3NGbGF2b3VyKGN3ZCk7XG4gICAgICBlbHNlIHBsYXRmb3JtID0gXCJpb3NcIjtcbiAgICB9IGVsc2UgaWYgKHJhd1BsYXRmb3JtID09PSBcIndpbmRvd3NcIikge1xuICAgICAgLy8gRXhwbGljaXQgV2luZG93cywgYnV0IGxldCB0aGUgLmNzcHJvaiBkZWNpZGUgV2luMTEgKFdpblVJIDMpIHZzIFdpbjEwIChXUEYpLlxuICAgICAgcGxhdGZvcm0gPSBkZXRlY3RXaW5kb3dzRmxhdm91cihjd2QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbGF0Zm9ybSA9IHJhd1BsYXRmb3JtIGFzIFBsYXRmb3JtO1xuICAgIH1cbiAgICBjb25zdCBpc0FuZHJvaWQgPSBwbGF0Zm9ybSA9PT0gXCJhbmRyb2lkXCI7XG4gICAgY29uc3QgaXNXaW5kb3dzID0gcGxhdGZvcm0gPT09IFwid2luZG93czExXCIgfHwgcGxhdGZvcm0gPT09IFwid2luZG93czEwXCI7XG5cbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCIgIFBhdGggVGVybWluYWwgU0RLIFx1MjAxNCBJbnRlZ3JhdGlvbiBBc3Npc3RhbnQgU2V0dXBcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIiAgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgQWdlbnQ6ICAgICR7YWdlbnR9YCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBQbGF0Zm9ybTogJHtwbGF0Zm9ybX0ke29wdGlvbnMucGxhdGZvcm0gPyBcIlwiIDogXCIgKGF1dG8tZGV0ZWN0ZWQpXCJ9YCkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBpZiAoYWdlbnQgIT09IFwiY3Vyc29yXCIgJiYgYWdlbnQgIT09IFwiY2xhdWRlXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFx1MjZBMCBBZ2VudCAnJHthZ2VudH0nIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSAnY3Vyc29yJyBvciAnY2xhdWRlJy5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBtYW51YWxTdGVwczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCAxLiBTREsgaW5zdGFsbGF0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGlmICghdG9vbHNPbmx5KSB7XG4gICAgICBpZiAoaXNBbmRyb2lkKSB7XG4gICAgICAgIC8vIFx1MjUwMFx1MjUwMCBBbmRyb2lkOiBKaXRQYWNrICsgR3JhZGxlIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgQW5kcm9pZCBwcm9qZWN0XHUyMDI2XCIpLnN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFmaW5kQW5kcm9pZFByb2plY3QoY3dkKSkge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcIk5vIEFuZHJvaWQgcHJvamVjdCBmb3VuZCAoc2V0dGluZ3MuZ3JhZGxlLmt0cyBvciBhcHAvYnVpbGQuZ3JhZGxlLmt0cyBtaXNzaW5nKS5cIik7XG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgYXNrKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFwiICBDb250aW51ZSB3aXRoIHRvb2xzLW9ubHkgc2V0dXA/ICh5L24pOiBcIilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlxcbiAgUnVuIHRoaXMgZnJvbSB5b3VyIEFuZHJvaWQgcHJvamVjdCByb290IGRpcmVjdG9yeS5cXG5cIikpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKFwiUmFuIGluIHRvb2xzLW9ubHkgbW9kZSBcdTIwMTQgbm8gQW5kcm9pZCBwcm9qZWN0IGZvdW5kLlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBbmRyb2lkU0RLRGVwZW5kZW5jeShjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aCBUZXJtaW5hbCBTREsgYWxyZWFkeSBwcmVzZW50IGluIHNldHRpbmdzLmdyYWRsZS5rdHMuXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIlNESyBkZXBlbmRlbmN5IGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci50ZXh0ID0gXCJBZGRpbmcgdGhlIFBhdGggTWF2ZW4gcmVwb3NpdG9yeSB0byBzZXR0aW5ncy5ncmFkbGUua3RzXHUyMDI2XCI7XG4gICAgICAgICAgY29uc3Qgc2V0dGluZ3NPayA9IGluamVjdFBhdGhNYXZlblJlcG8oY3dkKTtcbiAgICAgICAgICBjb25zdCBkZXBzT2sgPSBpbmplY3RHcmFkbGVEZXBlbmRlbmNpZXMoY3dkKTtcblxuICAgICAgICAgIGlmIChzZXR0aW5nc09rKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoIE1hdmVuIHJlcG9zaXRvcnkgYWRkZWQgdG8gc2V0dGluZ3MuZ3JhZGxlLmt0cy5cIik7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goYFBhdGggTWF2ZW4gcmVwbyBhZGRlZCB0byBzZXR0aW5ncy5ncmFkbGUua3RzICgke1BBVEhfTUFWRU5fVVJMfSlgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCB0aGUgUGF0aCBNYXZlbiByZXBvIHRvIHNldHRpbmdzLmdyYWRsZS5rdHMgKGRlcGVuZGVuY3lSZXNvbHV0aW9uTWFuYWdlbWVudCB7IHJlcG9zaXRvcmllcyB7IFx1MjAyNiB9IH0pOlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICBtYXZlbiB7IHVybCA9IHVyaShcIiR7UEFUSF9NQVZFTl9VUkx9XCIpIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVwc09rKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJTREsgZGVwZW5kZW5jaWVzIGFkZGVkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzIChpbmNsLiBWZXJpZm9uZSkuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGBTREsgZGVwcyBhZGRlZCB0byBhcHAvYnVpbGQuZ3JhZGxlLmt0czogJHtBTkRST0lEX1NES19NT0RVTEVTLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Bpbm5lci53YXJuKFwiQ291bGQgbm90IGF1dG8taW5qZWN0IGRlcGVuZGVuY2llcyBpbnRvIGFwcC9idWlsZC5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgdG8gYXBwL2J1aWxkLmdyYWRsZS5rdHMgZGVwZW5kZW5jaWVzIHt9OlxcbmAgK1xuICAgICAgICAgICAgICBBTkRST0lEX1NES19NT0RVTEVTLm1hcCgobSkgPT4gYCAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0dST1VQfToke219OiR7QU5EUk9JRF9TREtfVkVSU0lPTn1cIilgKS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIFdpbmRvd3M6IFBhY2thZ2VSZWZlcmVuY2UgZnJvbSB0aGUgUGF0aCBOdUdldCBmZWVkIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgV2luZG93cyAoLk5FVCkgcHJvamVjdFx1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBpZiAoIWZpbmRXaW5kb3dzUHJvamVjdChjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gV2luZG93cyBwcm9qZWN0IGZvdW5kICguc2xuIG9yIC5jc3Byb2opLlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soY2hhbGsueWVsbG93KFwiICBDb250aW51ZSB3aXRoIHRvb2xzLW9ubHkgc2V0dXA/ICh5L24pOiBcIikpO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlxcbiAgUnVuIHRoaXMgZnJvbSB5b3VyIFdpbmRvd3MgRVBPUyBwcm9qZWN0IHJvb3QuXFxuXCIpKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIFdpbmRvd3MgcHJvamVjdCBmb3VuZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzV2luZG93c1NES0RlcGVuZGVuY3koY3dkKSkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGggVGVybWluYWwgU0RLIGFscmVhZHkgcmVmZXJlbmNlZCBpbiB0aGUgcHJvamVjdC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiU0RLIHJlZmVyZW5jZSBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIudGV4dCA9IFwiQWRkaW5nIHRoZSBQYXRoIE51R2V0IGZlZWQgKyBTREsgcGFja2FnZXNcdTIwMjZcIjtcbiAgICAgICAgICBjb25zdCBmZWVkT2sgPSBpbmplY3RQYXRoTnVnZXRDb25maWcoY3dkKTtcbiAgICAgICAgICBjb25zdCBjc3Byb2ogPSBpbmplY3RXaW5kb3dzUGFja2FnZVJlZmVyZW5jZXMoY3dkKTtcblxuICAgICAgICAgIGlmIChmZWVkT2spIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChgUGF0aCBOdUdldCBmZWVkIGFkZGVkIHRvIG51Z2V0LmNvbmZpZyAoJHtQQVRIX05VR0VUX1VSTH0pYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgdGhlIFBhdGggTnVHZXQgZmVlZCB0byBhIG51Z2V0LmNvbmZpZyBiZXNpZGUgeW91ciBzb2x1dGlvbjpcXG5gICtcbiAgICAgICAgICAgICAgYCAgICAgPGFkZCBrZXk9XCJwYXRoXCIgdmFsdWU9XCIke1BBVEhfTlVHRVRfVVJMfVwiIC8+YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNzcHJvaikge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICBgU0RLIHBhY2thZ2VzIGFkZGVkIHRvICR7cGF0aC5iYXNlbmFtZShjc3Byb2opfSAoeDY0KTogJHtXSU5ET1dTX1NES19QQUNLQUdFUy5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCB0aGUgUGF0aCBTREsgUGFja2FnZVJlZmVyZW5jZXMgdG8geW91ciAuY3Nwcm9qICh2ZXJzaW9ucyAke1dJTkRPV1NfU0RLX1ZFUlNJT059KTpcXG5gICtcbiAgICAgICAgICAgICAgV0lORE9XU19TREtfUEFDS0FHRVMubWFwKChwKSA9PiBgICAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPVwiJHtwfVwiIFZlcnNpb249XCIke1dJTkRPV1NfU0RLX1ZFUlNJT059XCIgLz5gKS5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgICAgICAgYFxcbiAgICAgXHUyMDI2YW5kIHNldCA8UGxhdGZvcm1UYXJnZXQ+eDY0PC9QbGF0Zm9ybVRhcmdldD4gKHRoZSBWZXJpZm9uZSBiaW5kaW5nIGlzIHg2NCBtaXhlZC1tb2RlKS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmVlZE9rICYmIGNzcHJvaikge1xuICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aCBOdUdldCBmZWVkICsgU0RLIHBhY2thZ2VzIGFkZGVkIChpbmNsLiBWZXJpZm9uZSkuXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcGlubmVyLndhcm4oXCJQYXRoIFNESyBwYXJ0bHkgd2lyZWQgXHUyMDE0IHNlZSB0aGUgbWFudWFsIHN0ZXBzIGJlbG93LlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFx1MjUwMFx1MjUwMCBpT1M6IFNQTSAvIFhjb2RlIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgZm9yIFhjb2RlIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgICBjb25zdCB4Y29kZVByb2plY3QgPSBmaW5kWGNvZGVQcm9qZWN0KGN3ZCk7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VTd2lmdCA9IGZpbmRQYWNrYWdlU3dpZnQoY3dkKTtcblxuICAgICAgICBpZiAocGFja2FnZVN3aWZ0KSB7XG4gICAgICAgICAgc3Bpbm5lci50ZXh0ID0gXCJGb3VuZCBQYWNrYWdlLnN3aWZ0IFx1MjAxNCBhZGRpbmcgUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3lcdTIwMjZcIjtcbiAgICAgICAgICBpZiAoaGFzU0RLRGVwZW5kZW5jeShwYWNrYWdlU3dpZnQpKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWxyZWFkeSBwcmVzZW50IGluIFBhY2thZ2Uuc3dpZnQuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdCk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFBhY2thZ2Uuc3dpZnQuXCIpO1xuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goXCJQYXRoVGVybWluYWxTREsgYWRkZWQgdG8gUGFja2FnZS5zd2lmdFwiKTtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgT3BlbiBYY29kZSBhbmQgbGluayBhbGwgZm91ciB0YXJnZXRzIHRvIHlvdXIgYXBwOiBQYXRoVGVybWluYWxTREssIFBhdGhFbXVsYXRvckFkYXB0ZXIsIFBhdGhDb3JlTW9kZWxzLCBQYXRoVmVyaWZvbmVQU0RLQWRhcHRlci5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3QgYXV0b21hdGljYWxseSBtb2RpZnkgUGFja2FnZS5zd2lmdCBcdTIwMTQgbWFudWFsIHN0ZXAgcmVxdWlyZWQuXCIpO1xuICAgICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICAgIGBBZGQgUGF0aFRlcm1pbmFsU0RLIG1hbnVhbGx5IHRvIFBhY2thZ2Uuc3dpZnQ6XFxuYCArXG4gICAgICAgICAgICAgICAgICBgICAgICAucGFja2FnZSh1cmw6IFwiJHtTREtfR0lUSFVCX1VSTH1cIiwgZnJvbTogXCIke1NES19WRVJTSU9OfVwiKWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGNvZGVQcm9qZWN0KSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGBGb3VuZCBYY29kZSBwcm9qZWN0OiAke3BhdGguYmFzZW5hbWUoeGNvZGVQcm9qZWN0KX1gKTtcbiAgICAgICAgICBpZiAoaGFzWGNvZGVQcm9qZWN0U0RLRGVwZW5kZW5jeSh4Y29kZVByb2plY3QpKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWxyZWFkeSBwcmVzZW50IGluIFhjb2RlIHByb2plY3QuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBcIlxcbiAgXHUyNkEwIEF1dG9tYXRpYyBTUE0gaW5qZWN0aW9uIGludG8gLnhjb2RlcHJvaiBpcyBub3Qgc3VwcG9ydGVkIChYY29kZSBtYW5hZ2VzIHRoaXMpLlwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXFxuICBUbyBhZGQgUGF0aFRlcm1pbmFsU0RLIGluIFhjb2RlOlwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgMS4gT3BlbiB5b3VyIHByb2plY3QgaW4gWGNvZGVcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgMi4gRmlsZSBcdTIxOTIgQWRkIFBhY2thZ2UgRGVwZW5kZW5jaWVzXHUyMDI2XCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgMy4gRW50ZXIgVVJMOiAke2NoYWxrLmN5YW4oU0RLX0dJVEhVQl9VUkwpfWApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIFwiICA0LiBJbiB0aGUgJ0Nob29zZSBQYWNrYWdlIFByb2R1Y3RzJyBkaWFsb2csIHNldCBhbGwgZm91ciB0byB5b3VyIGFwcCB0YXJnZXQ6XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhUZXJtaW5hbFNESyAgICAgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhFbXVsYXRvckFkYXB0ZXIgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhDb3JlTW9kZWxzICAgICAgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhWZXJpZm9uZVBTREtBZGFwdGVyIFx1MjE5MiB5b3VyIGFwcCB0YXJnZXRcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICAgICAoUGF0aFZlcmlmb25lUFNES0FkYXB0ZXIgaXMgcmVxdWlyZWQgZm9yIHRoZSBWZXJpZm9uZSBiYWNrZW5kOyBQYXRoRGlhZ25vc3RpY3MgY2FuIGJlIGxlZnQgYXMgTm9uZSlcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgIDUuIENsaWNrIEFkZCBQYWNrYWdlXFxuXCIpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgYXNrKFxuICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiICBQcmVzcyBFbnRlciBvbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSBwYWNrYWdlLCBvciB0eXBlICdza2lwJyB0byBkbyB0aGlzIGxhdGVyOiBcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29uZmlybWVkLnRvTG93ZXJDYXNlKCkgIT09IFwic2tpcFwiKSB7XG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaChgUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFhjb2RlIHByb2plY3QgKGNvbmZpcm1lZCBieSB1c2VyKWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgQWRkIFBhdGhUZXJtaW5hbFNESyB2aWEgWGNvZGU6IEZpbGUgXHUyMTkyIEFkZCBQYWNrYWdlIERlcGVuZGVuY2llcyBcdTIxOTIgJHtTREtfR0lUSFVCX1VSTH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcIk5vIFhjb2RlIHByb2plY3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnkuXCIpO1xuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFzayhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgXCIgIE5vIC54Y29kZXByb2ogb3IgUGFja2FnZS5zd2lmdCBmb3VuZC4gQ29udGludWUgd2l0aCB0b29scy1vbmx5IHNldHVwPyAoeS9uKTogXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5kaW0oXCJcXG4gIFJ1biB0aGlzIGNvbW1hbmQgZnJvbSB5b3VyIFhjb2RlIHByb2plY3QgZGlyZWN0b3J5LCBvciB1c2UgLS10b29scy1vbmx5LlxcblwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIFhjb2RlIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbnMucHVzaChcIlNraXBwZWQgU0RLIGluc3RhbGxhdGlvbiAoLS10b29scy1vbmx5IG1vZGUpXCIpO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCAyLiBNQ1AgY29uZmlnIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJXcml0aW5nIE1DUCBzZXJ2ZXIgY29uZmlnXHUyMDI2XCIpLnN0YXJ0KCk7XG5cbiAgICAgIGxldCByZXN1bHQ6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuIH07XG4gICAgICBsZXQgY29uZmlnRmlsZTogc3RyaW5nO1xuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgcmVzdWx0ID0gd3JpdGVDbGF1ZGVNY3BDb25maWcoY3dkKTtcbiAgICAgICAgY29uZmlnRmlsZSA9IFwiLm1jcC5qc29uXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUN1cnNvck1jcENvbmZpZyhjd2QpO1xuICAgICAgICBjb25maWdGaWxlID0gXCIuY3Vyc29yL21jcC5qc29uXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQud3JpdHRlbiAmJiByZXN1bHQubWVyZ2VkKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgTUNQIGNvbmZpZyBtZXJnZWQgaW50byBleGlzdGluZyAke2NvbmZpZ0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYHBhdGgtdGVybWluYWwgZW50cnkgbWVyZ2VkIGludG8gJHtjb25maWdGaWxlfWApO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQud3JpdHRlbikge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYE1DUCBjb25maWcgd3JpdHRlbiB0byAke2NvbmZpZ0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYE1DUCBzZXJ2ZXIgY29uZmlndXJlZDogJHtjb25maWdGaWxlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci5pbmZvKFwiTUNQIGNvbmZpZyBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICBhY3Rpb25zLnB1c2goXCJNQ1AgY29uZmlnIGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBDbGF1ZGUgQ29kZSwgYWxzbyBwcmUtYXBwcm92ZSB0aGUgTUNQIHNlcnZlciBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb24uXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIENsYXVkZSBDb2RlIHNob3dzIGFuIGludGVyYWN0aXZlIFwiQWxsb3cgdGhpcyBNQ1Agc2VydmVyP1wiXG4gICAgICAvLyBwcm9tcHQgb24gZmlyc3QgbGF1bmNoIFx1MjAxNCBlYXN5IHRvIG1pc3MsIGFuZCB0aGUgYWdlbnQgZW5kcyB1cCBydW5uaW5nXG4gICAgICAvLyB3aXRob3V0IE1DUCB0b29scyBpZiB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgY29uc3QgYXBwcm92ZVNwaW5uZXIgPSBvcmEoXCJQcmUtYXBwcm92aW5nIFBhdGggTUNQIHNlcnZlciBmb3IgQ2xhdWRlIENvZGVcdTIwMjZcIikuc3RhcnQoKTtcbiAgICAgICAgY29uc3QgYXBwcm92ZSA9IHdyaXRlQ2xhdWRlU2V0dGluZ3MoY3dkKTtcbiAgICAgICAgaWYgKGFwcHJvdmUuYWxyZWFkeUFwcHJvdmVkKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuaW5mbyhcIlBhdGggTUNQIHNlcnZlciBhbHJlYWR5IHByZS1hcHByb3ZlZCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS53cml0dGVuICYmIGFwcHJvdmUubWVyZ2VkKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuc3VjY2VlZChcInBhdGgtdGVybWluYWwgYWRkZWQgdG8gZXhpc3RpbmcgLmNsYXVkZS9zZXR0aW5ncy5qc29uLlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJwYXRoLXRlcm1pbmFsIHByZS1hcHByb3ZlZCBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb25cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS53cml0dGVuKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuc3VjY2VlZChcIlByZS1hcHByb3ZhbCB3cml0dGVuIHRvIC5jbGF1ZGUvc2V0dGluZ3MuanNvbi5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQ2xhdWRlIENvZGUgcHJlLWFwcHJvdmFsOiAuY2xhdWRlL3NldHRpbmdzLmpzb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIud2FybihcIkNvdWxkIG5vdCB3cml0ZSAuY2xhdWRlL3NldHRpbmdzLmpzb24gXHUyMDE0IHlvdSBtYXkgc2VlIGFuIFxcXCJBbGxvdyBNQ1Agc2VydmVyP1xcXCIgcHJvbXB0IG9uIGZpcnN0IENsYXVkZSBDb2RlIGxhdW5jaC4gQWNjZXB0IGl0LlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCAzLiBSdWxlcyBmaWxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoYFdyaXRpbmcgJHthZ2VudCA9PT0gXCJjbGF1ZGVcIiA/IFwiQ0xBVURFLm1kXCIgOiBcIkN1cnNvciBydWxlc1wifSBmaWxlXHUyMDI2YCkuc3RhcnQoKTtcblxuICAgICAgbGV0IHJlc3VsdDogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH07XG4gICAgICBsZXQgcnVsZXNGaWxlOiBzdHJpbmc7XG5cbiAgICAgIC8vIFBlci1wbGF0Zm9ybSByZWNpcGUgc291cmNlICsgZmV0Y2ggVVJMICsgZmlsZW5hbWUuXG4gICAgICBjb25zdCBydWxlc0J5UGxhdGZvcm0gPSB7XG4gICAgICAgIGlvczogICAgICAgeyBzcmM6IFJVTEVTX1NPVVJDRSwgICAgICAgICAgdXJsOiBSVUxFU19GRVRDSF9VUkwsICAgICAgICAgIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi5tZGNcIiB9LFxuICAgICAgICBhbmRyb2lkOiAgIHsgc3JjOiBBTkRST0lEX1JVTEVTX1NPVVJDRSwgICB1cmw6IEFORFJPSURfUlVMRVNfRkVUQ0hfVVJMLCAgIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi1hbmRyb2lkLm1kY1wiIH0sXG4gICAgICAgIHdpbmRvd3MxMTogeyBzcmM6IFdJTkRPV1MxMV9SVUxFU19TT1VSQ0UsIHVybDogV0lORE9XUzExX1JVTEVTX0ZFVENIX1VSTCwgZmlsZTogXCJwYXRoLWludGVncmF0aW9uLXdpbmRvd3MxMS5tZGNcIiB9LFxuICAgICAgICB3aW5kb3dzMTA6IHsgc3JjOiBXSU5ET1dTMTBfUlVMRVNfU09VUkNFLCB1cmw6IFdJTkRPV1MxMF9SVUxFU19GRVRDSF9VUkwsIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTAubWRjXCIgfSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBjb25zdCBhY3RpdmVSdWxlcyA9IHJ1bGVzQnlQbGF0Zm9ybVtwbGF0Zm9ybV07XG4gICAgICBjb25zdCBhY3RpdmVGZXRjaFVybCA9IGFjdGl2ZVJ1bGVzLnVybDtcblxuICAgICAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHdyaXRlQ2xhdWRlUnVsZXNGaWxlKGN3ZCwgYWN0aXZlUnVsZXMuc3JjLCBhY3RpdmVGZXRjaFVybCk7XG4gICAgICAgIHJ1bGVzRmlsZSA9IFwiQ0xBVURFLm1kXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUN1cnNvclJ1bGVzRmlsZShjd2QsIGFjdGl2ZVJ1bGVzLnNyYywgYWN0aXZlUnVsZXMuZmlsZSwgYWN0aXZlRmV0Y2hVcmwpO1xuICAgICAgICBydWxlc0ZpbGUgPSBgLmN1cnNvci9ydWxlcy8ke2FjdGl2ZVJ1bGVzLmZpbGV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC53cml0dGVuKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgUnVsZXMgZmlsZSB3cml0dGVuIHRvICR7cnVsZXNGaWxlfS5gKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKGBJbnRlZ3JhdGlvbiBydWxlcyBmaWxlOiAke3J1bGVzRmlsZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgc3Bpbm5lci5pbmZvKFxuICAgICAgICAgIGAke3J1bGVzRmlsZX0gYWxyZWFkeSBleGlzdHMgXHUyMDE0IHNraXBwZWQgdG8gcHJlc2VydmUgeW91ciBjdXN0b21pc2F0aW9ucy5gXG4gICAgICAgICk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgICAgYCR7cnVsZXNGaWxlfSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgbm90IG92ZXJ3cml0dGVuLmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwaW5uZXIud2FybihcIkNvdWxkIG5vdCB3cml0ZSBydWxlcyBmaWxlIFx1MjAxNCBjaGVjayBuZXR3b3JrIGNvbm5lY3Rpdml0eS5cIik7XG4gICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgYERvd25sb2FkICR7YWN0aXZlUnVsZXMuZmlsZX0gbWFudWFsbHkgZnJvbTogJHthY3RpdmVGZXRjaFVybH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDQuIFBlcm1pc3Npb24gY2hlY2sgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKCF0b29sc09ubHkpIHtcbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIEFuZHJvaWRNYW5pZmVzdC54bWwgQkxFIHBlcm1pc3Npb25zXHUyMDI2XCIpLnN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0c1dpdGhJc3N1ZXMgPSBjaGVja0FuZHJvaWRNYW5pZmVzdChjd2QpO1xuICAgICAgICBpZiAobWFuaWZlc3RzV2l0aElzc3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJCTEUgcGVybWlzc2lvbnMgZm91bmQgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQkxFIHBlcm1pc3Npb25zIHZlcmlmaWVkIGluIEFuZHJvaWRNYW5pZmVzdC54bWxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFxuICAgICAgICAgICAgYEJMVUVUT09USF9TQ0FOIG1pc3NpbmcgZnJvbSAke21hbmlmZXN0c1dpdGhJc3N1ZXMubGVuZ3RofSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUocykuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFuaWZlc3RzV2l0aElzc3Vlcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUoY3dkLCBwKTtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgQkxFIHBlcm1pc3Npb25zIHRvICR7cmVsYXRpdmV9OlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICAoQXNrIHRoZSBNQ1A6IFwiZ2V0X21hbmlmZXN0X3JlcXVpcmVtZW50c1wiIGZvciB0aGUgZnVsbCBYTUwpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgLy8gV2luZG93cyByZWFjaGVzIEJMRSB2aWEgV2luUlQgXHUyMDE0IG5vIG1hbmlmZXN0IGNhcGFiaWxpdHkgdG8gYWRkICh1bnBhY2thZ2VkXG4gICAgICAgIC8vIFdpblVJIDMgLyBXUEYpLiBUaGUgV2ktRmkvSVAgYW5kIFZlcmlmb25lIGJhY2tlbmRzIHVzZSBubyBCbHVldG9vdGggYXQgYWxsLlxuICAgICAgICBhY3Rpb25zLnB1c2goXCJCbHVldG9vdGggbmVlZHMgbm8gbWFuaWZlc3QgZW50cnkgb24gV2luZG93cyAoV2luUlQpLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBJbmZvLnBsaXN0IEJMRSBwZXJtaXNzaW9uc1x1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBjb25zdCBwbGlzdHNXaXRoSXNzdWVzID0gY2hlY2tJbmZvUGxpc3QoY3dkKTtcbiAgICAgICAgaWYgKHBsaXN0c1dpdGhJc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiQkxFIHBlcm1pc3Npb25zIGZvdW5kIGluIEluZm8ucGxpc3QuXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIkJMRSBwZXJtaXNzaW9ucyB2ZXJpZmllZCBpbiBJbmZvLnBsaXN0XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcbiAgICAgICAgICAgIGBOU0JsdWV0b290aEFsd2F5c1VzYWdlRGVzY3JpcHRpb24gbWlzc2luZyBmcm9tICR7cGxpc3RzV2l0aElzc3Vlcy5sZW5ndGh9IEluZm8ucGxpc3QgZmlsZShzKS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwbGlzdHNXaXRoSXNzdWVzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShjd2QsIHApO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCBCTEUgcGVybWlzc2lvbiB0byAke3JlbGF0aXZlfTpcXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICA8a2V5Pk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvbjwva2V5PlxcbmAgK1xuICAgICAgICAgICAgICAgIGAgICAgIDxzdHJpbmc+VGhpcyBhcHAgY29ubmVjdHMgdG8gYSBQYXRoIHBheW1lbnQgdGVybWluYWwgdmlhIEJsdWV0b290aC48L3N0cmluZz5cXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICAoQXNrIHRoZSBNQ1A6IFwiZ2V0X2luZm9fcGxpc3RfcmVxdWlyZW1lbnRzXCIgZm9yIHRoZSBmdWxsIFhNTClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDUuIFN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgcHJpbnRTdW1tYXJ5KGFnZW50LCBwbGF0Zm9ybSwgYWN0aW9ucywgd2FybmluZ3MsIG1hbnVhbFN0ZXBzKTtcbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVCQUF3QjtBQUN4QixtQkFBa0I7QUFDbEIsU0FBb0I7QUFDcEIsV0FBc0I7QUFDdEIsZUFBMEI7QUFDMUIsMkJBQXlCO0FBQ3pCLGlCQUFnQjtBQUloQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLGNBQWM7QUFHcEIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxvQkFBb0I7QUFDMUIsTUFB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SUFDRixPQUFPO0FBQ0wsY0FBUSxLQUFLLCtEQUEwRDtBQUN2RSxrQkFBWTtBQUFBLFFBQ1YsWUFBWSxZQUFZLElBQUksbUJBQW1CLGNBQWM7QUFBQSxNQUMvRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBR0EsTUFBSSxDQUFDLFdBQVc7QUFDZCxRQUFJLFdBQVc7QUFDYixZQUFNLGNBQVUsV0FBQUEsU0FBSSxvREFBK0MsRUFBRSxNQUFNO0FBQzNFLFlBQU0sc0JBQXNCLHFCQUFxQixHQUFHO0FBQ3BELFVBQUksb0JBQW9CLFdBQVcsR0FBRztBQUNwQyxnQkFBUSxRQUFRLCtDQUErQztBQUMvRCxnQkFBUSxLQUFLLGlEQUFpRDtBQUFBLE1BQ2hFLE9BQU87QUFDTCxnQkFBUTtBQUFBLFVBQ04sK0JBQStCLG9CQUFvQixNQUFNO0FBQUEsUUFDM0Q7QUFDQSw0QkFBb0IsUUFBUSxDQUFDLE1BQU07QUFDakMsZ0JBQU0sV0FBVyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQ3JDLHNCQUFZO0FBQUEsWUFDViwwQkFBMEIsUUFBUTtBQUFBO0FBQUEsVUFFcEM7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRixXQUFXLFdBQVc7QUFHcEIsY0FBUSxLQUFLLHVEQUF1RDtBQUFBLElBQ3RFLE9BQU87QUFDTCxZQUFNLGNBQVUsV0FBQUEsU0FBSSwyQ0FBc0MsRUFBRSxNQUFNO0FBQ2xFLFlBQU0sbUJBQW1CLGVBQWUsR0FBRztBQUMzQyxVQUFJLGlCQUFpQixXQUFXLEdBQUc7QUFDakMsZ0JBQVEsUUFBUSxzQ0FBc0M7QUFDdEQsZ0JBQVEsS0FBSyx3Q0FBd0M7QUFBQSxNQUN2RCxPQUFPO0FBQ0wsZ0JBQVE7QUFBQSxVQUNOLGtEQUFrRCxpQkFBaUIsTUFBTTtBQUFBLFFBQzNFO0FBQ0EseUJBQWlCLFFBQVEsQ0FBQyxNQUFNO0FBQzlCLGdCQUFNLFdBQVcsS0FBSyxTQUFTLEtBQUssQ0FBQztBQUNyQyxzQkFBWTtBQUFBLFlBQ1YseUJBQXlCLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUluQztBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUdBLGVBQWEsT0FBTyxVQUFVLFNBQVMsVUFBVSxXQUFXO0FBQzlELENBQUM7QUFFSCx5QkFBUSxNQUFNLFFBQVEsSUFBSTsiLAogICJuYW1lcyI6IFsicnVsZXMiLCAiY2hhbGsiLCAib3JhIl0KfQo=
866
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwicmVhZGxpbmVcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBvcmEgZnJvbSBcIm9yYVwiO1xuXG4vLyBpT1MgaW5zdGFsbHMgdGhlIENPTVBJTEVEIFNESyBmcm9tIHRoZSBwdWJsaWMgcmVsZWFzZSByZXBvIChYQ0ZyYW1ld29ya3MgaG9zdGVkIG9uIHRoZVxuLy8gUGF0aCBib3g7IG1hbmlmZXN0ICsgY2hlY2tzdW1zIG9ubHkpLiBUaGUgc291cmNlIHJlcG8gaXMgcHJpdmF0ZSBcdTIwMTQgbmV2ZXIgcG9pbnQgaGVyZSBhdCBpdC5cbmNvbnN0IFNES19HSVRIVUJfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20va2V5bWFuMTIvUGF0aC10ZXJtaW5hbC1zZGstSU9TLVJlbGVhc2VcIjtcbmNvbnN0IEFORFJPSURfU0RLX0dJVEhVQl9VUkwgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9rZXltYW4xMi9wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkXCI7XG5jb25zdCBTREtfVkVSU0lPTiA9IFwiMS41LjBcIjsgLy8gbWluaW11bSB2ZXJzaW9uIHRvIHJlZmVyZW5jZVxuLy8gQW5kcm9pZCBTREsgaXMgc2VydmVkIGZyb20gdGhlIFBhdGgtaG9zdGVkIE1hdmVuIHJlcG8gKG9uZSBVUkwsIGluY2wuIHRoZSBWZXJpZm9uZVxuLy8gYmFja2VuZCArIGl0cyAuYWFyKS4gTm8gSml0UGFjaywgbm8gc2libGluZyBjaGVja291dCBcdTIwMTQgbWlycm9ycyB0aGUgaU9TIFNQTS1VUkwgbW9kZWwuXG5jb25zdCBQQVRIX01BVkVOX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL21hdmVuXCI7XG5jb25zdCBBTkRST0lEX1NES19HUk9VUCA9IFwidGVjaC5wYXRoMmFpLnNka1wiO1xuY29uc3QgQU5EUk9JRF9TREtfVkVSU0lPTiA9IFwiMS44LjBcIjtcbmNvbnN0IEFORFJPSURfU0RLX01PRFVMRVMgPSBbXCJwYXRoLWNvcmUtbW9kZWxzXCIsIFwicGF0aC10ZXJtaW5hbC1zZGtcIiwgXCJwYXRoLWVtdWxhdG9yLWFkYXB0ZXJcIiwgXCJwYXRoLXBzZGstYWRhcHRlclwiXTtcbmNvbnN0IE1DUF9TRVJWRVJfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvc3NlXCI7XG5jb25zdCBSVUxFU19GRVRDSF9VUkwgPSBcImh0dHBzOi8vbWNwLnBhdGgyYWkudGVjaC9ydWxlc1wiO1xuY29uc3QgQU5EUk9JRF9SVUxFU19GRVRDSF9VUkwgPSBcImh0dHBzOi8vbWNwLnBhdGgyYWkudGVjaC9ydWxlcy9hbmRyb2lkXCI7XG5jb25zdCBXSU5ET1dTMTFfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvd2luZG93czExXCI7XG5jb25zdCBXSU5ET1dTMTBfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvd2luZG93czEwXCI7XG5cbmNvbnN0IFJVTEVTX1NPVVJDRSA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vcnVsZXMvaW9zL3BhdGgtaW50ZWdyYXRpb24ubWRjXCIpO1xuY29uc3QgQU5EUk9JRF9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL2FuZHJvaWQvcGF0aC1pbnRlZ3JhdGlvbi1hbmRyb2lkLm1kY1wiKTtcbmNvbnN0IFdJTkRPV1MxMV9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL3dpbmRvd3MtMTEvcGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTEubWRjXCIpO1xuY29uc3QgV0lORE9XUzEwX1JVTEVTX1NPVVJDRSA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vcnVsZXMvd2luZG93cy0xMC9wYXRoLWludGVncmF0aW9uLXdpbmRvd3MxMC5tZGNcIik7XG5cbi8vIFRoZSBXaW5kb3dzIFNESyBpcyBzZXJ2ZWQgZnJvbSB0aGUgUGF0aC1ob3N0ZWQgTnVHZXQgZmVlZCAob25lIGZlZWQgVVJMLCBpbmNsLiB0aGVcbi8vIFZlcmlmb25lIGJhY2tlbmQgKyBpdHMgYnVuZGxlZCBiaW5kaW5nKS4gTm8gc2libGluZyBjaGVja291dCBcdTIwMTQgbWlycm9ycyB0aGUgQW5kcm9pZFxuLy8gTWF2ZW4tVVJMIC8gaU9TIFNQTS1VUkwgbW9kZWwuIE9uZSBwYWNrYWdlIHNldCBzZXJ2ZXMgYm90aCB0aGUgV2luVUkgMyAvIC5ORVQgMTAgYW5kXG4vLyBXUEYgLyAuTkVUIEZXIDQuOCBzdGFja3MgKE51R2V0IHBpY2tzIHRoZSByaWdodCBmbGF2b3VyIHBlciB0YXJnZXQgZnJhbWV3b3JrKS5cbmNvbnN0IFBBVEhfTlVHRVRfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvbnVnZXQvaW5kZXguanNvblwiO1xuY29uc3QgV0lORE9XU19TREtfVkVSU0lPTiA9IFwiMS41LjBcIjtcbi8vIENvcmVNb2RlbHMgYXJyaXZlcyB0cmFuc2l0aXZlbHkgdmlhIFBhdGguVGVybWluYWwuU2RrOyBQc2RrQWRhcHRlciBjYXJyaWVzIFZlcmlmb25lICh4NjQpLlxuY29uc3QgV0lORE9XU19TREtfUEFDS0FHRVMgPSBbXG4gIFwiUGF0aC5UZXJtaW5hbC5TZGtcIixcbiAgXCJQYXRoLlRlcm1pbmFsLkVtdWxhdG9yQWRhcHRlclwiLFxuICBcIlBhdGguVGVybWluYWwuTW9ja0FkYXB0ZXJcIixcbiAgXCJQYXRoLlRlcm1pbmFsLkRpYWdub3N0aWNzXCIsXG4gIFwiUGF0aC5UZXJtaW5hbC5Qc2RrQWRhcHRlclwiLFxuXTtcbi8vIFRoZSBTREsgcmVwbyBuYW1lIFx1MjAxNCBrZXB0IG9ubHkgZm9yIHRoZSBub3RlIHRoYXQgdGhlIGluLXJlcG8gZGVtb3MgYnVpbGQgZnJvbSBzb3VyY2UuXG5jb25zdCBXSU5ET1dTX1NES19SRVBPID0gXCJQYXRoLXRlcm1pbmFsLXNkay13aW5kb3dzMTFcIjtcblxudHlwZSBBZ2VudFR5cGUgPSBcImN1cnNvclwiIHwgXCJjbGF1ZGVcIjtcbnR5cGUgUGxhdGZvcm0gPSBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFV0aWxpdGllcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXNrKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluLCBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0IH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihxdWVzdGlvbiwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaW5kWGNvZGVQcm9qZWN0KGRpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGlzWGNvZGVBcnRpZmFjdCA9IChlOiBzdHJpbmcpID0+XG4gICAgZS5lbmRzV2l0aChcIi54Y29kZXByb2pcIikgfHwgZS5lbmRzV2l0aChcIi54Y3dvcmtzcGFjZVwiKTtcblxuICAvLyBDaGVjayB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3RcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7XG4gIGNvbnN0IHByb2ogPSBlbnRyaWVzLmZpbmQoaXNYY29kZUFydGlmYWN0KTtcbiAgaWYgKHByb2opIHJldHVybiBwYXRoLmpvaW4oZGlyLCBwcm9qKTtcblxuICAvLyBTZWFyY2ggb25lIGxldmVsIGRlZXAgaW4gc3ViZGlyZWN0b3JpZXMgKGhhbmRsZXMgcmVwb3Mgd2hlcmUgdGhlXG4gIC8vIFhjb2RlIHByb2plY3Qgc2l0cyBpbnNpZGUgYSBuYW1lZCBzdWJmb2xkZXIsIGUuZy4gT3JkZXJjaGFtcGlvbkVQT1MvKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN1YiA9IHBhdGguam9pbihkaXIsIGVudHJ5KTtcbiAgICB0cnkge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHN1YikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb25zdCBzdWJFbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc3ViKTtcbiAgICAgICAgY29uc3Qgc3ViUHJvaiA9IHN1YkVudHJpZXMuZmluZChpc1hjb2RlQXJ0aWZhY3QpO1xuICAgICAgICBpZiAoc3ViUHJvaikgcmV0dXJuIHBhdGguam9pbihzdWIsIHN1YlByb2opO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBza2lwIHVucmVhZGFibGUgZGlycyAqLyB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VTd2lmdChkaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwID0gcGF0aC5qb2luKGRpciwgXCJQYWNrYWdlLnN3aWZ0XCIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwKSA/IHAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBoYXNTREtEZXBlbmRlbmN5KHBhY2thZ2VTd2lmdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZVN3aWZ0LCBcInV0Zi04XCIpO1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcyhcInBhdGgtdGVybWluYWwtc2RrXCIpIHx8IGNvbnRlbnQuaW5jbHVkZXMoXCJQYXRoVGVybWluYWxTREtcIik7XG59XG5cbmZ1bmN0aW9uIGhhc1hjb2RlUHJvamVjdFNES0RlcGVuZGVuY3koeGNvZGVQcm9qZWN0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gWGNvZGUgc3RvcmVzIHJlc29sdmVkIFNQTSBwYWNrYWdlcyBpbiB0aGUgd29ya3NwYWNlJ3MgUGFja2FnZS5yZXNvbHZlZFxuICBjb25zdCByZXNvbHZlZFBhdGhzID0gW1xuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwicHJvamVjdC54Y3dvcmtzcGFjZVwiLCBcInhjc2hhcmVkZGF0YVwiLCBcInN3aWZ0cG1cIiwgXCJQYWNrYWdlLnJlc29sdmVkXCIpLFxuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwieGNzaGFyZWRkYXRhXCIsIFwic3dpZnRwbVwiLCBcIlBhY2thZ2UucmVzb2x2ZWRcIiksXG4gIF07XG4gIGZvciAoY29uc3QgcCBvZiByZXNvbHZlZFBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgXCJ1dGYtOFwiKTtcbiAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFwicGF0aC10ZXJtaW5hbC1zZGtcIikgfHwgY29udGVudC5pbmNsdWRlcyhcIlBhdGhUZXJtaW5hbFNES1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlU3dpZnRQYXRoLCBcInV0Zi04XCIpO1xuXG4gIC8vIEFscmVhZHkgcHJlc2VudD9cbiAgaWYgKGhhc1NES0RlcGVuZGVuY3kocGFja2FnZVN3aWZ0UGF0aCkpIHJldHVybiBmYWxzZTtcblxuICAvLyBBZGQgdGhlIHBhY2thZ2UgZGVwZW5kZW5jeSBcdTIwMTQgZmluZCB0aGUgZGVwZW5kZW5jaWVzOiBbIGFycmF5XG4gIGNvbnN0IGRlcHNSZWdleCA9IC8oZGVwZW5kZW5jaWVzOlxccypcXFspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gQ2FuJ3Qgc2FmZWx5IGluamVjdCBcdTIwMTQgc3RydWN0dXJlIG5vdCByZWNvZ25pc2VkXG4gIH1cblxuICBjb25zdCBkZXBFbnRyeSA9IGBcXG4gICAgICAgIC5wYWNrYWdlKHVybDogXCIke1NES19HSVRIVUJfVVJMfVwiLCBmcm9tOiBcIiR7U0RLX1ZFUlNJT059XCIpLGA7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGVwc1JlZ2V4LCBgJDEke2RlcEVudHJ5fWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VTd2lmdFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ3Vyc29yLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgY29uc3QgY3Vyc29yRGlyID0gcGF0aC5qb2luKGRpciwgXCIuY3Vyc29yXCIpO1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGN1cnNvckRpciwgXCJtY3AuanNvblwiKTtcblxuICBmcy5ta2RpclN5bmMoY3Vyc29yRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBwYXRoRW50cnkgPSB7XG4gICAgXCJwYXRoLXRlcm1pbmFsXCI6IHsgdXJsOiBNQ1BfU0VSVkVSX1VSTCB9LFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gcGF0aEVudHJ5W1wicGF0aC10ZXJtaW5hbFwiXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiB0cnVlIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIEpTT04gXHUyMDE0IGRvbid0IG92ZXJ3cml0ZVxuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7IG1jcFNlcnZlcnM6IHBhdGhFbnRyeSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZpbGVuYW1lOiBzdHJpbmcgPSBcInBhdGgtaW50ZWdyYXRpb24ubWRjXCIsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihkaXIsIFwiLmN1cnNvclwiLCBcInJ1bGVzXCIpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZmlsZW5hbWUpO1xuXG4gIGZzLm1rZGlyU3luYyhydWxlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghY29udGVudCkgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG5cbiAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENsYXVkZSBDb2RlLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgLy8gQ2xhdWRlIENvZGUgcmVhZHMgLm1jcC5qc29uIGF0IHRoZSBwcm9qZWN0IHJvb3QgKHNhbWUgbWNwU2VydmVycyBmb3JtYXQgYXMgQ3Vyc29yKVxuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCIubWNwLmpzb25cIik7XG5cbiAgY29uc3Qgc2VydmVyRW50cnkgPSB7XG4gICAgdHlwZTogXCJzc2VcIixcbiAgICB1cmw6IE1DUF9TRVJWRVJfVVJMLFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gc2VydmVyRW50cnk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7XG4gICAgbWNwU2VydmVyczoge1xuICAgICAgXCJwYXRoLXRlcm1pbmFsXCI6IHNlcnZlckVudHJ5LFxuICAgIH0sXG4gIH07XG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiBmYWxzZSB9O1xufVxuXG4vLyBQcmUtYXBwcm92ZSB0aGUgcGF0aC10ZXJtaW5hbCBNQ1Agc2VydmVyIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiBzbyBDbGF1ZGVcbi8vIENvZGUgbG9hZHMgaXRzIHRvb2xzIG9uIHRoZSB2ZXJ5IGZpcnN0IHNlc3Npb24gd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgdG9cbi8vIGNsaWNrIHRocm91Z2ggYW4gYXBwcm92YWwgcHJvbXB0ICh3aGljaCBpcyBlYXN5IHRvIG1pc3MgYW5kIGxlYXZlcyB0aGUgYWdlbnRcbi8vIHJ1bm5pbmcgd2l0aG91dCBNQ1AgdG9vbHMpLlxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVTZXR0aW5ncyhkaXI6IHN0cmluZyk6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuOyBhbHJlYWR5QXBwcm92ZWQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihkaXIsIFwiLmNsYXVkZVwiKTtcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJzZXR0aW5ncy5qc29uXCIpO1xuICBjb25zdCBNQ1BfTkFNRSA9IFwicGF0aC10ZXJtaW5hbFwiO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGF1ZGVEaXIpKSB7XG4gICAgZnMubWtkaXJTeW5jKGNsYXVkZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQ6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShleGlzdGluZy5lbmFibGVkTWNwanNvblNlcnZlcnMpID8gZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzIDogW107XG4gICAgICBpZiAoY3VycmVudC5pbmNsdWRlcyhNQ1BfTkFNRSkpIHtcbiAgICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzID0gWy4uLmN1cnJlbnQsIE1DUF9OQU1FXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShleGlzdGluZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IHRydWUsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlLCBhbHJlYWR5QXBwcm92ZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGVuYWJsZWRNY3Bqc29uU2VydmVyczogW01DUF9OQU1FXSxcbiAgfTtcbiAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkaXIsIFwiQ0xBVURFLm1kXCIpO1xuXG4gIC8vIERvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBDTEFVREUubWQgXHUyMDE0IGl0IG1heSBoYXZlIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhkZXN0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcyhcIlBhdGggVGVybWluYWwgU0RLXCIpKSB7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgc2tpcHBlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgQ0xBVURFLm1kXG4gICAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gICAgaWYgKCFydWxlcykgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZGVzdFBhdGgsIFwiXFxuXFxuXCIgKyBydWxlcywgXCJ1dGYtOFwiKTtcbiAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghcnVsZXMpIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiBmYWxzZSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBydWxlcywgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZTogc3RyaW5nID0gUlVMRVNfU09VUkNFLCBmYWxsYmFja1VybD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmF3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhydWxlc1NvdXJjZSkpIHtcbiAgICByYXcgPSBmcy5yZWFkRmlsZVN5bmMocnVsZXNTb3VyY2UsIFwidXRmLThcIik7XG4gIH0gZWxzZSBpZiAoZmFsbGJhY2tVcmwpIHtcbiAgICB0cnkge1xuICAgICAgcmF3ID0gZXhlY1N5bmMoYGN1cmwgLXNmIC0tbWF4LXRpbWUgMTAgXCIke2ZhbGxiYWNrVXJsfVwiYCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuXG4gIC8vIFN0cmlwIHRoZSBZQU1MIGZyb250bWF0dGVyICgtLS0gLi4uIC0tLSkgdGhhdCBDdXJzb3IgdXNlc1xuICBjb25zdCBzdHJpcHBlZCA9IHJhdy5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLVxccyovLCBcIlwiKTtcbiAgcmV0dXJuIHN0cmlwcGVkLnRyaW0oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNoYXJlZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gY2hlY2tJbmZvUGxpc3QoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGxpc3RGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiBmaW5kUGxpc3RzKGQ6IHN0cmluZywgZGVwdGg6IG51bWJlciA9IDApIHtcbiAgICBpZiAoZGVwdGggPiA0KSByZXR1cm47XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGQpO1xuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZSA9PT0gXCJub2RlX21vZHVsZXNcIiB8fCBlLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZCwgZSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSBmaW5kUGxpc3RzKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICBlbHNlIGlmIChlID09PSBcIkluZm8ucGxpc3RcIikgcGxpc3RGaWxlcy5wdXNoKGZ1bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRQbGlzdHMoZGlyKTtcblxuICBmb3IgKGNvbnN0IHBsaXN0IG9mIHBsaXN0RmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBsaXN0LCBcInV0Zi04XCIpO1xuICAgIGlmICghY29udGVudC5pbmNsdWRlcyhcIk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvblwiKSkge1xuICAgICAgaXNzdWVzLnB1c2gocGxpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBbmRyb2lkIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGZpbmRBbmRyb2lkUHJvamVjdChkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIikpICYmXG4gICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXIsIFwiYXBwXCIsIFwiYnVpbGQuZ3JhZGxlLmt0c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEluc3RhbGxlZCA9IHRoZSBQYXRoIE1hdmVuIHJlcG8gaXMgcmVnaXN0ZXJlZCBBTkQgYSB0ZWNoLnBhdGgyYWkuc2RrIGRlcCBpcyBwcmVzZW50LlxuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHNldHRpbmdzID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlcyhQQVRIX01BVkVOX1VSTCkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5qb2luKGRpciwgXCJhcHBcIiwgXCJidWlsZC5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYnVpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGJ1aWxkID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIC9eXFxzKmltcGxlbWVudGF0aW9uXFwoXCJ0ZWNoXFwucGF0aDJhaVxcLnNkazpwYXRoLXRlcm1pbmFsLXNkay9tLnRlc3QoYnVpbGQpO1xufVxuXG5mdW5jdGlvbiBpbmplY3RQYXRoTWF2ZW5SZXBvKGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNldHRpbmdzUGF0aCA9IHBhdGguam9pbihkaXIsIFwic2V0dGluZ3MuZ3JhZGxlLmt0c1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNldHRpbmdzUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpO1xuICBpZiAoY29udGVudC5pbmNsdWRlcyhQQVRIX01BVkVOX1VSTCkpIHJldHVybiB0cnVlOyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgLy8gQWRkIHRoZSBQYXRoIE1hdmVuIHJlcG8gaW5zaWRlIGRlcGVuZGVuY3lSZXNvbHV0aW9uTWFuYWdlbWVudCByZXBvc2l0b3JpZXMgYmxvY2tcbiAgY29uc3QgcmVwb1JlZ2V4ID0gLyhkZXBlbmRlbmN5UmVzb2x1dGlvbk1hbmFnZW1lbnRcXHMqXFx7W159XSpyZXBvc2l0b3JpZXNcXHMqXFx7KS9zO1xuICBpZiAoIXJlcG9SZWdleC50ZXN0KGNvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVwb1JlZ2V4LCBgJDFcXG4gICAgICAgIG1hdmVuIHsgdXJsID0gdXJpKFwiJHtQQVRIX01BVkVOX1VSTH1cIikgfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBidWlsZFBhdGggPSBwYXRoLmpvaW4oZGlyLCBcImFwcFwiLCBcImJ1aWxkLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhidWlsZFBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAvLyBBbHJlYWR5IHByZXNlbnQgYW5kIHVuY29tbWVudGVkIFx1MjAxNCBub3RoaW5nIHRvIGRvXG4gIGlmICgvXlxccyppbXBsZW1lbnRhdGlvblxcKFwidGVjaFxcLnBhdGgyYWlcXC5zZGs6cGF0aC10ZXJtaW5hbC1zZGsvbS50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCBkZXBzID0gQU5EUk9JRF9TREtfTU9EVUxFU1xuICAgIC5tYXAoKG0pID0+IGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0dST1VQfToke219OiR7QU5EUk9JRF9TREtfVkVSU0lPTn1cIilgKVxuICAgIC5qb2luKFwiXFxuXCIpICsgXCJcXG5cIjtcblxuICAvLyBQcmVzZW50IGJ1dCBjb21tZW50ZWQgb3V0IChvbGRlciBoYXJuZXNzIHNjYWZmb2xkcykgXHUyMDE0IHVuY29tbWVudC9yZXBsYWNlIHRob3NlIGxpbmVzXG4gIGlmICgvcGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZHx0ZWNoXFwucGF0aDJhaVxcLnNkay8udGVzdChjb250ZW50KSkge1xuICAgIGZvciAoY29uc3QgbSBvZiBBTkRST0lEX1NES19NT0RVTEVTKSB7XG4gICAgICBjb25zdCBjb21tZW50ZWQgPSBuZXcgUmVnRXhwKGBeXFxcXHMqLy9cXFxccyppbXBsZW1lbnRhdGlvblxcXFwoKD86XCJ8JykoPzpjb21cXFxcLmdpdGh1YlxcXFwua2V5bWFuMTJcXFxcLnBhdGgtdGVybWluYWwtc2RrLWFuZHJvaWR8dGVjaFxcXFwucGF0aDJhaVxcXFwuc2RrKToke219W15cIicpXSooPzpcInwnKVxcXFwpYCwgXCJnbVwiKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoY29tbWVudGVkLCBgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19HUk9VUH06JHttfToke0FORFJPSURfU0RLX1ZFUlNJT059XCIpYCk7XG4gICAgfVxuICAgIC8vIElmIHBhdGgtcHNkay1hZGFwdGVyIHdhc24ndCBpbiB0aGUgb2xkIHNjYWZmb2xkLCBhZGQgdGhlIHdob2xlIGJsb2NrIG9uY2UuXG4gICAgaWYgKCEvdGVjaFxcLnBhdGgyYWlcXC5zZGs6cGF0aC1wc2RrLWFkYXB0ZXIvLnRlc3QoY29udGVudCkpIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyhkZXBlbmRlbmNpZXNcXHMqXFx7KS8sIGAkMVxcbiR7ZGVwc31gKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhidWlsZFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBOb3QgcHJlc2VudCBhdCBhbGwgXHUyMDE0IGluamVjdCBhZnRlciB0aGUgZGVwZW5kZW5jaWVzIHsgb3BlbmluZyBicmFjZVxuICBjb25zdCBkZXBzUmVnZXggPSAvKGRlcGVuZGVuY2llc1xccypcXHspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkgcmV0dXJuIGZhbHNlO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGRlcHNSZWdleCwgYCQxXFxuJHtkZXBzfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKGJ1aWxkUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQW5kcm9pZE1hbmlmZXN0KGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZ1bmN0aW9uIGZpbmRNYW5pZmVzdHMoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyID0gMCkge1xuICAgIGlmIChkZXB0aCA+IDQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZnMucmVhZGRpclN5bmMoZCkpIHtcbiAgICAgIGlmIChlLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGUgPT09IFwiYnVpbGRcIikgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGQsIGUpO1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGwpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgZmluZE1hbmlmZXN0cyhmdWxsLCBkZXB0aCArIDEpO1xuICAgICAgZWxzZSBpZiAoZSA9PT0gXCJBbmRyb2lkTWFuaWZlc3QueG1sXCIpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsLCBcInV0Zi04XCIpO1xuICAgICAgICBpZiAoIWNvbnRlbnQuaW5jbHVkZXMoXCJCTFVFVE9PVEhfU0NBTlwiKSkgaXNzdWVzLnB1c2goZnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZpbmRNYW5pZmVzdHMoZGlyKTtcbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdpbmRvd3MgaGVscGVycyAoLk5FVCBcdTIwMTQgV2luVUkgMyAvIC5ORVQgMTAgYW5kIFdQRiAvIC5ORVQgRlcgNC44KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gQ29sbGVjdCAuY3Nwcm9qIGZpbGUgcGF0aHMgaW4gY3dkIGFuZCB1cCB0byB0aHJlZSBsZXZlbHMgZGVlcCAoY292ZXJzIHRoZSBjb21tb25cbi8vIHNyYy88QXBwPi88QXBwPi5jc3Byb2ogbGF5b3V0IFx1MjAxNCBvbmUgbGV2ZWwgd2FzIHRvbyBzaGFsbG93IGFuZCBtaXNzZWQgaXQpLlxuZnVuY3Rpb24gZmluZENzcHJvakZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBmb3VuZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgd2FsayA9IChkOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIpID0+IHtcbiAgICBpZiAoZGVwdGggPiAzKSByZXR1cm47XG4gICAgbGV0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHsgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGQpOyB9IGNhdGNoIHsgcmV0dXJuOyB9XG4gICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChlLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGUgPT09IFwiYmluXCIgfHwgZSA9PT0gXCJvYmpcIiB8fCBlID09PSBcIm5vZGVfbW9kdWxlc1wiIHx8IGUgPT09IFwicGFja2FnZXNcIikgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGQsIGUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3QgPSBmcy5zdGF0U3luYyhmdWxsKTtcbiAgICAgICAgaWYgKHN0LmlzRGlyZWN0b3J5KCkpIHdhbGsoZnVsbCwgZGVwdGggKyAxKTtcbiAgICAgICAgZWxzZSBpZiAoZS5lbmRzV2l0aChcIi5jc3Byb2pcIikpIGZvdW5kLnB1c2goZnVsbCk7XG4gICAgICB9IGNhdGNoIHsgLyogc2tpcCAqLyB9XG4gICAgfVxuICB9O1xuICB3YWxrKGRpciwgMCk7XG4gIHJldHVybiBmb3VuZDtcbn1cblxuLy8gQSBXaW5kb3dzIHByb2plY3QgPSBhIC5zbG4gb3IgYSAuY3Nwcm9qIGluIGN3ZCBvciBvbmUgbGV2ZWwgZGVlcC5cbmZ1bmN0aW9uIGZpbmRXaW5kb3dzUHJvamVjdChkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogc3RyaW5nW10gPSBbXTtcbiAgdHJ5IHsgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7IH0gY2F0Y2ggeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGVudHJpZXMuc29tZSgoZSkgPT4gZS5lbmRzV2l0aChcIi5zbG5cIikpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZpbmRDc3Byb2pGaWxlcyhkaXIpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdpbjExID0gV2luVUkgMyAvIC5ORVQgMTAgKG5ldDEwLjAtd2luZG93cyk7IFdpbjEwID0gV1BGIC8gLk5FVCBGcmFtZXdvcmsgNC44IChuZXQ0OCkuXG4vLyBEZWZhdWx0IHRvIFdpbmRvd3MgMTEgKHRoZSBtb2Rlcm4gc3RhY2spIHdoZW4gdGhlIHNpZ25hbCBpcyBhbWJpZ3VvdXMuXG5mdW5jdGlvbiBkZXRlY3RXaW5kb3dzRmxhdm91cihkaXI6IHN0cmluZyk6IFwid2luZG93czExXCIgfCBcIndpbmRvd3MxMFwiIHtcbiAgY29uc3QgYmxvYiA9IGZpbmRDc3Byb2pGaWxlcyhkaXIpLm1hcCgoZikgPT4ge1xuICAgIHRyeSB7IHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZiwgXCJ1dGYtOFwiKTsgfSBjYXRjaCB7IHJldHVybiBcIlwiOyB9XG4gIH0pLmpvaW4oXCJcXG5cIikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGJsb2IuaW5jbHVkZXMoXCJuZXQ0OFwiKSB8fCBibG9iLmluY2x1ZGVzKFwiPHVzZXdwZj50cnVlXCIpIHx8IGJsb2IuaW5jbHVkZXMoXCJ2NC44XCIpKSByZXR1cm4gXCJ3aW5kb3dzMTBcIjtcbiAgcmV0dXJuIFwid2luZG93czExXCI7XG59XG5cbmZ1bmN0aW9uIGhhc1dpbmRvd3NTREtEZXBlbmRlbmN5KGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5zb21lKChmKSA9PiB7XG4gICAgdHJ5IHsgcmV0dXJuIC9QYXRoXFwuVGVybWluYWxcXC5TZGsvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGYsIFwidXRmLThcIikpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH0pO1xufVxuXG4vLyBBZGQgdGhlIFBhdGggTnVHZXQgZmVlZCB0byBhIG51Z2V0LmNvbmZpZyBiZXNpZGUgdGhlIHByb2plY3QgKGNyZWF0ZSBpdCBpZiBhYnNlbnQpLlxuZnVuY3Rpb24gaW5qZWN0UGF0aE51Z2V0Q29uZmlnKGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNmZ1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcIm51Z2V0LmNvbmZpZ1wiKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY2ZnUGF0aCkpIHtcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjZmdQYXRoLCBcInV0Zi04XCIpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFBBVEhfTlVHRVRfVVJMKSkgcmV0dXJuIHRydWU7IC8vIGFscmVhZHkgcHJlc2VudFxuICAgIGlmICgvPHBhY2thZ2VTb3VyY2VzPi8udGVzdChjb250ZW50KSkge1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPHBhY2thZ2VTb3VyY2VzPi8sIGA8cGFja2FnZVNvdXJjZXM+XFxuICAgIDxhZGQga2V5PVwicGF0aFwiIHZhbHVlPVwiJHtQQVRIX05VR0VUX1VSTH1cIiAvPmApO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjZmdQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTsgLy8gdW5leHBlY3RlZCBzaGFwZSBcdTIwMTQgbGVhdmUgaXQgZm9yIGEgbWFudWFsIHN0ZXBcbiAgfVxuICBjb25zdCBjZmcgPVxuICAgIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cXG5gICtcbiAgICBgPGNvbmZpZ3VyYXRpb24+XFxuYCArXG4gICAgYCAgPHBhY2thZ2VTb3VyY2VzPlxcbmAgK1xuICAgIGAgICAgPGFkZCBrZXk9XCJwYXRoXCIgdmFsdWU9XCIke1BBVEhfTlVHRVRfVVJMfVwiIC8+XFxuYCArXG4gICAgYCAgPC9wYWNrYWdlU291cmNlcz5cXG5gICtcbiAgICBgPC9jb25maWd1cmF0aW9uPlxcbmA7XG4gIGZzLndyaXRlRmlsZVN5bmMoY2ZnUGF0aCwgY2ZnLCBcInV0Zi04XCIpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQWRkIHRoZSBQYXRoIFNESyBQYWNrYWdlUmVmZXJlbmNlcyB0byB0aGUgYXBwJ3MgLmNzcHJvaiBhbmQgZW5zdXJlIGl0IGJ1aWxkcyB4NjQgKHRoZVxuLy8gVmVyaWZvbmUgYmluZGluZyBpcyB4NjQgbWl4ZWQtbW9kZSkuIFJldHVybnMgdGhlIG1vZGlmaWVkIGZpbGUgcGF0aCwgb3IgbnVsbCBpZiBub25lIGZvdW5kLlxuZnVuY3Rpb24gaW5qZWN0V2luZG93c1BhY2thZ2VSZWZlcmVuY2VzKGRpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGNzcHJvanMgPSBmaW5kQ3Nwcm9qRmlsZXMoZGlyKTtcbiAgaWYgKGNzcHJvanMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgLy8gUHJlZmVyIGEgbm9uLXRlc3QvLWhhcm5lc3MgcHJvamVjdDsgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBmb3VuZC5cbiAgY29uc3QgdGFyZ2V0ID0gY3Nwcm9qcy5maW5kKChmKSA9PiAhL3Rlc3R8aGFybmVzcy9pLnRlc3QocGF0aC5iYXNlbmFtZShmKSkpID8/IGNzcHJvanNbMF07XG4gIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRhcmdldCwgXCJ1dGYtOFwiKTtcbiAgaWYgKC9QYWNrYWdlUmVmZXJlbmNlXFxzK0luY2x1ZGU9XCJQYXRoXFwuVGVybWluYWxcXC4vLnRlc3QoY29udGVudCkpIHJldHVybiB0YXJnZXQ7IC8vIGFscmVhZHkgdGhlcmVcblxuICBjb25zdCByZWZzID0gV0lORE9XU19TREtfUEFDS0FHRVNcbiAgICAubWFwKChwKSA9PiBgICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9XCIke3B9XCIgVmVyc2lvbj1cIiR7V0lORE9XU19TREtfVkVSU0lPTn1cIiAvPmApXG4gICAgLmpvaW4oXCJcXG5cIik7XG4gIGNvbnN0IGl0ZW1Hcm91cCA9XG4gICAgYFxcbiAgPCEtLSBQYXRoIFRlcm1pbmFsIFNESyBcdTIwMTQgZnJvbSB0aGUgUGF0aCBOdUdldCBmZWVkIChzZWUgbnVnZXQuY29uZmlnKS4gLS0+XFxuYCArXG4gICAgYCAgPEl0ZW1Hcm91cD5cXG4ke3JlZnN9XFxuICA8L0l0ZW1Hcm91cD5cXG5gO1xuXG4gIC8vIEVuc3VyZSB4NjQgKFZlcmlmb25lIGJpbmRpbmcpLiBBZGQgdG8gdGhlIGZpcnN0IFByb3BlcnR5R3JvdXAgaWYgbm90IGFscmVhZHkgc2V0LlxuICBpZiAoIS88UGxhdGZvcm1UYXJnZXQ+Ly50ZXN0KGNvbnRlbnQpICYmIC88UHJvcGVydHlHcm91cD4vLnRlc3QoY29udGVudCkpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC88UHJvcGVydHlHcm91cD4vLCBgPFByb3BlcnR5R3JvdXA+XFxuICAgIDxQbGF0Zm9ybVRhcmdldD54NjQ8L1BsYXRmb3JtVGFyZ2V0PmApO1xuICB9XG4gIC8vIEluc2VydCB0aGUgSXRlbUdyb3VwIGp1c3QgYmVmb3JlIHRoZSBjbG9zaW5nIDwvUHJvamVjdD4uXG4gIGlmICghLzxcXC9Qcm9qZWN0PlxccyokLy50ZXN0KGNvbnRlbnQpKSByZXR1cm4gbnVsbDtcbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPFxcL1Byb2plY3Q+XFxzKiQvLCBgJHtpdGVtR3JvdXB9PC9Qcm9qZWN0PlxcbmApO1xuICBmcy53cml0ZUZpbGVTeW5jKHRhcmdldCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN1bW1hcnkgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gSXMgdGhlIENsYXVkZSBDb2RlIENMSSBvbiBQQVRIPyBSdW5uaW5nIGBucHggcGF0aC10ZXJtaW5hbC1pbml0YCBwcm92ZXMgTm9kZSBpc1xuLy8gaW5zdGFsbGVkLCBidXQgbm90IENsYXVkZSBDb2RlIFx1MjAxNCBhbmQgdGhlIHByaW50ZWQgbmV4dCBzdGVwIGFzc3VtZXMgYGNsYXVkZWAgd29ya3MuXG5mdW5jdGlvbiBoYXNDbGF1ZGVDbGkoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgZXhlY1N5bmMocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJ3aGVyZSBjbGF1ZGVcIiA6IFwid2hpY2ggY2xhdWRlXCIsIHsgc3RkaW86IFwiaWdub3JlXCIgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBUaGUgbmF0aXZlIGluc3RhbGxlcidzIGJpbmFyeSBsb2NhdGlvbiBcdTIwMTQgaWYgdGhlIGJpbmFyeSBpcyBoZXJlIGJ1dCBgY2xhdWRlYCBkb2Vzbid0XG4vLyByZXNvbHZlLCB0aGUgaW5zdGFsbGVyIGZhaWxlZCB0byBwZXJzaXN0IHRoZSBQQVRIIGVudHJ5IChzZWVuIGluIHRoZSB3aWxkIG9uIFdpbmRvd3MpLlxuZnVuY3Rpb24gZmluZENsYXVkZUJpbmFyeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaG9tZSA9IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFIHx8IHByb2Nlc3MuZW52LkhPTUUgfHwgXCJcIjtcbiAgaWYgKCFob21lKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgY2FuZGlkYXRlID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBwYXRoLmpvaW4oaG9tZSwgXCIubG9jYWxcIiwgXCJiaW5cIiwgXCJjbGF1ZGUuZXhlXCIpXG4gICAgOiBwYXRoLmpvaW4oaG9tZSwgXCIubG9jYWxcIiwgXCJiaW5cIiwgXCJjbGF1ZGVcIik7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiBudWxsO1xufVxuXG4vLyBBcHBlbmQgJVVTRVJQUk9GSUxFJVxcLmxvY2FsXFxiaW4gdG8gdGhlIHBlcnNpc3RlbnQgVVNFUiBQYXRoIChuZXZlciBzZXR4LCB3aGljaFxuLy8gbWVyZ2VzIGluIHRoZSBzeXN0ZW0gUEFUSCBhbmQgdHJ1bmNhdGVzIGF0IDEwMjQgY2hhcnMpLiBOby1vcCBpZiBhbHJlYWR5IHByZXNlbnQuXG5mdW5jdGlvbiBhZGRDbGF1ZGVEaXJUb1VzZXJQYXRoKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBvd2Vyc2hlbGwgLU5vUHJvZmlsZSAtQ29tbWFuZCBcIiR1PVtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ1BhdGgnLCdVc2VyJyk7IGlmICgkdSAtbm90bGlrZSAnKlxcXFwubG9jYWxcXFxcYmluKicpIHsgW0Vudmlyb25tZW50XTo6U2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnUGF0aCcsICgkdS5UcmltRW5kKCc7JykgKyAnOycgKyAkZW52OlVTRVJQUk9GSUxFICsgJ1xcXFwubG9jYWxcXFxcYmluJyksICdVc2VyJykgfVwiYCxcbiAgICAgIHsgc3RkaW86IFwiaWdub3JlXCIgfVxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwbGF0Zm9ybUxhYmVsKHBsYXRmb3JtOiBQbGF0Zm9ybSk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICBjYXNlIFwiYW5kcm9pZFwiOiByZXR1cm4gXCJBbmRyb2lkXCI7XG4gICAgY2FzZSBcIndpbmRvd3MxMVwiOiByZXR1cm4gXCJXaW5kb3dzIDExIChXaW5VSSAzIC8gLk5FVCAxMClcIjtcbiAgICBjYXNlIFwid2luZG93czEwXCI6IHJldHVybiBcIldpbmRvd3MgMTAgKFdQRiAvIC5ORVQgRlcgNC44KVwiO1xuICAgIGRlZmF1bHQ6IHJldHVybiBcImlPU1wiO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50U3VtbWFyeShhZ2VudDogQWdlbnRUeXBlLCBwbGF0Zm9ybTogUGxhdGZvcm0sIGFjdGlvbnM6IHN0cmluZ1tdLCB3YXJuaW5nczogc3RyaW5nW10sIG1hbnVhbFN0ZXBzOiBzdHJpbmdbXSkge1xuICBjb25zdCBpc0FuZHJvaWQgPSBwbGF0Zm9ybSA9PT0gXCJhbmRyb2lkXCI7XG4gIGNvbnN0IGlzV2luZG93cyA9IHBsYXRmb3JtID09PSBcIndpbmRvd3MxMVwiIHx8IHBsYXRmb3JtID09PSBcIndpbmRvd3MxMFwiO1xuICBjb25zb2xlLmxvZyhcIlxcblwiICsgY2hhbGsuYm9sZChcIlx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFwiKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYCAgUGF0aCBUZXJtaW5hbCBTREsgXHUyMDE0IFNldHVwIENvbXBsZXRlICgke3BsYXRmb3JtTGFiZWwocGxhdGZvcm0pfSlgKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcXG5cIikpO1xuXG4gIGlmIChhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlx1MjcxMyBEb25lOlwiKSk7XG4gICAgYWN0aW9ucy5mb3JFYWNoKChhKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICBcdTIwMjIgJHthfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGlmIChtYW51YWxTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXHUyNkEwIE1hbnVhbCBzdGVwcyByZXF1aXJlZDpcIikpO1xuICAgIG1hbnVhbFN0ZXBzLmZvckVhY2goKHMsIGkpID0+IGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICAke2kgKyAxfS4gJHtzfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiXHUyMTM5IE5vdGVzOlwiKSk7XG4gICAgd2FybmluZ3MuZm9yRWFjaCgodykgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFx1MjAyMiAke3d9YCkpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gQ2Fub25pY2FsIGZpcnN0LXByb21wdCB0ZXh0IFx1MjAxNCBpZGVudGljYWwgZm9yIENsYXVkZSBDb2RlIGFuZCBDdXJzb3Igc28gdGhlXG4gIC8vIGFnZW50IHJlY2VpdmVzIHRoZSBzYW1lIGRpcmVjdGl2ZSByZWdhcmRsZXNzIG9mIHRoZSBkZXZlbG9wZXIncyBJREUuXG4gIGNvbnN0IG1jcFByb21wdCA9XG4gICAgcGxhdGZvcm0gPT09IFwiYW5kcm9pZFwiID8gXCJpbnRlZ3JhdGUtcGF0aC1hbmRyb2lkXCIgOlxuICAgIHBsYXRmb3JtID09PSBcIndpbmRvd3MxMVwiID8gXCJpbnRlZ3JhdGUtcGF0aC13aW5kb3dzMTFcIiA6XG4gICAgcGxhdGZvcm0gPT09IFwid2luZG93czEwXCIgPyBcImludGVncmF0ZS1wYXRoLXdpbmRvd3MxMFwiIDpcbiAgICBcImludGVncmF0ZS1wYXRoLXNhbGVcIjtcbiAgY29uc3QgZmlyc3RQcm9tcHQgPVxuICAgICcgIFwiSW50ZWdyYXRlIHRoZSBQYXRoIFRlcm1pbmFsIFNESyBpbnRvIHRoaXMgRVBPUyBhcHAuIFJlYWQgQ0xBVURFLm1kXFxuJyArXG4gICAgJyAgIGZvciB0aGUgaW50ZWdyYXRpb24gcnVsZXMsIHRoZW4gdXNlIHRoZSBQYXRoIE1DUCAnICsgbWNwUHJvbXB0ICsgJ1xcbicgK1xuICAgICcgICBwcm9tcHQgdG8gYWRkIGEgUGF0aCBQT1MgQWRhcHRlciBpbiBTZXR0aW5ncyBcdTIwMTQgYSBiYWNrZW5kIHN3aXRjaGVyIGZvciB0aGVcXG4nICtcbiAgICAnICAgUGF0aCBQT1MgRW11bGF0b3IgKFdpLUZpL0lQIG9yIEJsdWV0b290aCkgYW5kIGEgcmVhbCBWZXJpZm9uZSB0ZXJtaW5hbC5cIic7XG5cbiAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgaWYgKCFoYXNDbGF1ZGVDbGkoKSkge1xuICAgICAgY29uc3QgYmluYXJ5ID0gZmluZENsYXVkZUJpbmFyeSgpO1xuICAgICAgaWYgKGJpbmFyeSkge1xuICAgICAgICAvLyBJbnN0YWxsZWQgYnV0IG5vdCByZWFjaGFibGUgXHUyMDE0IHRoZSBpbnN0YWxsZXIgZGlkbid0IHBlcnNpc3QgdGhlIFBBVEggZW50cnkuXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgXHUyNkEwIENsYXVkZSBDb2RlIGlzIGluc3RhbGxlZCAoJHtiaW5hcnl9KSBidXQgaXRzIGZvbGRlciBpcyBub3Qgb24geW91ciBQQVRILGApKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiICBzbyB0aGUgYGNsYXVkZWAgY29tbWFuZCB3b24ndCB3b3JrLlwiKSk7XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICAgICAgICBjb25zdCBmaXggPSAoYXdhaXQgYXNrKGNoYWxrLmJvbGQoXCIgIEFkZCBpdCB0byB5b3VyIHVzZXIgUEFUSCBub3c/ICh5L24pOiBcIikpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChmaXggPT09IFwieVwiICYmIGFkZENsYXVkZURpclRvVXNlclBhdGgoKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCIgIFx1MjcxMyBBZGRlZCB0byB5b3VyIHVzZXIgUEFUSC5cIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCIgIFRvIGZpeCBpdCB5b3Vyc2VsZiwgcnVuIHRoaXMgaW4gUG93ZXJTaGVsbDpcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICBbRW52aXJvbm1lbnRdOjpTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdQYXRoJywgW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnUGF0aCcsJ1VzZXInKSArICc7JyArICRlbnY6VVNFUlBST0ZJTEUgKyAnXFxcXC5sb2NhbFxcXFxiaW4nLCAnVXNlcicpXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiICBBZGQgaXQgdG8geW91ciBzaGVsbCBwcm9maWxlICh+Ly56c2hyYyBvciB+Ly5iYXNocmMpOlwiKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICBlY2hvICdleHBvcnQgUEFUSD1cXFwiJEhPTUUvLmxvY2FsL2JpbjokUEFUSFxcXCInID4+IH4vLnpzaHJjXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCIgIFx1MjAyNnRoZW4gb3BlbiBhIE5FVyB0ZXJtaW5hbCAoUEFUSCBjaGFuZ2VzIGRvbid0IHJlYWNoIHRoaXMgb25lKSBhbmQgY29tZSBiYWNrIGhlcmUuXCIpKTtcbiAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlx1MjZBMCBDbGF1ZGUgQ29kZSBpcyBub3QgaW5zdGFsbGVkICh0aGUgYGNsYXVkZWAgY29tbWFuZCB3YXMgbm90IGZvdW5kKS5cIikpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCIgIEluc3RhbGwgaXQgZmlyc3Q6XCIpKTtcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oXCIgICAgaXJtIGh0dHBzOi8vY2xhdWRlLmFpL2luc3RhbGwucHMxIHwgaWV4XCIpICsgY2hhbGsuZGltKFwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQb3dlclNoZWxsKVwiKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICBjdXJsIC1mc1NMIGh0dHBzOi8vY2xhdWRlLmFpL2luc3RhbGwuY21kIC1vIGluc3RhbGwuY21kICYmIGluc3RhbGwuY21kICYmIGRlbCBpbnN0YWxsLmNtZFwiKSArIGNoYWxrLmRpbShcIiAgIChDTUQpXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgIGN1cmwgLWZzU0wgaHR0cHM6Ly9jbGF1ZGUuYWkvaW5zdGFsbC5zaCB8IGJhc2hcIikpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIiAgXHUyMDI2dGhlbiByZXN0YXJ0IHlvdXIgdGVybWluYWwsIHJ1biBgY2xhdWRlYCBvbmNlIHRvIGxvZyBpbiwgYW5kIGNvbWUgYmFjayBoZXJlLlwiKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcdUQ4M0RcdURFODAgU3RhcnQgQ2xhdWRlIENvZGUgaW4gdGhpcyBkaXJlY3Rvcnk6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICBjbGF1ZGUgLS1tb2RlbCBzb25uZXRcIikpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIiAgVGhlbiBwYXN0ZSB0aGlzIHByb21wdDpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oZmlyc3RQcm9tcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXHVEODNEXHVERTgwIFlvdXIgZmlyc3QgcHJvbXB0IGluIEN1cnNvcjpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oZmlyc3RQcm9tcHQpKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBNQ1Agc2VydmVyOiAke01DUF9TRVJWRVJfVVJMfWApKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICBEb2NzOiAgICAgICBodHRwczovL21jcC5wYXRoMmFpLnRlY2gvaGVhbHRoXCIpKTtcbiAgY29uc29sZS5sb2coKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE1haW4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbnByb2dyYW1cbiAgLm5hbWUoXCJwYXRoLXRlcm1pbmFsLWluaXRcIilcbiAgLmRlc2NyaXB0aW9uKFxuICAgIFwiU2V0IHVwIHRoZSBQYXRoIFRlcm1pbmFsIFNESyBpbnRlZ3JhdGlvbiBhc3Npc3RhbnQgZm9yIHlvdXIgRVBPUyBwcm9qZWN0LlxcblwiICtcbiAgICAgIFwiQXV0by1kZXRlY3RzIHBsYXRmb3JtIChpT1MsIEFuZHJvaWQsIG9yIFdpbmRvd3MpIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxcblwiICtcbiAgICAgIFwiQ29uZmlndXJlcyBNQ1Agc2VydmVyIGFjY2VzcywgZHJvcHMgdGhlIGludGVncmF0aW9uIHJlY2lwZSwgYW5kIG9wdGlvbmFsbHlcXG5cIiArXG4gICAgICBcImFkZHMgdGhlIFNESyBkZXBlbmRlbmN5LlxcblxcblwiICtcbiAgICAgIFwiU3VwcG9ydGVkIGFnZW50czogY2xhdWRlIChkZWZhdWx0KSwgY3Vyc29yXFxuXCIgK1xuICAgICAgXCJTdXBwb3J0ZWQgcGxhdGZvcm1zOiBpb3MgKGRlZmF1bHQpLCBhbmRyb2lkLCB3aW5kb3dzMTEgKFdpblVJIDMgLyAuTkVUIDEwKSxcXG5cIiArXG4gICAgICBcIndpbmRvd3MxMCAoV1BGIC8gLk5FVCBGVyA0LjgpLiBVc2UgJ3dpbmRvd3MnIHRvIGF1dG8tcGljayB0aGUgV2luZG93cyBmbGF2b3VyLlwiXG4gIClcbiAgLnZlcnNpb24oXCIwLjIuMFwiKVxuICAub3B0aW9uKFwiLS10b29scy1vbmx5XCIsIFwiT25seSBjb25maWd1cmUgTUNQICsgcnVsZXMuIFNraXAgU0RLIGluc3RhbGxhdGlvbi5cIilcbiAgLm9wdGlvbihcIi0tYWdlbnQgPG5hbWU+XCIsIFwiQUkgYWdlbnQgdG8gY29uZmlndXJlOiAnY2xhdWRlJyAoZGVmYXVsdCkgb3IgJ2N1cnNvcicuXCIsIFwiY2xhdWRlXCIpXG4gIC5vcHRpb24oXCItLXBsYXRmb3JtIDxuYW1lPlwiLCBcIlBsYXRmb3JtOiBpb3MgfCBhbmRyb2lkIHwgd2luZG93cyB8IHdpbmRvd3MxMSB8IHdpbmRvd3MxMC4gQXV0by1kZXRlY3RlZCBpZiBub3Qgc3BlY2lmaWVkLlwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgdG9vbHNPbmx5OiBib29sZWFuID0gb3B0aW9ucy50b29sc09ubHkgPz8gZmFsc2U7XG4gICAgY29uc3QgYWdlbnQ6IEFnZW50VHlwZSA9IChvcHRpb25zLmFnZW50ID8/IFwiY2xhdWRlXCIpIGFzIEFnZW50VHlwZTtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gQXV0by1kZXRlY3QgcGxhdGZvcm0uIE9yZGVyOiBBbmRyb2lkIChHcmFkbGUpIFx1MjE5MiBXaW5kb3dzICguY3Nwcm9qLy5zbG4pIFx1MjE5MiBpT1MgKGRlZmF1bHQpLlxuICAgIGNvbnN0IHJhd1BsYXRmb3JtOiBzdHJpbmcgPSBvcHRpb25zLnBsYXRmb3JtID8/IFwiYXV0b1wiO1xuICAgIGNvbnN0IFZBTElEX1BMQVRGT1JNUyA9IFtcImlvc1wiLCBcImFuZHJvaWRcIiwgXCJ3aW5kb3dzXCIsIFwid2luZG93czExXCIsIFwid2luZG93czEwXCJdO1xuICAgIGxldCBwbGF0Zm9ybTogUGxhdGZvcm07XG4gICAgaWYgKHJhd1BsYXRmb3JtID09PSBcImF1dG9cIiB8fCAhVkFMSURfUExBVEZPUk1TLmluY2x1ZGVzKHJhd1BsYXRmb3JtKSkge1xuICAgICAgaWYgKGZpbmRBbmRyb2lkUHJvamVjdChjd2QpKSBwbGF0Zm9ybSA9IFwiYW5kcm9pZFwiO1xuICAgICAgZWxzZSBpZiAoZmluZFdpbmRvd3NQcm9qZWN0KGN3ZCkpIHBsYXRmb3JtID0gZGV0ZWN0V2luZG93c0ZsYXZvdXIoY3dkKTtcbiAgICAgIGVsc2UgcGxhdGZvcm0gPSBcImlvc1wiO1xuICAgIH0gZWxzZSBpZiAocmF3UGxhdGZvcm0gPT09IFwid2luZG93c1wiKSB7XG4gICAgICAvLyBFeHBsaWNpdCBXaW5kb3dzLCBidXQgbGV0IHRoZSAuY3Nwcm9qIGRlY2lkZSBXaW4xMSAoV2luVUkgMykgdnMgV2luMTAgKFdQRikuXG4gICAgICBwbGF0Zm9ybSA9IGRldGVjdFdpbmRvd3NGbGF2b3VyKGN3ZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBsYXRmb3JtID0gcmF3UGxhdGZvcm0gYXMgUGxhdGZvcm07XG4gICAgfVxuICAgIGNvbnN0IGlzQW5kcm9pZCA9IHBsYXRmb3JtID09PSBcImFuZHJvaWRcIjtcbiAgICBjb25zdCBpc1dpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTBcIjtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIiAgUGF0aCBUZXJtaW5hbCBTREsgXHUyMDE0IEludGVncmF0aW9uIEFzc2lzdGFudCBTZXR1cFwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBBZ2VudDogICAgJHthZ2VudH1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFBsYXRmb3JtOiAke3BsYXRmb3JtfSR7b3B0aW9ucy5wbGF0Zm9ybSA/IFwiXCIgOiBcIiAoYXV0by1kZXRlY3RlZClcIn1gKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGlmIChhZ2VudCAhPT0gXCJjdXJzb3JcIiAmJiBhZ2VudCAhPT0gXCJjbGF1ZGVcIikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgXHUyNkEwIEFnZW50ICcke2FnZW50fScgaXMgbm90IHN1cHBvcnRlZC4gVXNlICdjdXJzb3InIG9yICdjbGF1ZGUnLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1hbnVhbFN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDEuIFNESyBpbnN0YWxsYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKCF0b29sc09ubHkpIHtcbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIEFuZHJvaWQ6IEppdFBhY2sgKyBHcmFkbGUgXHUyNTAwXHUyNTAwXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBBbmRyb2lkIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgICBpZiAoIWZpbmRBbmRyb2lkUHJvamVjdChjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gQW5kcm9pZCBwcm9qZWN0IGZvdW5kIChzZXR0aW5ncy5ncmFkbGUua3RzIG9yIGFwcC9idWlsZC5ncmFkbGUua3RzIG1pc3NpbmcpLlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXCIgIENvbnRpbnVlIHdpdGggdG9vbHMtb25seSBzZXR1cD8gKHkvbik6IFwiKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcInlcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiXFxuICBSdW4gdGhpcyBmcm9tIHlvdXIgQW5kcm9pZCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LlxcblwiKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhcm5pbmdzLnB1c2goXCJSYW4gaW4gdG9vbHMtb25seSBtb2RlIFx1MjAxNCBubyBBbmRyb2lkIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGN3ZCkpIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoIFRlcm1pbmFsIFNESyBhbHJlYWR5IHByZXNlbnQgaW4gc2V0dGluZ3MuZ3JhZGxlLmt0cy5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLnRleHQgPSBcIkFkZGluZyB0aGUgUGF0aCBNYXZlbiByZXBvc2l0b3J5IHRvIHNldHRpbmdzLmdyYWRsZS5rdHNcdTIwMjZcIjtcbiAgICAgICAgICBjb25zdCBzZXR0aW5nc09rID0gaW5qZWN0UGF0aE1hdmVuUmVwbyhjd2QpO1xuICAgICAgICAgIGNvbnN0IGRlcHNPayA9IGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhjd2QpO1xuXG4gICAgICAgICAgaWYgKHNldHRpbmdzT2spIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGggTWF2ZW4gcmVwb3NpdG9yeSBhZGRlZCB0byBzZXR0aW5ncy5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChgUGF0aCBNYXZlbiByZXBvIGFkZGVkIHRvIHNldHRpbmdzLmdyYWRsZS5rdHMgKCR7UEFUSF9NQVZFTl9VUkx9KWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICBgQWRkIHRoZSBQYXRoIE1hdmVuIHJlcG8gdG8gc2V0dGluZ3MuZ3JhZGxlLmt0cyAoZGVwZW5kZW5jeVJlc29sdXRpb25NYW5hZ2VtZW50IHsgcmVwb3NpdG9yaWVzIHsgXHUyMDI2IH0gfSk6XFxuYCArXG4gICAgICAgICAgICAgIGAgICAgIG1hdmVuIHsgdXJsID0gdXJpKFwiJHtQQVRIX01BVkVOX1VSTH1cIikgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZXBzT2spIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlNESyBkZXBlbmRlbmNpZXMgYWRkZWQgdG8gYXBwL2J1aWxkLmdyYWRsZS5rdHMgKGluY2wuIFZlcmlmb25lKS5cIik7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goYFNESyBkZXBzIGFkZGVkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzOiAke0FORFJPSURfU0RLX01PRFVMRVMuam9pbihcIiwgXCIpfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3QgYXV0by1pbmplY3QgZGVwZW5kZW5jaWVzIGludG8gYXBwL2J1aWxkLmdyYWRsZS5rdHMuXCIpO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCB0byBhcHAvYnVpbGQuZ3JhZGxlLmt0cyBkZXBlbmRlbmNpZXMge306XFxuYCArXG4gICAgICAgICAgICAgIEFORFJPSURfU0RLX01PRFVMRVMubWFwKChtKSA9PiBgICAgICBpbXBsZW1lbnRhdGlvbihcIiR7QU5EUk9JRF9TREtfR1JPVVB9OiR7bX06JHtBTkRST0lEX1NES19WRVJTSU9OfVwiKWApLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzV2luZG93cykge1xuICAgICAgICAvLyBcdTI1MDBcdTI1MDAgV2luZG93czogUGFja2FnZVJlZmVyZW5jZSBmcm9tIHRoZSBQYXRoIE51R2V0IGZlZWQgXHUyNTAwXHUyNTAwXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBXaW5kb3dzICguTkVUKSBwcm9qZWN0XHUyMDI2XCIpLnN0YXJ0KCk7XG4gICAgICAgIGlmICghZmluZFdpbmRvd3NQcm9qZWN0KGN3ZCkpIHtcbiAgICAgICAgICBzcGlubmVyLndhcm4oXCJObyBXaW5kb3dzIHByb2plY3QgZm91bmQgKC5zbG4gb3IgLmNzcHJvaikuXCIpO1xuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFzayhjaGFsay55ZWxsb3coXCIgIENvbnRpbnVlIHdpdGggdG9vbHMtb25seSBzZXR1cD8gKHkvbik6IFwiKSk7XG4gICAgICAgICAgaWYgKGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcInlcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiXFxuICBSdW4gdGhpcyBmcm9tIHlvdXIgV2luZG93cyBFUE9TIHByb2plY3Qgcm9vdC5cXG5cIikpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKFwiUmFuIGluIHRvb2xzLW9ubHkgbW9kZSBcdTIwMTQgbm8gV2luZG93cyBwcm9qZWN0IGZvdW5kLlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYXNXaW5kb3dzU0RLRGVwZW5kZW5jeShjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aCBUZXJtaW5hbCBTREsgYWxyZWFkeSByZWZlcmVuY2VkIGluIHRoZSBwcm9qZWN0LlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJTREsgcmVmZXJlbmNlIGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci50ZXh0ID0gXCJBZGRpbmcgdGhlIFBhdGggTnVHZXQgZmVlZCArIFNESyBwYWNrYWdlc1x1MjAyNlwiO1xuICAgICAgICAgIGNvbnN0IGZlZWRPayA9IGluamVjdFBhdGhOdWdldENvbmZpZyhjd2QpO1xuICAgICAgICAgIGNvbnN0IGNzcHJvaiA9IGluamVjdFdpbmRvd3NQYWNrYWdlUmVmZXJlbmNlcyhjd2QpO1xuXG4gICAgICAgICAgaWYgKGZlZWRPaykge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGBQYXRoIE51R2V0IGZlZWQgYWRkZWQgdG8gbnVnZXQuY29uZmlnICgke1BBVEhfTlVHRVRfVVJMfSlgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCB0aGUgUGF0aCBOdUdldCBmZWVkIHRvIGEgbnVnZXQuY29uZmlnIGJlc2lkZSB5b3VyIHNvbHV0aW9uOlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICA8YWRkIGtleT1cInBhdGhcIiB2YWx1ZT1cIiR7UEFUSF9OVUdFVF9VUkx9XCIgLz5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3Nwcm9qKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIGBTREsgcGFja2FnZXMgYWRkZWQgdG8gJHtwYXRoLnJlbGF0aXZlKGN3ZCwgY3Nwcm9qKX0gKHg2NCk6ICR7V0lORE9XU19TREtfUEFDS0FHRVMuam9pbihcIiwgXCIpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBmaW5kQ3Nwcm9qRmlsZXMoY3dkKTtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlID0gY2FuZGlkYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYE9wZW4gJHtwYXRoLnJlbGF0aXZlKGN3ZCwgY2FuZGlkYXRlc1swXSl9IGluIGEgdGV4dCBlZGl0b3JgXG4gICAgICAgICAgICAgIDogYE5vIC5jc3Byb2ogd2FzIGZvdW5kIHVuZGVyIHRoaXMgZGlyZWN0b3J5IFx1MjAxNCBvcGVuIHlvdXIgYXBwIHByb2plY3QncyAuY3Nwcm9qICh1c3VhbGx5IHNyY1xcXFw8QXBwPlxcXFw8QXBwPi5jc3Byb2opIGluIGEgdGV4dCBlZGl0b3JgO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYCR7d2hlcmV9IGFuZCBwYXN0ZSB0aGlzIGJsb2NrIGp1c3QgYWJvdmUgdGhlIGNsb3NpbmcgPC9Qcm9qZWN0PiBsaW5lOlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICA8SXRlbUdyb3VwPlxcbmAgK1xuICAgICAgICAgICAgICBXSU5ET1dTX1NES19QQUNLQUdFUy5tYXAoKHApID0+IGAgICAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT1cIiR7cH1cIiBWZXJzaW9uPVwiJHtXSU5ET1dTX1NES19WRVJTSU9OfVwiIC8+YCkuam9pbihcIlxcblwiKSArXG4gICAgICAgICAgICAgIGBcXG4gICAgIDwvSXRlbUdyb3VwPlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICBUaGVuIGluc2lkZSB0aGUgZmlyc3QgPFByb3BlcnR5R3JvdXA+IGFkZDogIDxQbGF0Zm9ybVRhcmdldD54NjQ8L1BsYXRmb3JtVGFyZ2V0PlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICAodGhlIFZlcmlmb25lIGJpbmRpbmcgaXMgeDY0IG1peGVkLW1vZGUpLiBTYXZlIHRoZSBmaWxlIFx1MjAxNCBubyBvdGhlciBjaGFuZ2UgaXMgbmVlZGVkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmZWVkT2sgJiYgY3Nwcm9qKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoIE51R2V0IGZlZWQgKyBTREsgcGFja2FnZXMgYWRkZWQgKGluY2wuIFZlcmlmb25lKS5cIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwaW5uZXIud2FybihcIlBhdGggU0RLIHBhcnRseSB3aXJlZCBcdTIwMTQgc2VlIHRoZSBtYW51YWwgc3RlcHMgYmVsb3cuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIGlPUzogU1BNIC8gWGNvZGUgXHUyNTAwXHUyNTAwXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBmb3IgWGNvZGUgcHJvamVjdFx1MjAyNlwiKS5zdGFydCgpO1xuXG4gICAgICAgIGNvbnN0IHhjb2RlUHJvamVjdCA9IGZpbmRYY29kZVByb2plY3QoY3dkKTtcbiAgICAgICAgY29uc3QgcGFja2FnZVN3aWZ0ID0gZmluZFBhY2thZ2VTd2lmdChjd2QpO1xuXG4gICAgICAgIGlmIChwYWNrYWdlU3dpZnQpIHtcbiAgICAgICAgICBzcGlubmVyLnRleHQgPSBcIkZvdW5kIFBhY2thZ2Uuc3dpZnQgXHUyMDE0IGFkZGluZyBQYXRoVGVybWluYWxTREsgZGVwZW5kZW5jeVx1MjAyNlwiO1xuICAgICAgICAgIGlmIChoYXNTREtEZXBlbmRlbmN5KHBhY2thZ2VTd2lmdCkpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGhUZXJtaW5hbFNESyBhbHJlYWR5IHByZXNlbnQgaW4gUGFja2FnZS5zd2lmdC5cIik7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goXCJQYXRoVGVybWluYWxTREsgZGVwZW5kZW5jeSBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZCA9IGluamVjdFNQTURlcGVuZGVuY3kocGFja2FnZVN3aWZ0KTtcbiAgICAgICAgICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWRkZWQgdG8gUGFja2FnZS5zd2lmdC5cIik7XG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaChcIlBhdGhUZXJtaW5hbFNESyBhZGRlZCB0byBQYWNrYWdlLnN3aWZ0XCIpO1xuICAgICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICAgIGBPcGVuIFhjb2RlIGFuZCBsaW5rIGFsbCBmb3VyIHRhcmdldHMgdG8geW91ciBhcHA6IFBhdGhUZXJtaW5hbFNESywgUGF0aEVtdWxhdG9yQWRhcHRlciwgUGF0aENvcmVNb2RlbHMsIFBhdGhWZXJpZm9uZVBTREtBZGFwdGVyLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNwaW5uZXIud2FybihcIkNvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IG1vZGlmeSBQYWNrYWdlLnN3aWZ0IFx1MjAxNCBtYW51YWwgc3RlcCByZXF1aXJlZC5cIik7XG4gICAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgICAgYEFkZCBQYXRoVGVybWluYWxTREsgbWFudWFsbHkgdG8gUGFja2FnZS5zd2lmdDpcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAgICAgIC5wYWNrYWdlKHVybDogXCIke1NES19HSVRIVUJfVVJMfVwiLCBmcm9tOiBcIiR7U0RLX1ZFUlNJT059XCIpYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh4Y29kZVByb2plY3QpIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYEZvdW5kIFhjb2RlIHByb2plY3Q6ICR7cGF0aC5iYXNlbmFtZSh4Y29kZVByb2plY3QpfWApO1xuICAgICAgICAgIGlmIChoYXNYY29kZVByb2plY3RTREtEZXBlbmRlbmN5KHhjb2RlUHJvamVjdCkpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGhUZXJtaW5hbFNESyBhbHJlYWR5IHByZXNlbnQgaW4gWGNvZGUgcHJvamVjdC5cIik7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goXCJQYXRoVGVybWluYWxTREsgZGVwZW5kZW5jeSBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIFwiXFxuICBcdTI2QTAgQXV0b21hdGljIFNQTSBpbmplY3Rpb24gaW50byAueGNvZGVwcm9qIGlzIG5vdCBzdXBwb3J0ZWQgKFhjb2RlIG1hbmFnZXMgdGhpcykuXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcXG4gIFRvIGFkZCBQYXRoVGVybWluYWxTREsgaW4gWGNvZGU6XCIpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiICAxLiBPcGVuIHlvdXIgcHJvamVjdCBpbiBYY29kZVwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiICAyLiBGaWxlIFx1MjE5MiBBZGQgUGFja2FnZSBEZXBlbmRlbmNpZXNcdTIwMjZcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAzLiBFbnRlciBVUkw6ICR7Y2hhbGsuY3lhbihTREtfR0lUSFVCX1VSTCl9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgXCIgIDQuIEluIHRoZSAnQ2hvb3NlIFBhY2thZ2UgUHJvZHVjdHMnIGRpYWxvZywgc2V0IGFsbCBmb3VyIHRvIHlvdXIgYXBwIHRhcmdldDpcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oXCIgICAgICAgUGF0aFRlcm1pbmFsU0RLICAgICAgICBcdTIxOTIgeW91ciBhcHAgdGFyZ2V0XCIpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oXCIgICAgICAgUGF0aEVtdWxhdG9yQWRhcHRlciAgICBcdTIxOTIgeW91ciBhcHAgdGFyZ2V0XCIpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oXCIgICAgICAgUGF0aENvcmVNb2RlbHMgICAgICAgICBcdTIxOTIgeW91ciBhcHAgdGFyZ2V0XCIpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oXCIgICAgICAgUGF0aFZlcmlmb25lUFNES0FkYXB0ZXIgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCIgICAgIChQYXRoVmVyaWZvbmVQU0RLQWRhcHRlciBpcyByZXF1aXJlZCBmb3IgdGhlIFZlcmlmb25lIGJhY2tlbmQ7IFBhdGhEaWFnbm9zdGljcyBjYW4gYmUgbGVmdCBhcyBOb25lKVwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgNS4gQ2xpY2sgQWRkIFBhY2thZ2VcXG5cIik7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBhc2soXG4gICAgICAgICAgICAgIGNoYWxrLmJvbGQoXCIgIFByZXNzIEVudGVyIG9uY2UgeW91IGhhdmUgYWRkZWQgdGhlIHBhY2thZ2UsIG9yIHR5cGUgJ3NraXAnIHRvIGRvIHRoaXMgbGF0ZXI6IFwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb25maXJtZWQudG9Mb3dlckNhc2UoKSAhPT0gXCJza2lwXCIpIHtcbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGBQYXRoVGVybWluYWxTREsgYWRkZWQgdG8gWGNvZGUgcHJvamVjdCAoY29uZmlybWVkIGJ5IHVzZXIpYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICAgIGBBZGQgUGF0aFRlcm1pbmFsU0RLIHZpYSBYY29kZTogRmlsZSBcdTIxOTIgQWRkIFBhY2thZ2UgRGVwZW5kZW5jaWVzIFx1MjE5MiAke1NES19HSVRIVUJfVVJMfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gWGNvZGUgcHJvamVjdCBmb3VuZCBpbiBjdXJyZW50IGRpcmVjdG9yeS5cIik7XG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgYXNrKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBcIiAgTm8gLnhjb2RlcHJvaiBvciBQYWNrYWdlLnN3aWZ0IGZvdW5kLiBDb250aW51ZSB3aXRoIHRvb2xzLW9ubHkgc2V0dXA/ICh5L24pOiBcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcInlcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmRpbShcIlxcbiAgUnVuIHRoaXMgY29tbWFuZCBmcm9tIHlvdXIgWGNvZGUgcHJvamVjdCBkaXJlY3RvcnksIG9yIHVzZSAtLXRvb2xzLW9ubHkuXFxuXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKFwiUmFuIGluIHRvb2xzLW9ubHkgbW9kZSBcdTIwMTQgbm8gWGNvZGUgcHJvamVjdCBmb3VuZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aW9ucy5wdXNoKFwiU2tpcHBlZCBTREsgaW5zdGFsbGF0aW9uICgtLXRvb2xzLW9ubHkgbW9kZSlcIik7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDIuIE1DUCBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIldyaXRpbmcgTUNQIHNlcnZlciBjb25maWdcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgbGV0IHJlc3VsdDogeyB3cml0dGVuOiBib29sZWFuOyBtZXJnZWQ6IGJvb2xlYW4gfTtcbiAgICAgIGxldCBjb25maWdGaWxlOiBzdHJpbmc7XG5cbiAgICAgIGlmIChhZ2VudCA9PT0gXCJjbGF1ZGVcIikge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUNsYXVkZU1jcENvbmZpZyhjd2QpO1xuICAgICAgICBjb25maWdGaWxlID0gXCIubWNwLmpzb25cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHdyaXRlQ3Vyc29yTWNwQ29uZmlnKGN3ZCk7XG4gICAgICAgIGNvbmZpZ0ZpbGUgPSBcIi5jdXJzb3IvbWNwLmpzb25cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC53cml0dGVuICYmIHJlc3VsdC5tZXJnZWQpIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGBNQ1AgY29uZmlnIG1lcmdlZCBpbnRvIGV4aXN0aW5nICR7Y29uZmlnRmlsZX0uYCk7XG4gICAgICAgIGFjdGlvbnMucHVzaChgcGF0aC10ZXJtaW5hbCBlbnRyeSBtZXJnZWQgaW50byAke2NvbmZpZ0ZpbGV9YCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC53cml0dGVuKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgTUNQIGNvbmZpZyB3cml0dGVuIHRvICR7Y29uZmlnRmlsZX0uYCk7XG4gICAgICAgIGFjdGlvbnMucHVzaChgTUNQIHNlcnZlciBjb25maWd1cmVkOiAke2NvbmZpZ0ZpbGV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGlubmVyLmluZm8oXCJNQ1AgY29uZmlnIGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgIGFjdGlvbnMucHVzaChcIk1DUCBjb25maWcgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIENsYXVkZSBDb2RlLCBhbHNvIHByZS1hcHByb3ZlIHRoZSBNQ1Agc2VydmVyIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbi5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgQ2xhdWRlIENvZGUgc2hvd3MgYW4gaW50ZXJhY3RpdmUgXCJBbGxvdyB0aGlzIE1DUCBzZXJ2ZXI/XCJcbiAgICAgIC8vIHByb21wdCBvbiBmaXJzdCBsYXVuY2ggXHUyMDE0IGVhc3kgdG8gbWlzcywgYW5kIHRoZSBhZ2VudCBlbmRzIHVwIHJ1bm5pbmdcbiAgICAgIC8vIHdpdGhvdXQgTUNQIHRvb2xzIGlmIHRoZSB1c2VyIGRpc21pc3NlcyBpdC5cbiAgICAgIGlmIChhZ2VudCA9PT0gXCJjbGF1ZGVcIikge1xuICAgICAgICBjb25zdCBhcHByb3ZlU3Bpbm5lciA9IG9yYShcIlByZS1hcHByb3ZpbmcgUGF0aCBNQ1Agc2VydmVyIGZvciBDbGF1ZGUgQ29kZVx1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBjb25zdCBhcHByb3ZlID0gd3JpdGVDbGF1ZGVTZXR0aW5ncyhjd2QpO1xuICAgICAgICBpZiAoYXBwcm92ZS5hbHJlYWR5QXBwcm92ZWQpIHtcbiAgICAgICAgICBhcHByb3ZlU3Bpbm5lci5pbmZvKFwiUGF0aCBNQ1Agc2VydmVyIGFscmVhZHkgcHJlLWFwcHJvdmVkIFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLndyaXR0ZW4gJiYgYXBwcm92ZS5tZXJnZWQpIHtcbiAgICAgICAgICBhcHByb3ZlU3Bpbm5lci5zdWNjZWVkKFwicGF0aC10ZXJtaW5hbCBhZGRlZCB0byBleGlzdGluZyAuY2xhdWRlL3NldHRpbmdzLmpzb24uXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcInBhdGgtdGVybWluYWwgcHJlLWFwcHJvdmVkIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvblwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLndyaXR0ZW4pIHtcbiAgICAgICAgICBhcHByb3ZlU3Bpbm5lci5zdWNjZWVkKFwiUHJlLWFwcHJvdmFsIHdyaXR0ZW4gdG8gLmNsYXVkZS9zZXR0aW5ncy5qc29uLlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJDbGF1ZGUgQ29kZSBwcmUtYXBwcm92YWw6IC5jbGF1ZGUvc2V0dGluZ3MuanNvblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcHByb3ZlU3Bpbm5lci53YXJuKFwiQ291bGQgbm90IHdyaXRlIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiBcdTIwMTQgeW91IG1heSBzZWUgYW4gXFxcIkFsbG93IE1DUCBzZXJ2ZXI/XFxcIiBwcm9tcHQgb24gZmlyc3QgQ2xhdWRlIENvZGUgbGF1bmNoLiBBY2NlcHQgaXQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDMuIFJ1bGVzIGZpbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShgV3JpdGluZyAke2FnZW50ID09PSBcImNsYXVkZVwiID8gXCJDTEFVREUubWRcIiA6IFwiQ3Vyc29yIHJ1bGVzXCJ9IGZpbGVcdTIwMjZgKS5zdGFydCgpO1xuXG4gICAgICBsZXQgcmVzdWx0OiB7IHdyaXR0ZW46IGJvb2xlYW47IHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgICAgIGxldCBydWxlc0ZpbGU6IHN0cmluZztcblxuICAgICAgLy8gUGVyLXBsYXRmb3JtIHJlY2lwZSBzb3VyY2UgKyBmZXRjaCBVUkwgKyBmaWxlbmFtZS5cbiAgICAgIGNvbnN0IHJ1bGVzQnlQbGF0Zm9ybSA9IHtcbiAgICAgICAgaW9zOiAgICAgICB7IHNyYzogUlVMRVNfU09VUkNFLCAgICAgICAgICB1cmw6IFJVTEVTX0ZFVENIX1VSTCwgICAgICAgICAgZmlsZTogXCJwYXRoLWludGVncmF0aW9uLm1kY1wiIH0sXG4gICAgICAgIGFuZHJvaWQ6ICAgeyBzcmM6IEFORFJPSURfUlVMRVNfU09VUkNFLCAgIHVybDogQU5EUk9JRF9SVUxFU19GRVRDSF9VUkwsICAgZmlsZTogXCJwYXRoLWludGVncmF0aW9uLWFuZHJvaWQubWRjXCIgfSxcbiAgICAgICAgd2luZG93czExOiB7IHNyYzogV0lORE9XUzExX1JVTEVTX1NPVVJDRSwgdXJsOiBXSU5ET1dTMTFfUlVMRVNfRkVUQ0hfVVJMLCBmaWxlOiBcInBhdGgtaW50ZWdyYXRpb24td2luZG93czExLm1kY1wiIH0sXG4gICAgICAgIHdpbmRvd3MxMDogeyBzcmM6IFdJTkRPV1MxMF9SVUxFU19TT1VSQ0UsIHVybDogV0lORE9XUzEwX1JVTEVTX0ZFVENIX1VSTCwgZmlsZTogXCJwYXRoLWludGVncmF0aW9uLXdpbmRvd3MxMC5tZGNcIiB9LFxuICAgICAgfSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IGFjdGl2ZVJ1bGVzID0gcnVsZXNCeVBsYXRmb3JtW3BsYXRmb3JtXTtcbiAgICAgIGNvbnN0IGFjdGl2ZUZldGNoVXJsID0gYWN0aXZlUnVsZXMudXJsO1xuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgcmVzdWx0ID0gd3JpdGVDbGF1ZGVSdWxlc0ZpbGUoY3dkLCBhY3RpdmVSdWxlcy5zcmMsIGFjdGl2ZUZldGNoVXJsKTtcbiAgICAgICAgcnVsZXNGaWxlID0gXCJDTEFVREUubWRcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHdyaXRlQ3Vyc29yUnVsZXNGaWxlKGN3ZCwgYWN0aXZlUnVsZXMuc3JjLCBhY3RpdmVSdWxlcy5maWxlLCBhY3RpdmVGZXRjaFVybCk7XG4gICAgICAgIHJ1bGVzRmlsZSA9IGAuY3Vyc29yL3J1bGVzLyR7YWN0aXZlUnVsZXMuZmlsZX1gO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LndyaXR0ZW4pIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGBSdWxlcyBmaWxlIHdyaXR0ZW4gdG8gJHtydWxlc0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYEludGVncmF0aW9uIHJ1bGVzIGZpbGU6ICR7cnVsZXNGaWxlfWApO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc2tpcHBlZCkge1xuICAgICAgICBzcGlubmVyLmluZm8oXG4gICAgICAgICAgYCR7cnVsZXNGaWxlfSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgc2tpcHBlZCB0byBwcmVzZXJ2ZSB5b3VyIGN1c3RvbWlzYXRpb25zLmBcbiAgICAgICAgKTtcbiAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICBgJHtydWxlc0ZpbGV9IGFscmVhZHkgZXhpc3RzIFx1MjAxNCBub3Qgb3ZlcndyaXR0ZW4uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci53YXJuKFwiQ291bGQgbm90IHdyaXRlIHJ1bGVzIGZpbGUgXHUyMDE0IGNoZWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5LlwiKTtcbiAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICBgRG93bmxvYWQgJHthY3RpdmVSdWxlcy5maWxlfSBtYW51YWxseSBmcm9tOiAke2FjdGl2ZUZldGNoVXJsfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgNC4gUGVybWlzc2lvbiBjaGVjayBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAoIXRvb2xzT25seSkge1xuICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgQW5kcm9pZE1hbmlmZXN0LnhtbCBCTEUgcGVybWlzc2lvbnNcdTIwMjZcIikuc3RhcnQoKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RzV2l0aElzc3VlcyA9IGNoZWNrQW5kcm9pZE1hbmlmZXN0KGN3ZCk7XG4gICAgICAgIGlmIChtYW5pZmVzdHNXaXRoSXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIkJMRSBwZXJtaXNzaW9ucyBmb3VuZCBpbiBBbmRyb2lkTWFuaWZlc3QueG1sLlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJCTEUgcGVybWlzc2lvbnMgdmVyaWZpZWQgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLndhcm4oXG4gICAgICAgICAgICBgQkxVRVRPT1RIX1NDQU4gbWlzc2luZyBmcm9tICR7bWFuaWZlc3RzV2l0aElzc3Vlcy5sZW5ndGh9IEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZShzKS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtYW5pZmVzdHNXaXRoSXNzdWVzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShjd2QsIHApO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCBCTEUgcGVybWlzc2lvbnMgdG8gJHtyZWxhdGl2ZX06XFxuYCArXG4gICAgICAgICAgICAgIGAgICAgIChBc2sgdGhlIE1DUDogXCJnZXRfbWFuaWZlc3RfcmVxdWlyZW1lbnRzXCIgZm9yIHRoZSBmdWxsIFhNTClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzV2luZG93cykge1xuICAgICAgICAvLyBXaW5kb3dzIHJlYWNoZXMgQkxFIHZpYSBXaW5SVCBcdTIwMTQgbm8gbWFuaWZlc3QgY2FwYWJpbGl0eSB0byBhZGQgKHVucGFja2FnZWRcbiAgICAgICAgLy8gV2luVUkgMyAvIFdQRikuIFRoZSBXaS1GaS9JUCBhbmQgVmVyaWZvbmUgYmFja2VuZHMgdXNlIG5vIEJsdWV0b290aCBhdCBhbGwuXG4gICAgICAgIGFjdGlvbnMucHVzaChcIkJsdWV0b290aCBuZWVkcyBubyBtYW5pZmVzdCBlbnRyeSBvbiBXaW5kb3dzIChXaW5SVCkuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIEluZm8ucGxpc3QgQkxFIHBlcm1pc3Npb25zXHUyMDI2XCIpLnN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IHBsaXN0c1dpdGhJc3N1ZXMgPSBjaGVja0luZm9QbGlzdChjd2QpO1xuICAgICAgICBpZiAocGxpc3RzV2l0aElzc3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJCTEUgcGVybWlzc2lvbnMgZm91bmQgaW4gSW5mby5wbGlzdC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQkxFIHBlcm1pc3Npb25zIHZlcmlmaWVkIGluIEluZm8ucGxpc3RcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFxuICAgICAgICAgICAgYE5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvbiBtaXNzaW5nIGZyb20gJHtwbGlzdHNXaXRoSXNzdWVzLmxlbmd0aH0gSW5mby5wbGlzdCBmaWxlKHMpLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHBsaXN0c1dpdGhJc3N1ZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKGN3ZCwgcCk7XG4gICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICBgQWRkIEJMRSBwZXJtaXNzaW9uIHRvICR7cmVsYXRpdmV9OlxcbmAgK1xuICAgICAgICAgICAgICAgIGAgICAgIDxrZXk+TlNCbHVldG9vdGhBbHdheXNVc2FnZURlc2NyaXB0aW9uPC9rZXk+XFxuYCArXG4gICAgICAgICAgICAgICAgYCAgICAgPHN0cmluZz5UaGlzIGFwcCBjb25uZWN0cyB0byBhIFBhdGggcGF5bWVudCB0ZXJtaW5hbCB2aWEgQmx1ZXRvb3RoLjwvc3RyaW5nPlxcbmAgK1xuICAgICAgICAgICAgICAgIGAgICAgIChBc2sgdGhlIE1DUDogXCJnZXRfaW5mb19wbGlzdF9yZXF1aXJlbWVudHNcIiBmb3IgdGhlIGZ1bGwgWE1MKWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgNS4gU3VtbWFyeSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBhd2FpdCBwcmludFN1bW1hcnkoYWdlbnQsIHBsYXRmb3JtLCBhY3Rpb25zLCB3YXJuaW5ncywgbWFudWFsU3RlcHMpO1xuICB9KTtcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsdUJBQXdCO0FBQ3hCLG1CQUFrQjtBQUNsQixTQUFvQjtBQUNwQixXQUFzQjtBQUN0QixlQUEwQjtBQUMxQiwyQkFBeUI7QUFDekIsaUJBQWdCO0FBSWhCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sY0FBYztBQUdwQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHNCQUFzQixDQUFDLG9CQUFvQixx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
package/dist/init.js CHANGED
@@ -6115,7 +6115,7 @@ var SDK_GITHUB_URL = "https://github.com/keyman12/Path-terminal-sdk-IOS-Release"
6115
6115
  var SDK_VERSION = "1.5.0";
6116
6116
  var PATH_MAVEN_URL = "https://mcp.path2ai.tech/maven";
6117
6117
  var ANDROID_SDK_GROUP = "tech.path2ai.sdk";
6118
- var ANDROID_SDK_VERSION = "1.6.0";
6118
+ var ANDROID_SDK_VERSION = "1.8.0";
6119
6119
  var ANDROID_SDK_MODULES = ["path-core-models", "path-terminal-sdk", "path-emulator-adapter", "path-psdk-adapter"];
6120
6120
  var MCP_SERVER_URL = "https://mcp.path2ai.tech/sse";
6121
6121
  var RULES_FETCH_URL = "https://mcp.path2ai.tech/rules";
@@ -6417,7 +6417,7 @@ function checkAndroidManifest(dir) {
6417
6417
  function findCsprojFiles(dir) {
6418
6418
  const found = [];
6419
6419
  const walk = (d, depth) => {
6420
- if (depth > 1) return;
6420
+ if (depth > 3) return;
6421
6421
  let entries = [];
6422
6422
  try {
6423
6423
  entries = fs.readdirSync(d);
@@ -6425,7 +6425,7 @@ function findCsprojFiles(dir) {
6425
6425
  return;
6426
6426
  }
6427
6427
  for (const e of entries) {
6428
- if (e.startsWith(".") || e === "bin" || e === "obj") continue;
6428
+ if (e.startsWith(".") || e === "bin" || e === "obj" || e === "node_modules" || e === "packages") continue;
6429
6429
  const full = path.join(d, e);
6430
6430
  try {
6431
6431
  const st = fs.statSync(full);
@@ -6514,6 +6514,31 @@ ${refs}
6514
6514
  fs.writeFileSync(target, content, "utf-8");
6515
6515
  return target;
6516
6516
  }
6517
+ function hasClaudeCli() {
6518
+ try {
6519
+ (0, import_child_process.execSync)(process.platform === "win32" ? "where claude" : "which claude", { stdio: "ignore" });
6520
+ return true;
6521
+ } catch {
6522
+ return false;
6523
+ }
6524
+ }
6525
+ function findClaudeBinary() {
6526
+ const home = process.env.USERPROFILE || process.env.HOME || "";
6527
+ if (!home) return null;
6528
+ const candidate = process.platform === "win32" ? path.join(home, ".local", "bin", "claude.exe") : path.join(home, ".local", "bin", "claude");
6529
+ return fs.existsSync(candidate) ? candidate : null;
6530
+ }
6531
+ function addClaudeDirToUserPath() {
6532
+ try {
6533
+ (0, import_child_process.execSync)(
6534
+ `powershell -NoProfile -Command "$u=[Environment]::GetEnvironmentVariable('Path','User'); if ($u -notlike '*\\.local\\bin*') { [Environment]::SetEnvironmentVariable('Path', ($u.TrimEnd(';') + ';' + $env:USERPROFILE + '\\.local\\bin'), 'User') }"`,
6535
+ { stdio: "ignore" }
6536
+ );
6537
+ return true;
6538
+ } catch {
6539
+ return false;
6540
+ }
6541
+ }
6517
6542
  function platformLabel(platform) {
6518
6543
  switch (platform) {
6519
6544
  case "android":
@@ -6526,7 +6551,7 @@ function platformLabel(platform) {
6526
6551
  return "iOS";
6527
6552
  }
6528
6553
  }
6529
- function printSummary(agent, platform, actions, warnings, manualSteps) {
6554
+ async function printSummary(agent, platform, actions, warnings, manualSteps) {
6530
6555
  const isAndroid = platform === "android";
6531
6556
  const isWindows = platform === "windows11" || platform === "windows10";
6532
6557
  console.log("\n" + source_default.bold("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
@@ -6550,6 +6575,38 @@ function printSummary(agent, platform, actions, warnings, manualSteps) {
6550
6575
  const mcpPrompt = platform === "android" ? "integrate-path-android" : platform === "windows11" ? "integrate-path-windows11" : platform === "windows10" ? "integrate-path-windows10" : "integrate-path-sale";
6551
6576
  const firstPrompt = ' "Integrate the Path Terminal SDK into this EPOS app. Read CLAUDE.md\n for the integration rules, then use the Path MCP ' + mcpPrompt + '\n prompt to add a Path POS Adapter in Settings \u2014 a backend switcher for the\n Path POS Emulator (Wi-Fi/IP or Bluetooth) and a real Verifone terminal."';
6552
6577
  if (agent === "claude") {
6578
+ if (!hasClaudeCli()) {
6579
+ const binary = findClaudeBinary();
6580
+ if (binary) {
6581
+ console.log(source_default.yellow(`\u26A0 Claude Code is installed (${binary}) but its folder is not on your PATH,`));
6582
+ console.log(source_default.yellow(" so the `claude` command won't work."));
6583
+ if (process.platform === "win32") {
6584
+ const fix = (await ask(source_default.bold(" Add it to your user PATH now? (y/n): "))).toLowerCase();
6585
+ if (fix === "y" && addClaudeDirToUserPath()) {
6586
+ console.log(source_default.green(" \u2713 Added to your user PATH."));
6587
+ } else {
6588
+ console.log(source_default.yellow(" To fix it yourself, run this in PowerShell:"));
6589
+ console.log(source_default.cyan(" [Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path','User') + ';' + $env:USERPROFILE + '\\.local\\bin', 'User')"));
6590
+ }
6591
+ } else {
6592
+ console.log(source_default.yellow(" Add it to your shell profile (~/.zshrc or ~/.bashrc):"));
6593
+ console.log(source_default.cyan(` echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc`));
6594
+ }
6595
+ console.log(source_default.yellow(" \u2026then open a NEW terminal (PATH changes don't reach this one) and come back here."));
6596
+ console.log();
6597
+ } else {
6598
+ console.log(source_default.yellow("\u26A0 Claude Code is not installed (the `claude` command was not found)."));
6599
+ console.log(source_default.yellow(" Install it first:"));
6600
+ if (process.platform === "win32") {
6601
+ console.log(source_default.cyan(" irm https://claude.ai/install.ps1 | iex") + source_default.dim(" (PowerShell)"));
6602
+ console.log(source_default.cyan(" curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd") + source_default.dim(" (CMD)"));
6603
+ } else {
6604
+ console.log(source_default.cyan(" curl -fsSL https://claude.ai/install.sh | bash"));
6605
+ }
6606
+ console.log(source_default.yellow(" \u2026then restart your terminal, run `claude` once to log in, and come back here."));
6607
+ console.log();
6608
+ }
6609
+ }
6553
6610
  console.log(source_default.bold("\u{1F680} Start Claude Code in this directory:"));
6554
6611
  console.log(source_default.cyan(" claude --model sonnet"));
6555
6612
  console.log();
@@ -6668,13 +6725,18 @@ program.name("path-terminal-init").description(
6668
6725
  }
6669
6726
  if (csproj) {
6670
6727
  actions.push(
6671
- `SDK packages added to ${path.basename(csproj)} (x64): ${WINDOWS_SDK_PACKAGES.join(", ")}`
6728
+ `SDK packages added to ${path.relative(cwd, csproj)} (x64): ${WINDOWS_SDK_PACKAGES.join(", ")}`
6672
6729
  );
6673
6730
  } else {
6731
+ const candidates = findCsprojFiles(cwd);
6732
+ const where = candidates.length > 0 ? `Open ${path.relative(cwd, candidates[0])} in a text editor` : `No .csproj was found under this directory \u2014 open your app project's .csproj (usually src\\<App>\\<App>.csproj) in a text editor`;
6674
6733
  manualSteps.push(
6675
- `Add the Path SDK PackageReferences to your .csproj (versions ${WINDOWS_SDK_VERSION}):
6676
- ` + WINDOWS_SDK_PACKAGES.map((p) => ` <PackageReference Include="${p}" Version="${WINDOWS_SDK_VERSION}" />`).join("\n") + `
6677
- \u2026and set <PlatformTarget>x64</PlatformTarget> (the Verifone binding is x64 mixed-mode).`
6734
+ `${where} and paste this block just above the closing </Project> line:
6735
+ <ItemGroup>
6736
+ ` + WINDOWS_SDK_PACKAGES.map((p) => ` <PackageReference Include="${p}" Version="${WINDOWS_SDK_VERSION}" />`).join("\n") + `
6737
+ </ItemGroup>
6738
+ Then inside the first <PropertyGroup> add: <PlatformTarget>x64</PlatformTarget>
6739
+ (the Verifone binding is x64 mixed-mode). Save the file \u2014 no other change is needed.`
6678
6740
  );
6679
6741
  }
6680
6742
  if (feedOk && csproj) {
@@ -6878,6 +6940,6 @@ program.name("path-terminal-init").description(
6878
6940
  }
6879
6941
  }
6880
6942
  }
6881
- printSummary(agent, platform, actions, warnings, manualSteps);
6943
+ await printSummary(agent, platform, actions, warnings, manualSteps);
6882
6944
  });
6883
6945
  program.parse(process.argv);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "path-terminal-init",
3
- "version": "0.2.11",
4
- "description": "One-line setup for the Path Terminal SDK integration assistant connects the user's AI agent to the Path MCP server and installs the per-OS integration recipe (iOS, Android, Windows). The single source of truth for the bootstrap CLI and the recipes.",
3
+ "version": "0.2.15",
4
+ "description": "One-line setup for the Path Terminal SDK integration assistant \u2014 connects the user's AI agent to the Path MCP server and installs the per-OS integration recipe (iOS, Android, Windows). The single source of truth for the bootstrap CLI and the recipes.",
5
5
  "bin": {
6
6
  "path-terminal-init": "dist/cli.js"
7
7
  },
@@ -385,6 +385,17 @@ Frame a missing build toolchain as **"here's how to verify"**, never as a failur
385
385
  - Call blocking I/O from the main thread — all SDK calls are suspend functions
386
386
  - Wrap `terminal.sale()` in a timeout shorter than 30 seconds
387
387
 
388
+ **PRE-AUTH (tabs / deposits, SDK 1.8.0+):**
389
+ - Persist `result.linkToken` with the order/tab record after `preAuth` (unbounded
390
+ text — real tokens exceed 255 chars; null on emulator/mock). Sync it with the
391
+ record: it is what lets a DIFFERENT till settle the hold.
392
+ - Before a follow-on for a hold taken on another device, call
393
+ `terminal.importTransactionLink(originalTransactionId, linkToken)`.
394
+ - An adjust re-issues the token — re-store `result.linkToken ?: storedToken`.
395
+ - A timed-out follow-on throws `PathErrorCode.TIMEOUT_UNCONFIRMED`: the host MAY
396
+ still have honoured it. Branch on the code (never the message) and tell staff
397
+ to reconcile before retrying — a blind retry can charge the card twice.
398
+
388
399
  **AMOUNTS:** Minor currency units (pence/cents) only as integers.
389
400
  - `100` = £1.00 GBP · `1250` = £12.50 GBP · Never pass decimals.
390
401
 
@@ -142,7 +142,8 @@ demo uses an `AppSettings` class writing JSON to
142
142
  `%LOCALAPPDATA%\<App>\settings.json` via a DTO). Store: `Backend`, `EmulatorHost`,
143
143
  `VerifoneHost`, `LoginUsername`, `LoginPassword`, `LoginShift`, `RefundPassword` — with
144
144
  test defaults (`VerifoneHost` "192.168.1.88", username "user", password "password123",
145
- shift "shift123") so a fresh clone connects without typing.
145
+ shift "shift123", refund password EMPTY test estates accept empty, matching the SDK and
146
+ Android defaults) so a fresh clone connects without typing.
146
147
 
147
148
  #### Step 2a — Emulator (Wi-Fi, the default) and Verifone — IP entry
148
149
 
@@ -190,7 +191,8 @@ Confirm the transaction methods map correctly:
190
191
  - Call `get_code_example` operation='refund' — pass `originalTransactionId` from the sale result.
191
192
  - Call `get_code_example` operation='void' — full reversal; success state is `Reversed`.
192
193
  - Amounts are **minor units** (`420` = £4.20). Never pass decimals.
193
- - Catch `PathException` and check whether it is recoverable before retrying.
194
+ - Catch `PathError` the SDK's exception type (there is NO `PathException`) — and check
195
+ its `.Recoverable` before retrying; `.Code` is the canonical error code.
194
196
  - SDK calls are async (`Task`). From WPF event handlers use `async`/`await`; never block
195
197
  the UI thread with `.Result` / `.Wait()`.
196
198
 
@@ -270,6 +272,8 @@ Frame a missing build toolchain as **"here's how to verify"**, never as a failur
270
272
  - For **refunds** the success state is the refunded/approved state, and for **voids** it is `Reversed` — not the sale's `Approved`
271
273
  - Dispose the old `PathTerminal` before building a new one on a backend change (the demo's
272
274
  `TerminalService` disposes synchronously — do the same; do not rely on `await using` on net48)
275
+ - Consume `Events` with `await foreach` on a background task — it is an
276
+ `IAsyncEnumerable<PathTerminalEvent>` (nested event records), NOT a C# event; there is no `+=`
273
277
  - Marshal UI updates from `Events` onto the WPF UI thread (`Application.Current.Dispatcher`)
274
278
 
275
279
  **NEVER:**
@@ -140,7 +140,8 @@ demo uses a small `AppSettings` class writing JSON to
140
140
  `%LOCALAPPDATA%\<App>\app.json`). Store: `Backend`, `EmulatorHost`, `VerifoneHost`,
141
141
  `LoginUsername`, `LoginPassword`, `LoginShift`, `RefundPassword` — with test defaults
142
142
  (`VerifoneHost` "192.168.1.88", username "user", password "password123", shift
143
- "shift123") so a fresh clone connects without typing.
143
+ "shift123", refund password EMPTY test estates accept empty, matching the SDK and
144
+ Android defaults) so a fresh clone connects without typing.
144
145
 
145
146
  #### Step 2a — Emulator (Wi-Fi, the default) and Verifone — IP entry
146
147
 
@@ -188,7 +189,8 @@ Confirm the transaction methods map correctly:
188
189
  - Call `get_code_example` operation='refund' — pass `originalTransactionId` from the sale result.
189
190
  - Call `get_code_example` operation='void' — full reversal; success state is `Reversed`.
190
191
  - Amounts are **minor units** (`420` = £4.20). Never pass decimals.
191
- - Catch `PathException` and check whether it is recoverable before retrying.
192
+ - Catch `PathError` the SDK's exception type (there is NO `PathException`) — and check
193
+ its `.Recoverable` before retrying; `.Code` is the canonical error code.
192
194
 
193
195
  ---
194
196
 
@@ -265,6 +267,8 @@ Frame a missing build toolchain as **"here's how to verify"**, never as a failur
265
267
  - Use `RequestEnvelope.Create(...)` — never build envelopes by hand
266
268
  - For **refunds** the success state is the refunded/approved state, and for **voids** it is `Reversed` — not the sale's `Approved`
267
269
  - Dispose the old `PathTerminal` before building a new one on a backend change
270
+ - Consume `Events` with `await foreach` on a background task — it is an
271
+ `IAsyncEnumerable<PathTerminalEvent>` (nested event records), NOT a C# event; there is no `+=`
268
272
  - Marshal UI updates from `Events` onto the WinUI UI thread (`DispatcherQueue.TryEnqueue`)
269
273
 
270
274
  **NEVER:**