path-terminal-init 0.2.8 → 0.2.11
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/README.md +13 -0
- package/dist/cli.js +4 -4
- package/dist/init.js +3 -3
- package/package.json +1 -1
- package/rules/android/path-integration-android.mdc +76 -10
- package/rules/ios/path-integration.mdc +3 -2
- package/rules/windows-10/path-integration-windows10.mdc +31 -0
- package/rules/windows-11/path-integration-windows11.mdc +31 -0
package/README.md
CHANGED
|
@@ -37,6 +37,19 @@ Works on macOS, Linux and Windows (PowerShell or CMD). Needs Node installed. It
|
|
|
37
37
|
auto-detects iOS / Android / Windows 11 (WinUI 3) / Windows 10 (WPF). Add `--agent cursor`
|
|
38
38
|
for Cursor (default is Claude Code).
|
|
39
39
|
|
|
40
|
+
> **Windows PowerShell:** on a fresh box plain `npx` fails with *"npx.ps1 cannot be loaded
|
|
41
|
+
> because running scripts is disabled on this system"* — that's PowerShell's default
|
|
42
|
+
> execution policy blocking Node's `.ps1` shim, not an install problem. Run the `.cmd`
|
|
43
|
+
> shim instead (works under any policy, no admin, no config change):
|
|
44
|
+
>
|
|
45
|
+
> ```powershell
|
|
46
|
+
> npx.cmd path-terminal-init
|
|
47
|
+
> ```
|
|
48
|
+
>
|
|
49
|
+
> Or fix it once with `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`, after which
|
|
50
|
+
> plain `npx` works. CMD is unaffected, and the no-npm alternative below runs `node.exe`
|
|
51
|
+
> directly so it never hits the policy at all.
|
|
52
|
+
|
|
40
53
|
**Alternative — fetch from the help server (no npm):**
|
|
41
54
|
```bash
|
|
42
55
|
# macOS / Linux:
|
package/dist/cli.js
CHANGED
|
@@ -29,12 +29,12 @@ var path = __toESM(require("path"));
|
|
|
29
29
|
var readline = __toESM(require("readline"));
|
|
30
30
|
var import_child_process = require("child_process");
|
|
31
31
|
var import_ora = __toESM(require("ora"));
|
|
32
|
-
const SDK_GITHUB_URL = "https://github.com/keyman12/
|
|
32
|
+
const SDK_GITHUB_URL = "https://github.com/keyman12/Path-terminal-sdk-IOS-Release";
|
|
33
33
|
const ANDROID_SDK_GITHUB_URL = "https://github.com/keyman12/path-terminal-sdk-android";
|
|
34
|
-
const SDK_VERSION = "
|
|
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.
|
|
37
|
+
const ANDROID_SDK_VERSION = "1.6.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";
|
|
@@ -801,4 +801,4 @@ import_commander.program.name("path-terminal-init").description(
|
|
|
801
801
|
printSummary(agent, platform, actions, warnings, manualSteps);
|
|
802
802
|
});
|
|
803
803
|
import_commander.program.parse(process.argv);
|
|
804
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwicmVhZGxpbmVcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBvcmEgZnJvbSBcIm9yYVwiO1xuXG5jb25zdCBTREtfR0lUSFVCX1VSTCA9IFwiaHR0cHM6Ly9naXRodWIuY29tL2tleW1hbjEyL3BhdGgtdGVybWluYWwtc2RrXCI7XG5jb25zdCBBTkRST0lEX1NES19HSVRIVUJfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20va2V5bWFuMTIvcGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZFwiO1xuY29uc3QgU0RLX1ZFUlNJT04gPSBcIjAuMS4wXCI7IC8vIG1pbmltdW0gdmVyc2lvbiB0byByZWZlcmVuY2Vcbi8vIEFuZHJvaWQgU0RLIGlzIHNlcnZlZCBmcm9tIHRoZSBQYXRoLWhvc3RlZCBNYXZlbiByZXBvIChvbmUgVVJMLCBpbmNsLiB0aGUgVmVyaWZvbmVcbi8vIGJhY2tlbmQgKyBpdHMgLmFhcikuIE5vIEppdFBhY2ssIG5vIHNpYmxpbmcgY2hlY2tvdXQgXHUyMDE0IG1pcnJvcnMgdGhlIGlPUyBTUE0tVVJMIG1vZGVsLlxuY29uc3QgUEFUSF9NQVZFTl9VUkwgPSBcImh0dHBzOi8vbWNwLnBhdGgyYWkudGVjaC9tYXZlblwiO1xuY29uc3QgQU5EUk9JRF9TREtfR1JPVVAgPSBcInRlY2gucGF0aDJhaS5zZGtcIjtcbmNvbnN0IEFORFJPSURfU0RLX1ZFUlNJT04gPSBcIjEuNS4wXCI7XG5jb25zdCBBTkRST0lEX1NES19NT0RVTEVTID0gW1wicGF0aC1jb3JlLW1vZGVsc1wiLCBcInBhdGgtdGVybWluYWwtc2RrXCIsIFwicGF0aC1lbXVsYXRvci1hZGFwdGVyXCIsIFwicGF0aC1wc2RrLWFkYXB0ZXJcIl07XG5jb25zdCBNQ1BfU0VSVkVSX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3NzZVwiO1xuY29uc3QgUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXNcIjtcbmNvbnN0IEFORFJPSURfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvYW5kcm9pZFwiO1xuY29uc3QgV0lORE9XUzExX1JVTEVTX0ZFVENIX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3J1bGVzL3dpbmRvd3MxMVwiO1xuY29uc3QgV0lORE9XUzEwX1JVTEVTX0ZFVENIX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3J1bGVzL3dpbmRvd3MxMFwiO1xuXG5jb25zdCBSVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL2lvcy9wYXRoLWludGVncmF0aW9uLm1kY1wiKTtcbmNvbnN0IEFORFJPSURfUlVMRVNfU09VUkNFID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9ydWxlcy9hbmRyb2lkL3BhdGgtaW50ZWdyYXRpb24tYW5kcm9pZC5tZGNcIik7XG5jb25zdCBXSU5ET1dTMTFfUlVMRVNfU09VUkNFID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9ydWxlcy93aW5kb3dzLTExL3BhdGgtaW50ZWdyYXRpb24td2luZG93czExLm1kY1wiKTtcbmNvbnN0IFdJTkRPV1MxMF9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL3dpbmRvd3MtMTAvcGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTAubWRjXCIpO1xuXG4vLyBUaGUgV2luZG93cyBTREsgaXMgc2VydmVkIGZyb20gdGhlIFBhdGgtaG9zdGVkIE51R2V0IGZlZWQgKG9uZSBmZWVkIFVSTCwgaW5jbC4gdGhlXG4vLyBWZXJpZm9uZSBiYWNrZW5kICsgaXRzIGJ1bmRsZWQgYmluZGluZykuIE5vIHNpYmxpbmcgY2hlY2tvdXQgXHUyMDE0IG1pcnJvcnMgdGhlIEFuZHJvaWRcbi8vIE1hdmVuLVVSTCAvIGlPUyBTUE0tVVJMIG1vZGVsLiBPbmUgcGFja2FnZSBzZXQgc2VydmVzIGJvdGggdGhlIFdpblVJIDMgLyAuTkVUIDEwIGFuZFxuLy8gV1BGIC8gLk5FVCBGVyA0Ljggc3RhY2tzIChOdUdldCBwaWNrcyB0aGUgcmlnaHQgZmxhdm91ciBwZXIgdGFyZ2V0IGZyYW1ld29yaykuXG5jb25zdCBQQVRIX05VR0VUX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL251Z2V0L2luZGV4Lmpzb25cIjtcbmNvbnN0IFdJTkRPV1NfU0RLX1ZFUlNJT04gPSBcIjEuNS4wXCI7XG4vLyBDb3JlTW9kZWxzIGFycml2ZXMgdHJhbnNpdGl2ZWx5IHZpYSBQYXRoLlRlcm1pbmFsLlNkazsgUHNka0FkYXB0ZXIgY2FycmllcyBWZXJpZm9uZSAoeDY0KS5cbmNvbnN0IFdJTkRPV1NfU0RLX1BBQ0tBR0VTID0gW1xuICBcIlBhdGguVGVybWluYWwuU2RrXCIsXG4gIFwiUGF0aC5UZXJtaW5hbC5FbXVsYXRvckFkYXB0ZXJcIixcbiAgXCJQYXRoLlRlcm1pbmFsLk1vY2tBZGFwdGVyXCIsXG4gIFwiUGF0aC5UZXJtaW5hbC5EaWFnbm9zdGljc1wiLFxuICBcIlBhdGguVGVybWluYWwuUHNka0FkYXB0ZXJcIixcbl07XG4vLyBUaGUgU0RLIHJlcG8gbmFtZSBcdTIwMTQga2VwdCBvbmx5IGZvciB0aGUgbm90ZSB0aGF0IHRoZSBpbi1yZXBvIGRlbW9zIGJ1aWxkIGZyb20gc291cmNlLlxuY29uc3QgV0lORE9XU19TREtfUkVQTyA9IFwiUGF0aC10ZXJtaW5hbC1zZGstd2luZG93czExXCI7XG5cbnR5cGUgQWdlbnRUeXBlID0gXCJjdXJzb3JcIiB8IFwiY2xhdWRlXCI7XG50eXBlIFBsYXRmb3JtID0gXCJpb3NcIiB8IFwiYW5kcm9pZFwiIHwgXCJ3aW5kb3dzMTFcIiB8IFwid2luZG93czEwXCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBVdGlsaXRpZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGFzayhxdWVzdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogcHJvY2Vzcy5zdGRpbiwgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCB9KTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24ocXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmluZFhjb2RlUHJvamVjdChkaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBpc1hjb2RlQXJ0aWZhY3QgPSAoZTogc3RyaW5nKSA9PlxuICAgIGUuZW5kc1dpdGgoXCIueGNvZGVwcm9qXCIpIHx8IGUuZW5kc1dpdGgoXCIueGN3b3Jrc3BhY2VcIik7XG5cbiAgLy8gQ2hlY2sgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZpcnN0XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpO1xuICBjb25zdCBwcm9qID0gZW50cmllcy5maW5kKGlzWGNvZGVBcnRpZmFjdCk7XG4gIGlmIChwcm9qKSByZXR1cm4gcGF0aC5qb2luKGRpciwgcHJvaik7XG5cbiAgLy8gU2VhcmNoIG9uZSBsZXZlbCBkZWVwIGluIHN1YmRpcmVjdG9yaWVzIChoYW5kbGVzIHJlcG9zIHdoZXJlIHRoZVxuICAvLyBYY29kZSBwcm9qZWN0IHNpdHMgaW5zaWRlIGEgbmFtZWQgc3ViZm9sZGVyLCBlLmcuIE9yZGVyY2hhbXBpb25FUE9TLylcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBzdWIgPSBwYXRoLmpvaW4oZGlyLCBlbnRyeSk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhzdWIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc3Qgc3ViRW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHN1Yik7XG4gICAgICAgIGNvbnN0IHN1YlByb2ogPSBzdWJFbnRyaWVzLmZpbmQoaXNYY29kZUFydGlmYWN0KTtcbiAgICAgICAgaWYgKHN1YlByb2opIHJldHVybiBwYXRoLmpvaW4oc3ViLCBzdWJQcm9qKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogc2tpcCB1bnJlYWRhYmxlIGRpcnMgKi8gfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlU3dpZnQoZGlyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihkaXIsIFwiUGFja2FnZS5zd2lmdFwiKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocCkgPyBwIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzU0RLRGVwZW5kZW5jeShwYWNrYWdlU3dpZnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VTd2lmdCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoXCJwYXRoLXRlcm1pbmFsLXNka1wiKSB8fCBjb250ZW50LmluY2x1ZGVzKFwiUGF0aFRlcm1pbmFsU0RLXCIpO1xufVxuXG5mdW5jdGlvbiBoYXNYY29kZVByb2plY3RTREtEZXBlbmRlbmN5KHhjb2RlUHJvamVjdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFhjb2RlIHN0b3JlcyByZXNvbHZlZCBTUE0gcGFja2FnZXMgaW4gdGhlIHdvcmtzcGFjZSdzIFBhY2thZ2UucmVzb2x2ZWRcbiAgY29uc3QgcmVzb2x2ZWRQYXRocyA9IFtcbiAgICBwYXRoLmpvaW4oeGNvZGVQcm9qZWN0LCBcInByb2plY3QueGN3b3Jrc3BhY2VcIiwgXCJ4Y3NoYXJlZGRhdGFcIiwgXCJzd2lmdHBtXCIsIFwiUGFja2FnZS5yZXNvbHZlZFwiKSxcbiAgICBwYXRoLmpvaW4oeGNvZGVQcm9qZWN0LCBcInhjc2hhcmVkZGF0YVwiLCBcInN3aWZ0cG1cIiwgXCJQYWNrYWdlLnJlc29sdmVkXCIpLFxuICBdO1xuICBmb3IgKGNvbnN0IHAgb2YgcmVzb2x2ZWRQYXRocykge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsIFwidXRmLThcIik7XG4gICAgICBpZiAoY29udGVudC5pbmNsdWRlcyhcInBhdGgtdGVybWluYWwtc2RrXCIpIHx8IGNvbnRlbnQuaW5jbHVkZXMoXCJQYXRoVGVybWluYWxTREtcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0U1BNRGVwZW5kZW5jeShwYWNrYWdlU3dpZnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZVN3aWZ0UGF0aCwgXCJ1dGYtOFwiKTtcblxuICAvLyBBbHJlYWR5IHByZXNlbnQ/XG4gIGlmIChoYXNTREtEZXBlbmRlbmN5KHBhY2thZ2VTd2lmdFBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQWRkIHRoZSBwYWNrYWdlIGRlcGVuZGVuY3kgXHUyMDE0IGZpbmQgdGhlIGRlcGVuZGVuY2llczogWyBhcnJheVxuICBjb25zdCBkZXBzUmVnZXggPSAvKGRlcGVuZGVuY2llczpcXHMqXFxbKS87XG4gIGlmICghZGVwc1JlZ2V4LnRlc3QoY29udGVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIENhbid0IHNhZmVseSBpbmplY3QgXHUyMDE0IHN0cnVjdHVyZSBub3QgcmVjb2duaXNlZFxuICB9XG5cbiAgY29uc3QgZGVwRW50cnkgPSBgXFxuICAgICAgICAucGFja2FnZSh1cmw6IFwiJHtTREtfR0lUSFVCX1VSTH1cIiwgZnJvbTogXCIke1NES19WRVJTSU9OfVwiKSxgO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGRlcHNSZWdleCwgYCQxJHtkZXBFbnRyeX1gKTtcbiAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlU3dpZnRQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEN1cnNvci1zcGVjaWZpYyBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHdyaXRlQ3Vyc29yTWNwQ29uZmlnKGRpcjogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBtZXJnZWQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGN1cnNvckRpciA9IHBhdGguam9pbihkaXIsIFwiLmN1cnNvclwiKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihjdXJzb3JEaXIsIFwibWNwLmpzb25cIik7XG5cbiAgZnMubWtkaXJTeW5jKGN1cnNvckRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgcGF0aEVudHJ5ID0ge1xuICAgIFwicGF0aC10ZXJtaW5hbFwiOiB7IHVybDogTUNQX1NFUlZFUl9VUkwgfSxcbiAgfTtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsIFwidXRmLThcIikpO1xuICAgICAgaWYgKCFleGlzdGluZy5tY3BTZXJ2ZXJzKSBleGlzdGluZy5tY3BTZXJ2ZXJzID0ge307XG4gICAgICBpZiAoZXhpc3RpbmcubWNwU2VydmVyc1tcInBhdGgtdGVybWluYWxcIl0pIHtcbiAgICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTsgLy8gYWxyZWFkeSBwcmVzZW50XG4gICAgICB9XG4gICAgICBleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSA9IHBhdGhFbnRyeVtcInBhdGgtdGVybWluYWxcIl07XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBleGlzdHMgYnV0IGlzIG5vdCB2YWxpZCBKU09OIFx1MjAxNCBkb24ndCBvdmVyd3JpdGVcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0geyBtY3BTZXJ2ZXJzOiBwYXRoRW50cnkgfTtcbiAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIHdyaXRlQ3Vyc29yUnVsZXNGaWxlKGRpcjogc3RyaW5nLCBydWxlc1NvdXJjZTogc3RyaW5nID0gUlVMRVNfU09VUkNFLCBmaWxlbmFtZTogc3RyaW5nID0gXCJwYXRoLWludGVncmF0aW9uLm1kY1wiLCBmYWxsYmFja1VybD86IHN0cmluZyk6IHsgd3JpdHRlbjogYm9vbGVhbjsgc2tpcHBlZDogYm9vbGVhbiB9IHtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oZGlyLCBcIi5jdXJzb3JcIiwgXCJydWxlc1wiKTtcbiAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGZpbGVuYW1lKTtcblxuICBmcy5ta2RpclN5bmMocnVsZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGRlc3RQYXRoKSkge1xuICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiB0cnVlIH07XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZSwgZmFsbGJhY2tVcmwpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiBmYWxzZSB9O1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoZGVzdFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIHNraXBwZWQ6IGZhbHNlIH07XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDbGF1ZGUgQ29kZS1zcGVjaWZpYyBjb25maWcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIHdyaXRlQ2xhdWRlTWNwQ29uZmlnKGRpcjogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBtZXJnZWQ6IGJvb2xlYW4gfSB7XG4gIC8vIENsYXVkZSBDb2RlIHJlYWRzIC5tY3AuanNvbiBhdCB0aGUgcHJvamVjdCByb290IChzYW1lIG1jcFNlcnZlcnMgZm9ybWF0IGFzIEN1cnNvcilcbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXIsIFwiLm1jcC5qc29uXCIpO1xuXG4gIGNvbnN0IHNlcnZlckVudHJ5ID0ge1xuICAgIHR5cGU6IFwic3NlXCIsXG4gICAgdXJsOiBNQ1BfU0VSVkVSX1VSTCxcbiAgfTtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsIFwidXRmLThcIikpO1xuICAgICAgaWYgKCFleGlzdGluZy5tY3BTZXJ2ZXJzKSBleGlzdGluZy5tY3BTZXJ2ZXJzID0ge307XG4gICAgICBpZiAoZXhpc3RpbmcubWNwU2VydmVyc1tcInBhdGgtdGVybWluYWxcIl0pIHtcbiAgICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTsgLy8gYWxyZWFkeSBwcmVzZW50XG4gICAgICB9XG4gICAgICBleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSA9IHNlcnZlckVudHJ5O1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShleGlzdGluZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IHRydWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIG1jcFNlcnZlcnM6IHtcbiAgICAgIFwicGF0aC10ZXJtaW5hbFwiOiBzZXJ2ZXJFbnRyeSxcbiAgICB9LFxuICB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UgfTtcbn1cblxuLy8gUHJlLWFwcHJvdmUgdGhlIHBhdGgtdGVybWluYWwgTUNQIHNlcnZlciBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb24gc28gQ2xhdWRlXG4vLyBDb2RlIGxvYWRzIGl0cyB0b29scyBvbiB0aGUgdmVyeSBmaXJzdCBzZXNzaW9uIHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIHRvXG4vLyBjbGljayB0aHJvdWdoIGFuIGFwcHJvdmFsIHByb21wdCAod2hpY2ggaXMgZWFzeSB0byBtaXNzIGFuZCBsZWF2ZXMgdGhlIGFnZW50XG4vLyBydW5uaW5nIHdpdGhvdXQgTUNQIHRvb2xzKS5cbmZ1bmN0aW9uIHdyaXRlQ2xhdWRlU2V0dGluZ3MoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbjsgYWxyZWFkeUFwcHJvdmVkOiBib29sZWFuIH0ge1xuICBjb25zdCBjbGF1ZGVEaXIgPSBwYXRoLmpvaW4oZGlyLCBcIi5jbGF1ZGVcIik7XG4gIGNvbnN0IHNldHRpbmdzUGF0aCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2V0dGluZ3MuanNvblwiKTtcbiAgY29uc3QgTUNQX05BTUUgPSBcInBhdGgtdGVybWluYWxcIjtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xhdWRlRGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhjbGF1ZGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBjb25zdCBjdXJyZW50OiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzKSA/IGV4aXN0aW5nLmVuYWJsZWRNY3Bqc29uU2VydmVycyA6IFtdO1xuICAgICAgaWYgKGN1cnJlbnQuaW5jbHVkZXMoTUNQX05BTUUpKSB7XG4gICAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlLCBhbHJlYWR5QXBwcm92ZWQ6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLmVuYWJsZWRNY3Bqc29uU2VydmVycyA9IFsuLi5jdXJyZW50LCBNQ1BfTkFNRV07XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiB0cnVlLCBhbHJlYWR5QXBwcm92ZWQ6IGZhbHNlIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSwgYWxyZWFkeUFwcHJvdmVkOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBlbmFibGVkTWNwanNvblNlcnZlcnM6IFtNQ1BfTkFNRV0sXG4gIH07XG4gIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IGZhbHNlLCBhbHJlYWR5QXBwcm92ZWQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIHdyaXRlQ2xhdWRlUnVsZXNGaWxlKGRpcjogc3RyaW5nLCBydWxlc1NvdXJjZTogc3RyaW5nID0gUlVMRVNfU09VUkNFLCBmYWxsYmFja1VybD86IHN0cmluZyk6IHsgd3JpdHRlbjogYm9vbGVhbjsgc2tpcHBlZDogYm9vbGVhbiB9IHtcbiAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGlyLCBcIkNMQVVERS5tZFwiKTtcblxuICAvLyBEb24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgQ0xBVURFLm1kIFx1MjAxNCBpdCBtYXkgaGF2ZSBjdXN0b20gaW5zdHJ1Y3Rpb25zXG4gIGlmIChmcy5leGlzdHNTeW5jKGRlc3RQYXRoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZGVzdFBhdGgsIFwidXRmLThcIik7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoXCJQYXRoIFRlcm1pbmFsIFNES1wiKSkge1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgLy8gQXBwZW5kIHRvIGV4aXN0aW5nIENMQVVERS5tZFxuICAgIGNvbnN0IHJ1bGVzID0gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZSwgZmFsbGJhY2tVcmwpO1xuICAgIGlmICghcnVsZXMpIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIGZzLmFwcGVuZEZpbGVTeW5jKGRlc3RQYXRoLCBcIlxcblxcblwiICsgcnVsZXMsIFwidXRmLThcIik7XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IHJ1bGVzID0gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZSwgZmFsbGJhY2tVcmwpO1xuICBpZiAoIXJ1bGVzKSByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgcnVsZXMsIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIHNraXBwZWQ6IGZhbHNlIH07XG59XG5cbmZ1bmN0aW9uIGxvYWRSdWxlc0NvbnRlbnQocnVsZXNTb3VyY2U6IHN0cmluZyA9IFJVTEVTX1NPVVJDRSwgZmFsbGJhY2tVcmw/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHJhdzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocnVsZXNTb3VyY2UpKSB7XG4gICAgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHJ1bGVzU291cmNlLCBcInV0Zi04XCIpO1xuICB9IGVsc2UgaWYgKGZhbGxiYWNrVXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJhdyA9IGV4ZWNTeW5jKGBjdXJsIC1zZiAtLW1heC10aW1lIDEwIFwiJHtmYWxsYmFja1VybH1cImAsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcmF3KSByZXR1cm4gbnVsbDtcblxuICAvLyBTdHJpcCB0aGUgWUFNTCBmcm9udG1hdHRlciAoLS0tIC4uLiAtLS0pIHRoYXQgQ3Vyc29yIHVzZXNcbiAgY29uc3Qgc3RyaXBwZWQgPSByYXcucmVwbGFjZSgvXi0tLVtcXHNcXFNdKj8tLS1cXHMqLywgXCJcIik7XG4gIHJldHVybiBzdHJpcHBlZC50cmltKCk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTaGFyZWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGNoZWNrSW5mb1BsaXN0KGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBsaXN0RmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZnVuY3Rpb24gZmluZFBsaXN0cyhkOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIgPSAwKSB7XG4gICAgaWYgKGRlcHRoID4gNCkgcmV0dXJuO1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgaWYgKGUgPT09IFwibm9kZV9tb2R1bGVzXCIgfHwgZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGQsIGUpO1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGwpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgZmluZFBsaXN0cyhmdWxsLCBkZXB0aCArIDEpO1xuICAgICAgZWxzZSBpZiAoZSA9PT0gXCJJbmZvLnBsaXN0XCIpIHBsaXN0RmlsZXMucHVzaChmdWxsKTtcbiAgICB9XG4gIH1cblxuICBmaW5kUGxpc3RzKGRpcik7XG5cbiAgZm9yIChjb25zdCBwbGlzdCBvZiBwbGlzdEZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwbGlzdCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAoIWNvbnRlbnQuaW5jbHVkZXMoXCJOU0JsdWV0b290aEFsd2F5c1VzYWdlRGVzY3JpcHRpb25cIikpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKHBsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNzdWVzO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQW5kcm9pZCBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBmaW5kQW5kcm9pZFByb2plY3QoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpciwgXCJzZXR0aW5ncy5ncmFkbGUua3RzXCIpKSAmJlxuICAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyLCBcImFwcFwiLCBcImJ1aWxkLmdyYWRsZS5rdHNcIikpO1xufVxuXG5mdW5jdGlvbiBoYXNBbmRyb2lkU0RLRGVwZW5kZW5jeShkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBJbnN0YWxsZWQgPSB0aGUgUGF0aCBNYXZlbiByZXBvIGlzIHJlZ2lzdGVyZWQgQU5EIGEgdGVjaC5wYXRoMmFpLnNkayBkZXAgaXMgcHJlc2VudC5cbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGRpciwgXCJzZXR0aW5ncy5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzZXR0aW5ncyA9IGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc1BhdGgsIFwidXRmLThcIik7XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZXMoUEFUSF9NQVZFTl9VUkwpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IHBhdGguam9pbihkaXIsIFwiYXBwXCIsIFwiYnVpbGQuZ3JhZGxlLmt0c1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGJ1aWxkUGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBidWlsZCA9IGZzLnJlYWRGaWxlU3luYyhidWlsZFBhdGgsIFwidXRmLThcIik7XG4gIHJldHVybiAvXlxccyppbXBsZW1lbnRhdGlvblxcKFwidGVjaFxcLnBhdGgyYWlcXC5zZGs6cGF0aC10ZXJtaW5hbC1zZGsvbS50ZXN0KGJ1aWxkKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0UGF0aE1hdmVuUmVwbyhkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoUEFUSF9NQVZFTl9VUkwpKSByZXR1cm4gdHJ1ZTsgLy8gYWxyZWFkeSBwcmVzZW50XG4gIC8vIEFkZCB0aGUgUGF0aCBNYXZlbiByZXBvIGluc2lkZSBkZXBlbmRlbmN5UmVzb2x1dGlvbk1hbmFnZW1lbnQgcmVwb3NpdG9yaWVzIGJsb2NrXG4gIGNvbnN0IHJlcG9SZWdleCA9IC8oZGVwZW5kZW5jeVJlc29sdXRpb25NYW5hZ2VtZW50XFxzKlxce1tefV0qcmVwb3NpdG9yaWVzXFxzKlxceykvcztcbiAgaWYgKCFyZXBvUmVnZXgudGVzdChjb250ZW50KSkgcmV0dXJuIGZhbHNlO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHJlcG9SZWdleCwgYCQxXFxuICAgICAgICBtYXZlbiB7IHVybCA9IHVyaShcIiR7UEFUSF9NQVZFTl9VUkx9XCIpIH1gKTtcbiAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RHcmFkbGVEZXBlbmRlbmNpZXMoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5qb2luKGRpciwgXCJhcHBcIiwgXCJidWlsZC5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYnVpbGRQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhidWlsZFBhdGgsIFwidXRmLThcIik7XG5cbiAgLy8gQWxyZWFkeSBwcmVzZW50IGFuZCB1bmNvbW1lbnRlZCBcdTIwMTQgbm90aGluZyB0byBkb1xuICBpZiAoL15cXHMqaW1wbGVtZW50YXRpb25cXChcInRlY2hcXC5wYXRoMmFpXFwuc2RrOnBhdGgtdGVybWluYWwtc2RrL20udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3QgZGVwcyA9IEFORFJPSURfU0RLX01PRFVMRVNcbiAgICAubWFwKChtKSA9PiBgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19HUk9VUH06JHttfToke0FORFJPSURfU0RLX1ZFUlNJT059XCIpYClcbiAgICAuam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG5cbiAgLy8gUHJlc2VudCBidXQgY29tbWVudGVkIG91dCAob2xkZXIgaGFybmVzcyBzY2FmZm9sZHMpIFx1MjAxNCB1bmNvbW1lbnQvcmVwbGFjZSB0aG9zZSBsaW5lc1xuICBpZiAoL3BhdGgtdGVybWluYWwtc2RrLWFuZHJvaWR8dGVjaFxcLnBhdGgyYWlcXC5zZGsvLnRlc3QoY29udGVudCkpIHtcbiAgICBmb3IgKGNvbnN0IG0gb2YgQU5EUk9JRF9TREtfTU9EVUxFUykge1xuICAgICAgY29uc3QgY29tbWVudGVkID0gbmV3IFJlZ0V4cChgXlxcXFxzKi8vXFxcXHMqaW1wbGVtZW50YXRpb25cXFxcKCg/OlwifCcpKD86Y29tXFxcXC5naXRodWJcXFxcLmtleW1hbjEyXFxcXC5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkfHRlY2hcXFxcLnBhdGgyYWlcXFxcLnNkayk6JHttfVteXCInKV0qKD86XCJ8JylcXFxcKWAsIFwiZ21cIik7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGNvbW1lbnRlZCwgYCAgICBpbXBsZW1lbnRhdGlvbihcIiR7QU5EUk9JRF9TREtfR1JPVVB9OiR7bX06JHtBTkRST0lEX1NES19WRVJTSU9OfVwiKWApO1xuICAgIH1cbiAgICAvLyBJZiBwYXRoLXBzZGstYWRhcHRlciB3YXNuJ3QgaW4gdGhlIG9sZCBzY2FmZm9sZCwgYWRkIHRoZSB3aG9sZSBibG9jayBvbmNlLlxuICAgIGlmICghL3RlY2hcXC5wYXRoMmFpXFwuc2RrOnBhdGgtcHNkay1hZGFwdGVyLy50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8oZGVwZW5kZW5jaWVzXFxzKlxceykvLCBgJDFcXG4ke2RlcHN9YCk7XG4gICAgfVxuICAgIGZzLndyaXRlRmlsZVN5bmMoYnVpbGRQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTm90IHByZXNlbnQgYXQgYWxsIFx1MjAxNCBpbmplY3QgYWZ0ZXIgdGhlIGRlcGVuZGVuY2llcyB7IG9wZW5pbmcgYnJhY2VcbiAgY29uc3QgZGVwc1JlZ2V4ID0gLyhkZXBlbmRlbmNpZXNcXHMqXFx7KS87XG4gIGlmICghZGVwc1JlZ2V4LnRlc3QoY29udGVudCkpIHJldHVybiBmYWxzZTtcbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShkZXBzUmVnZXgsIGAkMVxcbiR7ZGVwc31gKTtcbiAgZnMud3JpdGVGaWxlU3luYyhidWlsZFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0FuZHJvaWRNYW5pZmVzdChkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmdW5jdGlvbiBmaW5kTWFuaWZlc3RzKGQ6IHN0cmluZywgZGVwdGg6IG51bWJlciA9IDApIHtcbiAgICBpZiAoZGVwdGggPiA0KSByZXR1cm47XG4gICAgZm9yIChjb25zdCBlIG9mIGZzLnJlYWRkaXJTeW5jKGQpKSB7XG4gICAgICBpZiAoZS5zdGFydHNXaXRoKFwiLlwiKSB8fCBlID09PSBcImJ1aWxkXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnVsbCA9IHBhdGguam9pbihkLCBlKTtcbiAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsKTtcbiAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIGZpbmRNYW5pZmVzdHMoZnVsbCwgZGVwdGggKyAxKTtcbiAgICAgIGVsc2UgaWYgKGUgPT09IFwiQW5kcm9pZE1hbmlmZXN0LnhtbFwiKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgaWYgKCFjb250ZW50LmluY2x1ZGVzKFwiQkxVRVRPT1RIX1NDQU5cIikpIGlzc3Vlcy5wdXNoKGZ1bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmaW5kTWFuaWZlc3RzKGRpcik7XG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBXaW5kb3dzIGhlbHBlcnMgKC5ORVQgXHUyMDE0IFdpblVJIDMgLyAuTkVUIDEwIGFuZCBXUEYgLyAuTkVUIEZXIDQuOCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8vIENvbGxlY3QgLmNzcHJvaiBmaWxlIHBhdGhzIGluIGN3ZCBhbmQgb25lIGxldmVsIGRlZXAuXG5mdW5jdGlvbiBmaW5kQ3Nwcm9qRmlsZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGZvdW5kOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YWxrID0gKGQ6IHN0cmluZywgZGVwdGg6IG51bWJlcikgPT4ge1xuICAgIGlmIChkZXB0aCA+IDEpIHJldHVybjtcbiAgICBsZXQgZW50cmllczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkgeyBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZCk7IH0gY2F0Y2ggeyByZXR1cm47IH1cbiAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgaWYgKGUuc3RhcnRzV2l0aChcIi5cIikgfHwgZSA9PT0gXCJiaW5cIiB8fCBlID09PSBcIm9ialwiKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZCwgZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdCA9IGZzLnN0YXRTeW5jKGZ1bGwpO1xuICAgICAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkgd2FsayhmdWxsLCBkZXB0aCArIDEpO1xuICAgICAgICBlbHNlIGlmIChlLmVuZHNXaXRoKFwiLmNzcHJvalwiKSkgZm91bmQucHVzaChmdWxsKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBza2lwICovIH1cbiAgICB9XG4gIH07XG4gIHdhbGsoZGlyLCAwKTtcbiAgcmV0dXJuIGZvdW5kO1xufVxuXG4vLyBBIFdpbmRvd3MgcHJvamVjdCA9IGEgLnNsbiBvciBhIC5jc3Byb2ogaW4gY3dkIG9yIG9uZSBsZXZlbCBkZWVwLlxuZnVuY3Rpb24gZmluZFdpbmRvd3NQcm9qZWN0KGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuICB0cnkgeyBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyKTsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoZW50cmllcy5zb21lKChlKSA9PiBlLmVuZHNXaXRoKFwiLnNsblwiKSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmluZENzcHJvakZpbGVzKGRpcikubGVuZ3RoID4gMDtcbn1cblxuLy8gV2luMTEgPSBXaW5VSSAzIC8gLk5FVCAxMCAobmV0MTAuMC13aW5kb3dzKTsgV2luMTAgPSBXUEYgLyAuTkVUIEZyYW1ld29yayA0LjggKG5ldDQ4KS5cbi8vIERlZmF1bHQgdG8gV2luZG93cyAxMSAodGhlIG1vZGVybiBzdGFjaykgd2hlbiB0aGUgc2lnbmFsIGlzIGFtYmlndW91cy5cbmZ1bmN0aW9uIGRldGVjdFdpbmRvd3NGbGF2b3VyKGRpcjogc3RyaW5nKTogXCJ3aW5kb3dzMTFcIiB8IFwid2luZG93czEwXCIge1xuICBjb25zdCBibG9iID0gZmluZENzcHJvakZpbGVzKGRpcikubWFwKChmKSA9PiB7XG4gICAgdHJ5IHsgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhmLCBcInV0Zi04XCIpOyB9IGNhdGNoIHsgcmV0dXJuIFwiXCI7IH1cbiAgfSkuam9pbihcIlxcblwiKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYmxvYi5pbmNsdWRlcyhcIm5ldDQ4XCIpIHx8IGJsb2IuaW5jbHVkZXMoXCI8dXNld3BmPnRydWVcIikgfHwgYmxvYi5pbmNsdWRlcyhcInY0LjhcIikpIHJldHVybiBcIndpbmRvd3MxMFwiO1xuICByZXR1cm4gXCJ3aW5kb3dzMTFcIjtcbn1cblxuZnVuY3Rpb24gaGFzV2luZG93c1NES0RlcGVuZGVuY3koZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRDc3Byb2pGaWxlcyhkaXIpLnNvbWUoKGYpID0+IHtcbiAgICB0cnkgeyByZXR1cm4gL1BhdGhcXC5UZXJtaW5hbFxcLlNkay8udGVzdChmcy5yZWFkRmlsZVN5bmMoZiwgXCJ1dGYtOFwiKSk7IH0gY2F0Y2ggeyByZXR1cm4gZmFsc2U7IH1cbiAgfSk7XG59XG5cbi8vIEFkZCB0aGUgUGF0aCBOdUdldCBmZWVkIHRvIGEgbnVnZXQuY29uZmlnIGJlc2lkZSB0aGUgcHJvamVjdCAoY3JlYXRlIGl0IGlmIGFic2VudCkuXG5mdW5jdGlvbiBpbmplY3RQYXRoTnVnZXRDb25maWcoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY2ZnUGF0aCA9IHBhdGguam9pbihkaXIsIFwibnVnZXQuY29uZmlnXCIpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhjZmdQYXRoKSkge1xuICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNmZ1BhdGgsIFwidXRmLThcIik7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoUEFUSF9OVUdFVF9VUkwpKSByZXR1cm4gdHJ1ZTsgLy8gYWxyZWFkeSBwcmVzZW50XG4gICAgaWYgKC88cGFja2FnZVNvdXJjZXM+Ly50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC88cGFja2FnZVNvdXJjZXM+LywgYDxwYWNrYWdlU291cmNlcz5cXG4gICAgPGFkZCBrZXk9XCJwYXRoXCIgdmFsdWU9XCIke1BBVEhfTlVHRVRfVVJMfVwiIC8+YCk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNmZ1BhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlOyAvLyB1bmV4cGVjdGVkIHNoYXBlIFx1MjAxNCBsZWF2ZSBpdCBmb3IgYSBtYW51YWwgc3RlcFxuICB9XG4gIGNvbnN0IGNmZyA9XG4gICAgYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxcbmAgK1xuICAgIGA8Y29uZmlndXJhdGlvbj5cXG5gICtcbiAgICBgICA8cGFja2FnZVNvdXJjZXM+XFxuYCArXG4gICAgYCAgICA8YWRkIGtleT1cInBhdGhcIiB2YWx1ZT1cIiR7UEFUSF9OVUdFVF9VUkx9XCIgLz5cXG5gICtcbiAgICBgICA8L3BhY2thZ2VTb3VyY2VzPlxcbmAgK1xuICAgIGA8L2NvbmZpZ3VyYXRpb24+XFxuYDtcbiAgZnMud3JpdGVGaWxlU3luYyhjZmdQYXRoLCBjZmcsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBZGQgdGhlIFBhdGggU0RLIFBhY2thZ2VSZWZlcmVuY2VzIHRvIHRoZSBhcHAncyAuY3Nwcm9qIGFuZCBlbnN1cmUgaXQgYnVpbGRzIHg2NCAodGhlXG4vLyBWZXJpZm9uZSBiaW5kaW5nIGlzIHg2NCBtaXhlZC1tb2RlKS4gUmV0dXJucyB0aGUgbW9kaWZpZWQgZmlsZSBwYXRoLCBvciBudWxsIGlmIG5vbmUgZm91bmQuXG5mdW5jdGlvbiBpbmplY3RXaW5kb3dzUGFja2FnZVJlZmVyZW5jZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3Nwcm9qcyA9IGZpbmRDc3Byb2pGaWxlcyhkaXIpO1xuICBpZiAoY3Nwcm9qcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAvLyBQcmVmZXIgYSBub24tdGVzdC8taGFybmVzcyBwcm9qZWN0OyBmYWxsIGJhY2sgdG8gdGhlIGZpcnN0IGZvdW5kLlxuICBjb25zdCB0YXJnZXQgPSBjc3Byb2pzLmZpbmQoKGYpID0+ICEvdGVzdHxoYXJuZXNzL2kudGVzdChwYXRoLmJhc2VuYW1lKGYpKSkgPz8gY3Nwcm9qc1swXTtcbiAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0LCBcInV0Zi04XCIpO1xuICBpZiAoL1BhY2thZ2VSZWZlcmVuY2VcXHMrSW5jbHVkZT1cIlBhdGhcXC5UZXJtaW5hbFxcLi8udGVzdChjb250ZW50KSkgcmV0dXJuIHRhcmdldDsgLy8gYWxyZWFkeSB0aGVyZVxuXG4gIGNvbnN0IHJlZnMgPSBXSU5ET1dTX1NES19QQUNLQUdFU1xuICAgIC5tYXAoKHApID0+IGAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT1cIiR7cH1cIiBWZXJzaW9uPVwiJHtXSU5ET1dTX1NES19WRVJTSU9OfVwiIC8+YClcbiAgICAuam9pbihcIlxcblwiKTtcbiAgY29uc3QgaXRlbUdyb3VwID1cbiAgICBgXFxuICA8IS0tIFBhdGggVGVybWluYWwgU0RLIFx1MjAxNCBmcm9tIHRoZSBQYXRoIE51R2V0IGZlZWQgKHNlZSBudWdldC5jb25maWcpLiAtLT5cXG5gICtcbiAgICBgICA8SXRlbUdyb3VwPlxcbiR7cmVmc31cXG4gIDwvSXRlbUdyb3VwPlxcbmA7XG5cbiAgLy8gRW5zdXJlIHg2NCAoVmVyaWZvbmUgYmluZGluZykuIEFkZCB0byB0aGUgZmlyc3QgUHJvcGVydHlHcm91cCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gIGlmICghLzxQbGF0Zm9ybVRhcmdldD4vLnRlc3QoY29udGVudCkgJiYgLzxQcm9wZXJ0eUdyb3VwPi8udGVzdChjb250ZW50KSkge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLzxQcm9wZXJ0eUdyb3VwPi8sIGA8UHJvcGVydHlHcm91cD5cXG4gICAgPFBsYXRmb3JtVGFyZ2V0Png2NDwvUGxhdGZvcm1UYXJnZXQ+YCk7XG4gIH1cbiAgLy8gSW5zZXJ0IHRoZSBJdGVtR3JvdXAganVzdCBiZWZvcmUgdGhlIGNsb3NpbmcgPC9Qcm9qZWN0Pi5cbiAgaWYgKCEvPFxcL1Byb2plY3Q+XFxzKiQvLnRlc3QoY29udGVudCkpIHJldHVybiBudWxsO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC88XFwvUHJvamVjdD5cXHMqJC8sIGAke2l0ZW1Hcm91cH08L1Byb2plY3Q+XFxuYCk7XG4gIGZzLndyaXRlRmlsZVN5bmModGFyZ2V0LCBjb250ZW50LCBcInV0Zi04XCIpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU3VtbWFyeSBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiBwbGF0Zm9ybUxhYmVsKHBsYXRmb3JtOiBQbGF0Zm9ybSk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICBjYXNlIFwiYW5kcm9pZFwiOiByZXR1cm4gXCJBbmRyb2lkXCI7XG4gICAgY2FzZSBcIndpbmRvd3MxMVwiOiByZXR1cm4gXCJXaW5kb3dzIDExIChXaW5VSSAzIC8gLk5FVCAxMClcIjtcbiAgICBjYXNlIFwid2luZG93czEwXCI6IHJldHVybiBcIldpbmRvd3MgMTAgKFdQRiAvIC5ORVQgRlcgNC44KVwiO1xuICAgIGRlZmF1bHQ6IHJldHVybiBcImlPU1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50U3VtbWFyeShhZ2VudDogQWdlbnRUeXBlLCBwbGF0Zm9ybTogUGxhdGZvcm0sIGFjdGlvbnM6IHN0cmluZ1tdLCB3YXJuaW5nczogc3RyaW5nW10sIG1hbnVhbFN0ZXBzOiBzdHJpbmdbXSkge1xuICBjb25zdCBpc0FuZHJvaWQgPSBwbGF0Zm9ybSA9PT0gXCJhbmRyb2lkXCI7XG4gIGNvbnN0IGlzV2luZG93cyA9IHBsYXRmb3JtID09PSBcIndpbmRvd3MxMVwiIHx8IHBsYXRmb3JtID09PSBcIndpbmRvd3MxMFwiO1xuICBjb25zb2xlLmxvZyhcIlxcblwiICsgY2hhbGsuYm9sZChcIlx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFwiKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYCAgUGF0aCBUZXJtaW5hbCBTREsgXHUyMDE0IFNldHVwIENvbXBsZXRlICgke3BsYXRmb3JtTGFiZWwocGxhdGZvcm0pfSlgKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcXG5cIikpO1xuXG4gIGlmIChhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlx1MjcxMyBEb25lOlwiKSk7XG4gICAgYWN0aW9ucy5mb3JFYWNoKChhKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICBcdTIwMjIgJHthfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGlmIChtYW51YWxTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXHUyNkEwIE1hbnVhbCBzdGVwcyByZXF1aXJlZDpcIikpO1xuICAgIG1hbnVhbFN0ZXBzLmZvckVhY2goKHMsIGkpID0+IGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICAke2kgKyAxfS4gJHtzfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiXHUyMTM5IE5vdGVzOlwiKSk7XG4gICAgd2FybmluZ3MuZm9yRWFjaCgodykgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFx1MjAyMiAke3d9YCkpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gQ2Fub25pY2FsIGZpcnN0LXByb21wdCB0ZXh0IFx1MjAxNCBpZGVudGljYWwgZm9yIENsYXVkZSBDb2RlIGFuZCBDdXJzb3Igc28gdGhlXG4gIC8vIGFnZW50IHJlY2VpdmVzIHRoZSBzYW1lIGRpcmVjdGl2ZSByZWdhcmRsZXNzIG9mIHRoZSBkZXZlbG9wZXIncyBJREUuXG4gIGNvbnN0IG1jcFByb21wdCA9XG4gICAgcGxhdGZvcm0gPT09IFwiYW5kcm9pZFwiID8gXCJpbnRlZ3JhdGUtcGF0aC1hbmRyb2lkXCIgOlxuICAgIHBsYXRmb3JtID09PSBcIndpbmRvd3MxMVwiID8gXCJpbnRlZ3JhdGUtcGF0aC13aW5kb3dzMTFcIiA6XG4gICAgcGxhdGZvcm0gPT09IFwid2luZG93czEwXCIgPyBcImludGVncmF0ZS1wYXRoLXdpbmRvd3MxMFwiIDpcbiAgICBcImludGVncmF0ZS1wYXRoLXNhbGVcIjtcbiAgY29uc3QgZmlyc3RQcm9tcHQgPVxuICAgICcgIFwiSW50ZWdyYXRlIHRoZSBQYXRoIFRlcm1pbmFsIFNESyBpbnRvIHRoaXMgRVBPUyBhcHAuIFJlYWQgQ0xBVURFLm1kXFxuJyArXG4gICAgJyAgIGZvciB0aGUgaW50ZWdyYXRpb24gcnVsZXMsIHRoZW4gdXNlIHRoZSBQYXRoIE1DUCAnICsgbWNwUHJvbXB0ICsgJ1xcbicgK1xuICAgICcgICBwcm9tcHQgdG8gYWRkIGEgUGF0aCBQT1MgQWRhcHRlciBpbiBTZXR0aW5ncyBcdTIwMTQgYSBiYWNrZW5kIHN3aXRjaGVyIGZvciB0aGVcXG4nICtcbiAgICAnICAgUGF0aCBQT1MgRW11bGF0b3IgKFdpLUZpL0lQIG9yIEJsdWV0b290aCkgYW5kIGEgcmVhbCBWZXJpZm9uZSB0ZXJtaW5hbC5cIic7XG5cbiAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlx1RDgzRFx1REU4MCBTdGFydCBDbGF1ZGUgQ29kZSBpbiB0aGlzIGRpcmVjdG9yeTpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oXCIgIGNsYXVkZSAtLW1vZGVsIHNvbm5ldFwiKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiICBUaGVuIHBhc3RlIHRoaXMgcHJvbXB0OlwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihmaXJzdFByb21wdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcdUQ4M0RcdURFODAgWW91ciBmaXJzdCBwcm9tcHQgaW4gQ3Vyc29yOlwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihmaXJzdFByb21wdCkpO1xuICB9XG5cbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIE1DUCBzZXJ2ZXI6ICR7TUNQX1NFUlZFUl9VUkx9YCkpO1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCIgIERvY3M6ICAgICAgIGh0dHBzOi8vbWNwLnBhdGgyYWkudGVjaC9oZWFsdGhcIikpO1xuICBjb25zb2xlLmxvZygpO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTWFpbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxucHJvZ3JhbVxuICAubmFtZShcInBhdGgtdGVybWluYWwtaW5pdFwiKVxuICAuZGVzY3JpcHRpb24oXG4gICAgXCJTZXQgdXAgdGhlIFBhdGggVGVybWluYWwgU0RLIGludGVncmF0aW9uIGFzc2lzdGFudCBmb3IgeW91ciBFUE9TIHByb2plY3QuXFxuXCIgK1xuICAgICAgXCJBdXRvLWRldGVjdHMgcGxhdGZvcm0gKGlPUywgQW5kcm9pZCwgb3IgV2luZG93cykgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkuXFxuXCIgK1xuICAgICAgXCJDb25maWd1cmVzIE1DUCBzZXJ2ZXIgYWNjZXNzLCBkcm9wcyB0aGUgaW50ZWdyYXRpb24gcmVjaXBlLCBhbmQgb3B0aW9uYWxseVxcblwiICtcbiAgICAgIFwiYWRkcyB0aGUgU0RLIGRlcGVuZGVuY3kuXFxuXFxuXCIgK1xuICAgICAgXCJTdXBwb3J0ZWQgYWdlbnRzOiBjbGF1ZGUgKGRlZmF1bHQpLCBjdXJzb3JcXG5cIiArXG4gICAgICBcIlN1cHBvcnRlZCBwbGF0Zm9ybXM6IGlvcyAoZGVmYXVsdCksIGFuZHJvaWQsIHdpbmRvd3MxMSAoV2luVUkgMyAvIC5ORVQgMTApLFxcblwiICtcbiAgICAgIFwid2luZG93czEwIChXUEYgLyAuTkVUIEZXIDQuOCkuIFVzZSAnd2luZG93cycgdG8gYXV0by1waWNrIHRoZSBXaW5kb3dzIGZsYXZvdXIuXCJcbiAgKVxuICAudmVyc2lvbihcIjAuMi4wXCIpXG4gIC5vcHRpb24oXCItLXRvb2xzLW9ubHlcIiwgXCJPbmx5IGNvbmZpZ3VyZSBNQ1AgKyBydWxlcy4gU2tpcCBTREsgaW5zdGFsbGF0aW9uLlwiKVxuICAub3B0aW9uKFwiLS1hZ2VudCA8bmFtZT5cIiwgXCJBSSBhZ2VudCB0byBjb25maWd1cmU6ICdjbGF1ZGUnIChkZWZhdWx0KSBvciAnY3Vyc29yJy5cIiwgXCJjbGF1ZGVcIilcbiAgLm9wdGlvbihcIi0tcGxhdGZvcm0gPG5hbWU+XCIsIFwiUGxhdGZvcm06IGlvcyB8IGFuZHJvaWQgfCB3aW5kb3dzIHwgd2luZG93czExIHwgd2luZG93czEwLiBBdXRvLWRldGVjdGVkIGlmIG5vdCBzcGVjaWZpZWQuXCIpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0b29sc09ubHk6IGJvb2xlYW4gPSBvcHRpb25zLnRvb2xzT25seSA/PyBmYWxzZTtcbiAgICBjb25zdCBhZ2VudDogQWdlbnRUeXBlID0gKG9wdGlvbnMuYWdlbnQgPz8gXCJjbGF1ZGVcIikgYXMgQWdlbnRUeXBlO1xuICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBBdXRvLWRldGVjdCBwbGF0Zm9ybS4gT3JkZXI6IEFuZHJvaWQgKEdyYWRsZSkgXHUyMTkyIFdpbmRvd3MgKC5jc3Byb2ovLnNsbikgXHUyMTkyIGlPUyAoZGVmYXVsdCkuXG4gICAgY29uc3QgcmF3UGxhdGZvcm06IHN0cmluZyA9IG9wdGlvbnMucGxhdGZvcm0gPz8gXCJhdXRvXCI7XG4gICAgY29uc3QgVkFMSURfUExBVEZPUk1TID0gW1wiaW9zXCIsIFwiYW5kcm9pZFwiLCBcIndpbmRvd3NcIiwgXCJ3aW5kb3dzMTFcIiwgXCJ3aW5kb3dzMTBcIl07XG4gICAgbGV0IHBsYXRmb3JtOiBQbGF0Zm9ybTtcbiAgICBpZiAocmF3UGxhdGZvcm0gPT09IFwiYXV0b1wiIHx8ICFWQUxJRF9QTEFURk9STVMuaW5jbHVkZXMocmF3UGxhdGZvcm0pKSB7XG4gICAgICBpZiAoZmluZEFuZHJvaWRQcm9qZWN0KGN3ZCkpIHBsYXRmb3JtID0gXCJhbmRyb2lkXCI7XG4gICAgICBlbHNlIGlmIChmaW5kV2luZG93c1Byb2plY3QoY3dkKSkgcGxhdGZvcm0gPSBkZXRlY3RXaW5kb3dzRmxhdm91cihjd2QpO1xuICAgICAgZWxzZSBwbGF0Zm9ybSA9IFwiaW9zXCI7XG4gICAgfSBlbHNlIGlmIChyYXdQbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzXCIpIHtcbiAgICAgIC8vIEV4cGxpY2l0IFdpbmRvd3MsIGJ1dCBsZXQgdGhlIC5jc3Byb2ogZGVjaWRlIFdpbjExIChXaW5VSSAzKSB2cyBXaW4xMCAoV1BGKS5cbiAgICAgIHBsYXRmb3JtID0gZGV0ZWN0V2luZG93c0ZsYXZvdXIoY3dkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGxhdGZvcm0gPSByYXdQbGF0Zm9ybSBhcyBQbGF0Zm9ybTtcbiAgICB9XG4gICAgY29uc3QgaXNBbmRyb2lkID0gcGxhdGZvcm0gPT09IFwiYW5kcm9pZFwiO1xuICAgIGNvbnN0IGlzV2luZG93cyA9IHBsYXRmb3JtID09PSBcIndpbmRvd3MxMVwiIHx8IHBsYXRmb3JtID09PSBcIndpbmRvd3MxMFwiO1xuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiICBQYXRoIFRlcm1pbmFsIFNESyBcdTIwMTQgSW50ZWdyYXRpb24gQXNzaXN0YW50IFNldHVwXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCIgIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIEFnZW50OiAgICAke2FnZW50fWApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUGxhdGZvcm06ICR7cGxhdGZvcm19JHtvcHRpb25zLnBsYXRmb3JtID8gXCJcIiA6IFwiIChhdXRvLWRldGVjdGVkKVwifWApKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgaWYgKGFnZW50ICE9PSBcImN1cnNvclwiICYmIGFnZW50ICE9PSBcImNsYXVkZVwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIGBcdTI2QTAgQWdlbnQgJyR7YWdlbnR9JyBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgJ2N1cnNvcicgb3IgJ2NsYXVkZScuYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbWFudWFsU3RlcHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgMS4gU0RLIGluc3RhbGxhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBpZiAoIXRvb2xzT25seSkge1xuICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICAvLyBcdTI1MDBcdTI1MDAgQW5kcm9pZDogSml0UGFjayArIEdyYWRsZSBcdTI1MDBcdTI1MDBcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIEFuZHJvaWQgcHJvamVjdFx1MjAyNlwiKS5zdGFydCgpO1xuXG4gICAgICAgIGlmICghZmluZEFuZHJvaWRQcm9qZWN0KGN3ZCkpIHtcbiAgICAgICAgICBzcGlubmVyLndhcm4oXCJObyBBbmRyb2lkIHByb2plY3QgZm91bmQgKHNldHRpbmdzLmdyYWRsZS5rdHMgb3IgYXBwL2J1aWxkLmdyYWRsZS5rdHMgbWlzc2luZykuXCIpO1xuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFzayhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcIiAgQ29udGludWUgd2l0aCB0b29scy1vbmx5IHNldHVwPyAoeS9uKTogXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYW5zd2VyLnRvTG93ZXJDYXNlKCkgIT09IFwieVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJcXG4gIFJ1biB0aGlzIGZyb20geW91ciBBbmRyb2lkIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuXFxuXCIpKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIEFuZHJvaWQgcHJvamVjdCBmb3VuZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQW5kcm9pZFNES0RlcGVuZGVuY3koY3dkKSkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGggVGVybWluYWwgU0RLIGFscmVhZHkgcHJlc2VudCBpbiBzZXR0aW5ncy5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJTREsgZGVwZW5kZW5jeSBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIudGV4dCA9IFwiQWRkaW5nIHRoZSBQYXRoIE1hdmVuIHJlcG9zaXRvcnkgdG8gc2V0dGluZ3MuZ3JhZGxlLmt0c1x1MjAyNlwiO1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdzT2sgPSBpbmplY3RQYXRoTWF2ZW5SZXBvKGN3ZCk7XG4gICAgICAgICAgY29uc3QgZGVwc09rID0gaW5qZWN0R3JhZGxlRGVwZW5kZW5jaWVzKGN3ZCk7XG5cbiAgICAgICAgICBpZiAoc2V0dGluZ3NPaykge1xuICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aCBNYXZlbiByZXBvc2l0b3J5IGFkZGVkIHRvIHNldHRpbmdzLmdyYWRsZS5rdHMuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGBQYXRoIE1hdmVuIHJlcG8gYWRkZWQgdG8gc2V0dGluZ3MuZ3JhZGxlLmt0cyAoJHtQQVRIX01BVkVOX1VSTH0pYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgdGhlIFBhdGggTWF2ZW4gcmVwbyB0byBzZXR0aW5ncy5ncmFkbGUua3RzIChkZXBlbmRlbmN5UmVzb2x1dGlvbk1hbmFnZW1lbnQgeyByZXBvc2l0b3JpZXMgeyBcdTIwMjYgfSB9KTpcXG5gICtcbiAgICAgICAgICAgICAgYCAgICAgbWF2ZW4geyB1cmwgPSB1cmkoXCIke1BBVEhfTUFWRU5fVVJMfVwiKSB9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlcHNPaykge1xuICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiU0RLIGRlcGVuZGVuY2llcyBhZGRlZCB0byBhcHAvYnVpbGQuZ3JhZGxlLmt0cyAoaW5jbC4gVmVyaWZvbmUpLlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChgU0RLIGRlcHMgYWRkZWQgdG8gYXBwL2J1aWxkLmdyYWRsZS5rdHM6ICR7QU5EUk9JRF9TREtfTU9EVUxFUy5qb2luKFwiLCBcIil9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwaW5uZXIud2FybihcIkNvdWxkIG5vdCBhdXRvLWluamVjdCBkZXBlbmRlbmNpZXMgaW50byBhcHAvYnVpbGQuZ3JhZGxlLmt0cy5cIik7XG4gICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICBgQWRkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzIGRlcGVuZGVuY2llcyB7fTpcXG5gICtcbiAgICAgICAgICAgICAgQU5EUk9JRF9TREtfTU9EVUxFUy5tYXAoKG0pID0+IGAgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19HUk9VUH06JHttfToke0FORFJPSURfU0RLX1ZFUlNJT059XCIpYCkuam9pbihcIlxcblwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNXaW5kb3dzKSB7XG4gICAgICAgIC8vIFx1MjUwMFx1MjUwMCBXaW5kb3dzOiBQYWNrYWdlUmVmZXJlbmNlIGZyb20gdGhlIFBhdGggTnVHZXQgZmVlZCBcdTI1MDBcdTI1MDBcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIFdpbmRvd3MgKC5ORVQpIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcbiAgICAgICAgaWYgKCFmaW5kV2luZG93c1Byb2plY3QoY3dkKSkge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcIk5vIFdpbmRvd3MgcHJvamVjdCBmb3VuZCAoLnNsbiBvciAuY3Nwcm9qKS5cIik7XG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgYXNrKGNoYWxrLnllbGxvdyhcIiAgQ29udGludWUgd2l0aCB0b29scy1vbmx5IHNldHVwPyAoeS9uKTogXCIpKTtcbiAgICAgICAgICBpZiAoYW5zd2VyLnRvTG93ZXJDYXNlKCkgIT09IFwieVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJcXG4gIFJ1biB0aGlzIGZyb20geW91ciBXaW5kb3dzIEVQT1MgcHJvamVjdCByb290LlxcblwiKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhcm5pbmdzLnB1c2goXCJSYW4gaW4gdG9vbHMtb25seSBtb2RlIFx1MjAxNCBubyBXaW5kb3dzIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc1dpbmRvd3NTREtEZXBlbmRlbmN5KGN3ZCkpIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoIFRlcm1pbmFsIFNESyBhbHJlYWR5IHJlZmVyZW5jZWQgaW4gdGhlIHByb2plY3QuXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIlNESyByZWZlcmVuY2UgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLnRleHQgPSBcIkFkZGluZyB0aGUgUGF0aCBOdUdldCBmZWVkICsgU0RLIHBhY2thZ2VzXHUyMDI2XCI7XG4gICAgICAgICAgY29uc3QgZmVlZE9rID0gaW5qZWN0UGF0aE51Z2V0Q29uZmlnKGN3ZCk7XG4gICAgICAgICAgY29uc3QgY3Nwcm9qID0gaW5qZWN0V2luZG93c1BhY2thZ2VSZWZlcmVuY2VzKGN3ZCk7XG5cbiAgICAgICAgICBpZiAoZmVlZE9rKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goYFBhdGggTnVHZXQgZmVlZCBhZGRlZCB0byBudWdldC5jb25maWcgKCR7UEFUSF9OVUdFVF9VUkx9KWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICBgQWRkIHRoZSBQYXRoIE51R2V0IGZlZWQgdG8gYSBudWdldC5jb25maWcgYmVzaWRlIHlvdXIgc29sdXRpb246XFxuYCArXG4gICAgICAgICAgICAgIGAgICAgIDxhZGQga2V5PVwicGF0aFwiIHZhbHVlPVwiJHtQQVRIX05VR0VUX1VSTH1cIiAvPmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjc3Byb2opIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgYFNESyBwYWNrYWdlcyBhZGRlZCB0byAke3BhdGguYmFzZW5hbWUoY3Nwcm9qKX0gKHg2NCk6ICR7V0lORE9XU19TREtfUEFDS0FHRVMuam9pbihcIiwgXCIpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgdGhlIFBhdGggU0RLIFBhY2thZ2VSZWZlcmVuY2VzIHRvIHlvdXIgLmNzcHJvaiAodmVyc2lvbnMgJHtXSU5ET1dTX1NES19WRVJTSU9OfSk6XFxuYCArXG4gICAgICAgICAgICAgIFdJTkRPV1NfU0RLX1BBQ0tBR0VTLm1hcCgocCkgPT4gYCAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT1cIiR7cH1cIiBWZXJzaW9uPVwiJHtXSU5ET1dTX1NES19WRVJTSU9OfVwiIC8+YCkuam9pbihcIlxcblwiKSArXG4gICAgICAgICAgICAgIGBcXG4gICAgIFx1MjAyNmFuZCBzZXQgPFBsYXRmb3JtVGFyZ2V0Png2NDwvUGxhdGZvcm1UYXJnZXQ+ICh0aGUgVmVyaWZvbmUgYmluZGluZyBpcyB4NjQgbWl4ZWQtbW9kZSkuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZlZWRPayAmJiBjc3Byb2opIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGggTnVHZXQgZmVlZCArIFNESyBwYWNrYWdlcyBhZGRlZCAoaW5jbC4gVmVyaWZvbmUpLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Bpbm5lci53YXJuKFwiUGF0aCBTREsgcGFydGx5IHdpcmVkIFx1MjAxNCBzZWUgdGhlIG1hbnVhbCBzdGVwcyBiZWxvdy5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBcdTI1MDBcdTI1MDAgaU9TOiBTUE0gLyBYY29kZSBcdTI1MDBcdTI1MDBcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIGZvciBYY29kZSBwcm9qZWN0XHUyMDI2XCIpLnN0YXJ0KCk7XG5cbiAgICAgICAgY29uc3QgeGNvZGVQcm9qZWN0ID0gZmluZFhjb2RlUHJvamVjdChjd2QpO1xuICAgICAgICBjb25zdCBwYWNrYWdlU3dpZnQgPSBmaW5kUGFja2FnZVN3aWZ0KGN3ZCk7XG5cbiAgICAgICAgaWYgKHBhY2thZ2VTd2lmdCkge1xuICAgICAgICAgIHNwaW5uZXIudGV4dCA9IFwiRm91bmQgUGFja2FnZS5zd2lmdCBcdTIwMTQgYWRkaW5nIFBhdGhUZXJtaW5hbFNESyBkZXBlbmRlbmN5XHUyMDI2XCI7XG4gICAgICAgICAgaWYgKGhhc1NES0RlcGVuZGVuY3kocGFja2FnZVN3aWZ0KSkge1xuICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aFRlcm1pbmFsU0RLIGFscmVhZHkgcHJlc2VudCBpbiBQYWNrYWdlLnN3aWZ0LlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcIlBhdGhUZXJtaW5hbFNESyBkZXBlbmRlbmN5IGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdGVkID0gaW5qZWN0U1BNRGVwZW5kZW5jeShwYWNrYWdlU3dpZnQpO1xuICAgICAgICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGhUZXJtaW5hbFNESyBhZGRlZCB0byBQYWNrYWdlLnN3aWZ0LlwiKTtcbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFBhY2thZ2Uuc3dpZnRcIik7XG4gICAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgICAgYE9wZW4gWGNvZGUgYW5kIGxpbmsgYWxsIGZvdXIgdGFyZ2V0cyB0byB5b3VyIGFwcDogUGF0aFRlcm1pbmFsU0RLLCBQYXRoRW11bGF0b3JBZGFwdGVyLCBQYXRoQ29yZU1vZGVscywgUGF0aFZlcmlmb25lUFNES0FkYXB0ZXIuYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3Bpbm5lci53YXJuKFwiQ291bGQgbm90IGF1dG9tYXRpY2FsbHkgbW9kaWZ5IFBhY2thZ2Uuc3dpZnQgXHUyMDE0IG1hbnVhbCBzdGVwIHJlcXVpcmVkLlwiKTtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgQWRkIFBhdGhUZXJtaW5hbFNESyBtYW51YWxseSB0byBQYWNrYWdlLnN3aWZ0OlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCAgICAgLnBhY2thZ2UodXJsOiBcIiR7U0RLX0dJVEhVQl9VUkx9XCIsIGZyb206IFwiJHtTREtfVkVSU0lPTn1cIilgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHhjb2RlUHJvamVjdCkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChgRm91bmQgWGNvZGUgcHJvamVjdDogJHtwYXRoLmJhc2VuYW1lKHhjb2RlUHJvamVjdCl9YCk7XG4gICAgICAgICAgaWYgKGhhc1hjb2RlUHJvamVjdFNES0RlcGVuZGVuY3koeGNvZGVQcm9qZWN0KSkge1xuICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aFRlcm1pbmFsU0RLIGFscmVhZHkgcHJlc2VudCBpbiBYY29kZSBwcm9qZWN0LlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcIlBhdGhUZXJtaW5hbFNESyBkZXBlbmRlbmN5IGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgXCJcXG4gIFx1MjZBMCBBdXRvbWF0aWMgU1BNIGluamVjdGlvbiBpbnRvIC54Y29kZXByb2ogaXMgbm90IHN1cHBvcnRlZCAoWGNvZGUgbWFuYWdlcyB0aGlzKS5cIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlxcbiAgVG8gYWRkIFBhdGhUZXJtaW5hbFNESyBpbiBYY29kZTpcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgIDEuIE9wZW4geW91ciBwcm9qZWN0IGluIFhjb2RlXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgIDIuIEZpbGUgXHUyMTkyIEFkZCBQYWNrYWdlIERlcGVuZGVuY2llc1x1MjAyNlwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgIDMuIEVudGVyIFVSTDogJHtjaGFsay5jeWFuKFNES19HSVRIVUJfVVJMKX1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBcIiAgNC4gSW4gdGhlICdDaG9vc2UgUGFja2FnZSBQcm9kdWN0cycgZGlhbG9nLCBzZXQgYWxsIGZvdXIgdG8geW91ciBhcHAgdGFyZ2V0OlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICAgICBQYXRoVGVybWluYWxTREsgICAgICAgIFx1MjE5MiB5b3VyIGFwcCB0YXJnZXRcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICAgICBQYXRoRW11bGF0b3JBZGFwdGVyICAgIFx1MjE5MiB5b3VyIGFwcCB0YXJnZXRcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICAgICBQYXRoQ29yZU1vZGVscyAgICAgICAgIFx1MjE5MiB5b3VyIGFwcCB0YXJnZXRcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICAgICBQYXRoVmVyaWZvbmVQU0RLQWRhcHRlciBcdTIxOTIgeW91ciBhcHAgdGFyZ2V0XCIpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIiAgICAgKFBhdGhWZXJpZm9uZVBTREtBZGFwdGVyIGlzIHJlcXVpcmVkIGZvciB0aGUgVmVyaWZvbmUgYmFja2VuZDsgUGF0aERpYWdub3N0aWNzIGNhbiBiZSBsZWZ0IGFzIE5vbmUpXCIpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiICA1LiBDbGljayBBZGQgUGFja2FnZVxcblwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGFzayhcbiAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIiAgUHJlc3MgRW50ZXIgb25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcGFja2FnZSwgb3IgdHlwZSAnc2tpcCcgdG8gZG8gdGhpcyBsYXRlcjogXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNvbmZpcm1lZC50b0xvd2VyQ2FzZSgpICE9PSBcInNraXBcIikge1xuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goYFBhdGhUZXJtaW5hbFNESyBhZGRlZCB0byBYY29kZSBwcm9qZWN0IChjb25maXJtZWQgYnkgdXNlcilgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgICAgYEFkZCBQYXRoVGVybWluYWxTREsgdmlhIFhjb2RlOiBGaWxlIFx1MjE5MiBBZGQgUGFja2FnZSBEZXBlbmRlbmNpZXMgXHUyMTkyICR7U0RLX0dJVEhVQl9VUkx9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLndhcm4oXCJObyBYY29kZSBwcm9qZWN0IGZvdW5kIGluIGN1cnJlbnQgZGlyZWN0b3J5LlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIFwiICBObyAueGNvZGVwcm9qIG9yIFBhY2thZ2Uuc3dpZnQgZm91bmQuIENvbnRpbnVlIHdpdGggdG9vbHMtb25seSBzZXR1cD8gKHkvbik6IFwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYW5zd2VyLnRvTG93ZXJDYXNlKCkgIT09IFwieVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsuZGltKFwiXFxuICBSdW4gdGhpcyBjb21tYW5kIGZyb20geW91ciBYY29kZSBwcm9qZWN0IGRpcmVjdG9yeSwgb3IgdXNlIC0tdG9vbHMtb25seS5cXG5cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhcm5pbmdzLnB1c2goXCJSYW4gaW4gdG9vbHMtb25seSBtb2RlIFx1MjAxNCBubyBYY29kZSBwcm9qZWN0IGZvdW5kLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhY3Rpb25zLnB1c2goXCJTa2lwcGVkIFNESyBpbnN0YWxsYXRpb24gKC0tdG9vbHMtb25seSBtb2RlKVwiKTtcbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgMi4gTUNQIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiV3JpdGluZyBNQ1Agc2VydmVyIGNvbmZpZ1x1MjAyNlwiKS5zdGFydCgpO1xuXG4gICAgICBsZXQgcmVzdWx0OiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9O1xuICAgICAgbGV0IGNvbmZpZ0ZpbGU6IHN0cmluZztcblxuICAgICAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHdyaXRlQ2xhdWRlTWNwQ29uZmlnKGN3ZCk7XG4gICAgICAgIGNvbmZpZ0ZpbGUgPSBcIi5tY3AuanNvblwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gd3JpdGVDdXJzb3JNY3BDb25maWcoY3dkKTtcbiAgICAgICAgY29uZmlnRmlsZSA9IFwiLmN1cnNvci9tY3AuanNvblwiO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LndyaXR0ZW4gJiYgcmVzdWx0Lm1lcmdlZCkge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYE1DUCBjb25maWcgbWVyZ2VkIGludG8gZXhpc3RpbmcgJHtjb25maWdGaWxlfS5gKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKGBwYXRoLXRlcm1pbmFsIGVudHJ5IG1lcmdlZCBpbnRvICR7Y29uZmlnRmlsZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LndyaXR0ZW4pIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGBNQ1AgY29uZmlnIHdyaXR0ZW4gdG8gJHtjb25maWdGaWxlfS5gKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKGBNQ1Agc2VydmVyIGNvbmZpZ3VyZWQ6ICR7Y29uZmlnRmlsZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwaW5uZXIuaW5mbyhcIk1DUCBjb25maWcgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKFwiTUNQIGNvbmZpZyBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgQ2xhdWRlIENvZGUsIGFsc28gcHJlLWFwcHJvdmUgdGhlIE1DUCBzZXJ2ZXIgaW4gLmNsYXVkZS9zZXR0aW5ncy5qc29uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBDbGF1ZGUgQ29kZSBzaG93cyBhbiBpbnRlcmFjdGl2ZSBcIkFsbG93IHRoaXMgTUNQIHNlcnZlcj9cIlxuICAgICAgLy8gcHJvbXB0IG9uIGZpcnN0IGxhdW5jaCBcdTIwMTQgZWFzeSB0byBtaXNzLCBhbmQgdGhlIGFnZW50IGVuZHMgdXAgcnVubmluZ1xuICAgICAgLy8gd2l0aG91dCBNQ1AgdG9vbHMgaWYgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LlxuICAgICAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVTcGlubmVyID0gb3JhKFwiUHJlLWFwcHJvdmluZyBQYXRoIE1DUCBzZXJ2ZXIgZm9yIENsYXVkZSBDb2RlXHUyMDI2XCIpLnN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmUgPSB3cml0ZUNsYXVkZVNldHRpbmdzKGN3ZCk7XG4gICAgICAgIGlmIChhcHByb3ZlLmFscmVhZHlBcHByb3ZlZCkge1xuICAgICAgICAgIGFwcHJvdmVTcGlubmVyLmluZm8oXCJQYXRoIE1DUCBzZXJ2ZXIgYWxyZWFkeSBwcmUtYXBwcm92ZWQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUud3JpdHRlbiAmJiBhcHByb3ZlLm1lcmdlZCkge1xuICAgICAgICAgIGFwcHJvdmVTcGlubmVyLnN1Y2NlZWQoXCJwYXRoLXRlcm1pbmFsIGFkZGVkIHRvIGV4aXN0aW5nIC5jbGF1ZGUvc2V0dGluZ3MuanNvbi5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwicGF0aC10ZXJtaW5hbCBwcmUtYXBwcm92ZWQgaW4gLmNsYXVkZS9zZXR0aW5ncy5qc29uXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUud3JpdHRlbikge1xuICAgICAgICAgIGFwcHJvdmVTcGlubmVyLnN1Y2NlZWQoXCJQcmUtYXBwcm92YWwgd3JpdHRlbiB0byAuY2xhdWRlL3NldHRpbmdzLmpzb24uXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIkNsYXVkZSBDb2RlIHByZS1hcHByb3ZhbDogLmNsYXVkZS9zZXR0aW5ncy5qc29uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFwcHJvdmVTcGlubmVyLndhcm4oXCJDb3VsZCBub3Qgd3JpdGUgLmNsYXVkZS9zZXR0aW5ncy5qc29uIFx1MjAxNCB5b3UgbWF5IHNlZSBhbiBcXFwiQWxsb3cgTUNQIHNlcnZlcj9cXFwiIHByb21wdCBvbiBmaXJzdCBDbGF1ZGUgQ29kZSBsYXVuY2guIEFjY2VwdCBpdC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgMy4gUnVsZXMgZmlsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBjb25zdCBzcGlubmVyID0gb3JhKGBXcml0aW5nICR7YWdlbnQgPT09IFwiY2xhdWRlXCIgPyBcIkNMQVVERS5tZFwiIDogXCJDdXJzb3IgcnVsZXNcIn0gZmlsZVx1MjAyNmApLnN0YXJ0KCk7XG5cbiAgICAgIGxldCByZXN1bHQ6IHsgd3JpdHRlbjogYm9vbGVhbjsgc2tpcHBlZDogYm9vbGVhbiB9O1xuICAgICAgbGV0IHJ1bGVzRmlsZTogc3RyaW5nO1xuXG4gICAgICAvLyBQZXItcGxhdGZvcm0gcmVjaXBlIHNvdXJjZSArIGZldGNoIFVSTCArIGZpbGVuYW1lLlxuICAgICAgY29uc3QgcnVsZXNCeVBsYXRmb3JtID0ge1xuICAgICAgICBpb3M6ICAgICAgIHsgc3JjOiBSVUxFU19TT1VSQ0UsICAgICAgICAgIHVybDogUlVMRVNfRkVUQ0hfVVJMLCAgICAgICAgICBmaWxlOiBcInBhdGgtaW50ZWdyYXRpb24ubWRjXCIgfSxcbiAgICAgICAgYW5kcm9pZDogICB7IHNyYzogQU5EUk9JRF9SVUxFU19TT1VSQ0UsICAgdXJsOiBBTkRST0lEX1JVTEVTX0ZFVENIX1VSTCwgICBmaWxlOiBcInBhdGgtaW50ZWdyYXRpb24tYW5kcm9pZC5tZGNcIiB9LFxuICAgICAgICB3aW5kb3dzMTE6IHsgc3JjOiBXSU5ET1dTMTFfUlVMRVNfU09VUkNFLCB1cmw6IFdJTkRPV1MxMV9SVUxFU19GRVRDSF9VUkwsIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTEubWRjXCIgfSxcbiAgICAgICAgd2luZG93czEwOiB7IHNyYzogV0lORE9XUzEwX1JVTEVTX1NPVVJDRSwgdXJsOiBXSU5ET1dTMTBfUlVMRVNfRkVUQ0hfVVJMLCBmaWxlOiBcInBhdGgtaW50ZWdyYXRpb24td2luZG93czEwLm1kY1wiIH0sXG4gICAgICB9IGFzIGNvbnN0O1xuICAgICAgY29uc3QgYWN0aXZlUnVsZXMgPSBydWxlc0J5UGxhdGZvcm1bcGxhdGZvcm1dO1xuICAgICAgY29uc3QgYWN0aXZlRmV0Y2hVcmwgPSBhY3RpdmVSdWxlcy51cmw7XG5cbiAgICAgIGlmIChhZ2VudCA9PT0gXCJjbGF1ZGVcIikge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUNsYXVkZVJ1bGVzRmlsZShjd2QsIGFjdGl2ZVJ1bGVzLnNyYywgYWN0aXZlRmV0Y2hVcmwpO1xuICAgICAgICBydWxlc0ZpbGUgPSBcIkNMQVVERS5tZFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gd3JpdGVDdXJzb3JSdWxlc0ZpbGUoY3dkLCBhY3RpdmVSdWxlcy5zcmMsIGFjdGl2ZVJ1bGVzLmZpbGUsIGFjdGl2ZUZldGNoVXJsKTtcbiAgICAgICAgcnVsZXNGaWxlID0gYC5jdXJzb3IvcnVsZXMvJHthY3RpdmVSdWxlcy5maWxlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQud3JpdHRlbikge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYFJ1bGVzIGZpbGUgd3JpdHRlbiB0byAke3J1bGVzRmlsZX0uYCk7XG4gICAgICAgIGFjdGlvbnMucHVzaChgSW50ZWdyYXRpb24gcnVsZXMgZmlsZTogJHtydWxlc0ZpbGV9YCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5za2lwcGVkKSB7XG4gICAgICAgIHNwaW5uZXIuaW5mbyhcbiAgICAgICAgICBgJHtydWxlc0ZpbGV9IGFscmVhZHkgZXhpc3RzIFx1MjAxNCBza2lwcGVkIHRvIHByZXNlcnZlIHlvdXIgY3VzdG9taXNhdGlvbnMuYFxuICAgICAgICApO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICAgIGAke3J1bGVzRmlsZX0gYWxyZWFkeSBleGlzdHMgXHUyMDE0IG5vdCBvdmVyd3JpdHRlbi5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3Qgd3JpdGUgcnVsZXMgZmlsZSBcdTIwMTQgY2hlY2sgbmV0d29yayBjb25uZWN0aXZpdHkuXCIpO1xuICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgIGBEb3dubG9hZCAke2FjdGl2ZVJ1bGVzLmZpbGV9IG1hbnVhbGx5IGZyb206ICR7YWN0aXZlRmV0Y2hVcmx9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCA0LiBQZXJtaXNzaW9uIGNoZWNrIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGlmICghdG9vbHNPbmx5KSB7XG4gICAgICBpZiAoaXNBbmRyb2lkKSB7XG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBBbmRyb2lkTWFuaWZlc3QueG1sIEJMRSBwZXJtaXNzaW9uc1x1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBjb25zdCBtYW5pZmVzdHNXaXRoSXNzdWVzID0gY2hlY2tBbmRyb2lkTWFuaWZlc3QoY3dkKTtcbiAgICAgICAgaWYgKG1hbmlmZXN0c1dpdGhJc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiQkxFIHBlcm1pc3Npb25zIGZvdW5kIGluIEFuZHJvaWRNYW5pZmVzdC54bWwuXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIkJMRSBwZXJtaXNzaW9ucyB2ZXJpZmllZCBpbiBBbmRyb2lkTWFuaWZlc3QueG1sXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcbiAgICAgICAgICAgIGBCTFVFVE9PVEhfU0NBTiBtaXNzaW5nIGZyb20gJHttYW5pZmVzdHNXaXRoSXNzdWVzLmxlbmd0aH0gQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlKHMpLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIG1hbmlmZXN0c1dpdGhJc3N1ZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKGN3ZCwgcCk7XG4gICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICBgQWRkIEJMRSBwZXJtaXNzaW9ucyB0byAke3JlbGF0aXZlfTpcXG5gICtcbiAgICAgICAgICAgICAgYCAgICAgKEFzayB0aGUgTUNQOiBcImdldF9tYW5pZmVzdF9yZXF1aXJlbWVudHNcIiBmb3IgdGhlIGZ1bGwgWE1MKWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNXaW5kb3dzKSB7XG4gICAgICAgIC8vIFdpbmRvd3MgcmVhY2hlcyBCTEUgdmlhIFdpblJUIFx1MjAxNCBubyBtYW5pZmVzdCBjYXBhYmlsaXR5IHRvIGFkZCAodW5wYWNrYWdlZFxuICAgICAgICAvLyBXaW5VSSAzIC8gV1BGKS4gVGhlIFdpLUZpL0lQIGFuZCBWZXJpZm9uZSBiYWNrZW5kcyB1c2Ugbm8gQmx1ZXRvb3RoIGF0IGFsbC5cbiAgICAgICAgYWN0aW9ucy5wdXNoKFwiQmx1ZXRvb3RoIG5lZWRzIG5vIG1hbmlmZXN0IGVudHJ5IG9uIFdpbmRvd3MgKFdpblJUKS5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgSW5mby5wbGlzdCBCTEUgcGVybWlzc2lvbnNcdTIwMjZcIikuc3RhcnQoKTtcbiAgICAgICAgY29uc3QgcGxpc3RzV2l0aElzc3VlcyA9IGNoZWNrSW5mb1BsaXN0KGN3ZCk7XG4gICAgICAgIGlmIChwbGlzdHNXaXRoSXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIkJMRSBwZXJtaXNzaW9ucyBmb3VuZCBpbiBJbmZvLnBsaXN0LlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJCTEUgcGVybWlzc2lvbnMgdmVyaWZpZWQgaW4gSW5mby5wbGlzdFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLndhcm4oXG4gICAgICAgICAgICBgTlNCbHVldG9vdGhBbHdheXNVc2FnZURlc2NyaXB0aW9uIG1pc3NpbmcgZnJvbSAke3BsaXN0c1dpdGhJc3N1ZXMubGVuZ3RofSBJbmZvLnBsaXN0IGZpbGUocykuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGxpc3RzV2l0aElzc3Vlcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUoY3dkLCBwKTtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgQkxFIHBlcm1pc3Npb24gdG8gJHtyZWxhdGl2ZX06XFxuYCArXG4gICAgICAgICAgICAgICAgYCAgICAgPGtleT5OU0JsdWV0b290aEFsd2F5c1VzYWdlRGVzY3JpcHRpb248L2tleT5cXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICA8c3RyaW5nPlRoaXMgYXBwIGNvbm5lY3RzIHRvIGEgUGF0aCBwYXltZW50IHRlcm1pbmFsIHZpYSBCbHVldG9vdGguPC9zdHJpbmc+XFxuYCArXG4gICAgICAgICAgICAgICAgYCAgICAgKEFzayB0aGUgTUNQOiBcImdldF9pbmZvX3BsaXN0X3JlcXVpcmVtZW50c1wiIGZvciB0aGUgZnVsbCBYTUwpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCA1LiBTdW1tYXJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHByaW50U3VtbWFyeShhZ2VudCwgcGxhdGZvcm0sIGFjdGlvbnMsIHdhcm5pbmdzLCBtYW51YWxTdGVwcyk7XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSx1QkFBd0I7QUFDeEIsbUJBQWtCO0FBQ2xCLFNBQW9CO0FBQ3BCLFdBQXNCO0FBQ3RCLGVBQTBCO0FBQzFCLDJCQUF5QjtBQUN6QixpQkFBZ0I7QUFFaEIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxjQUFjO0FBR3BCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sc0JBQXNCLENBQUMsb0JBQW9CLHFCQUFxQix5QkFBeUIsbUJBQW1CO0FBQ2xILE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sNEJBQTRCO0FBRWxDLE1BQU0sZUFBZSxLQUFLLEtBQUssV0FBVyxtQ0FBbUM7QUFDN0UsTUFBTSx1QkFB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
|
|
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=
|
package/dist/init.js
CHANGED
|
@@ -6111,11 +6111,11 @@ function ora(options) {
|
|
|
6111
6111
|
}
|
|
6112
6112
|
|
|
6113
6113
|
// src/cli.ts
|
|
6114
|
-
var SDK_GITHUB_URL = "https://github.com/keyman12/
|
|
6115
|
-
var SDK_VERSION = "
|
|
6114
|
+
var SDK_GITHUB_URL = "https://github.com/keyman12/Path-terminal-sdk-IOS-Release";
|
|
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.
|
|
6118
|
+
var ANDROID_SDK_VERSION = "1.6.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";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "path-terminal-init",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
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.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"path-terminal-init": "dist/cli.js"
|
|
@@ -56,10 +56,10 @@ maven { url = uri("https://mcp.path2ai.tech/maven") }
|
|
|
56
56
|
|
|
57
57
|
2. **app/build.gradle.kts** — add to `dependencies {}`:
|
|
58
58
|
```kotlin
|
|
59
|
-
implementation("tech.path2ai.sdk:path-core-models:1.
|
|
60
|
-
implementation("tech.path2ai.sdk:path-terminal-sdk:1.
|
|
61
|
-
implementation("tech.path2ai.sdk:path-emulator-adapter:1.
|
|
62
|
-
implementation("tech.path2ai.sdk:path-psdk-adapter:1.
|
|
59
|
+
implementation("tech.path2ai.sdk:path-core-models:1.6.0")
|
|
60
|
+
implementation("tech.path2ai.sdk:path-terminal-sdk:1.6.0")
|
|
61
|
+
implementation("tech.path2ai.sdk:path-emulator-adapter:1.6.0")
|
|
62
|
+
implementation("tech.path2ai.sdk:path-psdk-adapter:1.6.0") // Verifone backend (Step 2c)
|
|
63
63
|
```
|
|
64
64
|
The Verifone backend's `.aar` uses data binding, so enable it in the same file:
|
|
65
65
|
```kotlin
|
|
@@ -151,11 +151,28 @@ returns one synthetic device for the configured host, so "Apply & Connect" conne
|
|
|
151
151
|
|
|
152
152
|
#### Step 2b — Emulator over Bluetooth — scan and connect
|
|
153
153
|
|
|
154
|
+
> **⚠ Runtime permissions are MANDATORY — this is the #1 reason Bluetooth silently
|
|
155
|
+
> fails.** Declaring `BLUETOOTH_SCAN` / `BLUETOOTH_CONNECT` in the manifest is **not
|
|
156
|
+
> enough** on Android 12+ (API 31). You must **request them at runtime** before the
|
|
157
|
+
> first scan, or `discoverDevices()` finds nothing / throws and the user sees an empty
|
|
158
|
+
> list with no error. Call `get_code_example` with operation='backend-switch' and
|
|
159
|
+
> platform='android' and reproduce its `rememberBlePermission()` pattern:
|
|
160
|
+
> - Use `ActivityResultContracts.RequestMultiplePermissions()` to request
|
|
161
|
+
> `BLUETOOTH_SCAN` **and** `BLUETOOTH_CONNECT` (guarded by `Build.VERSION.SDK_INT >= S`).
|
|
162
|
+
> - Show a **"Grant Bluetooth permission"** button when not yet granted, and **gate the
|
|
163
|
+
> Scan button** on the granted state — don't let the user scan without permission.
|
|
164
|
+
> - Keep `android:usesPermissionFlags="neverForLocation"` on `BLUETOOTH_SCAN` (call
|
|
165
|
+
> `get_manifest_requirements`) so `ACCESS_FINE_LOCATION` is not also required.
|
|
166
|
+
> - Surface **"Bluetooth is turned off"** — `discoverDevices()` throws
|
|
167
|
+
> `PathError(CONNECTIVITY)` when the radio is disabled. The emulator must be in
|
|
168
|
+
> Bluetooth mode and advertise a name containing "Path".
|
|
169
|
+
|
|
154
170
|
For the BLE backend keep the scan/connect flow:
|
|
155
|
-
1. **
|
|
156
|
-
2.
|
|
157
|
-
3.
|
|
158
|
-
4.
|
|
171
|
+
1. **Grant Bluetooth permission** (runtime, per the callout above) — required before scanning
|
|
172
|
+
2. **Scan for Path Terminals** — triggers BLE discovery (only enabled once permission is granted)
|
|
173
|
+
3. Discovered devices list — each with a **Connect** button
|
|
174
|
+
4. Live connection state (Scanning / Connected / Disconnected)
|
|
175
|
+
5. **Disconnect** when connected
|
|
159
176
|
|
|
160
177
|
**Add to `PaymentTerminalAdapter` interface** (with no-op default implementations):
|
|
161
178
|
```kotlin
|
|
@@ -248,6 +265,44 @@ Call `validate_integration` with platform='android' on your code before finalisi
|
|
|
248
265
|
|
|
249
266
|
---
|
|
250
267
|
|
|
268
|
+
### Step 3b — Merchant logo on the customer display (idle branding)
|
|
269
|
+
|
|
270
|
+
The demo can push a merchant logo to the terminal's **customer-facing display** (idle/
|
|
271
|
+
attract mode). This is a real feature you MUST wire — it works on the **emulator (Wi-Fi
|
|
272
|
+
and Bluetooth)** and on Verifone. Call `get_code_example` with operation='idle-branding'
|
|
273
|
+
and platform='android' first, then reproduce the demo's proven pattern.
|
|
274
|
+
|
|
275
|
+
**The SDK API** (on `PathTerminal`, a `suspend` function):
|
|
276
|
+
```kotlin
|
|
277
|
+
suspend fun setIdleBranding(content: CustomerDisplayContent?)
|
|
278
|
+
// content: raw PNG/JPEG bytes wrapped in a class — NOT a Bitmap/base64/resource id
|
|
279
|
+
CustomerDisplayContent(imageBytes = logoBytes, caption = caption?.ifBlank { null })
|
|
280
|
+
// pass null to CLEAR the logo (when the "show logo" toggle is off)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Add a "Customer Display" section to Settings** with:
|
|
284
|
+
- A **"Show merchant logo"** toggle (persisted).
|
|
285
|
+
- A **photo picker** — `ActivityResultContracts.GetContent()` launched with `"image/*"` —
|
|
286
|
+
storing the chosen image **pre-scaled to ≤ 480px PNG** in private storage (so a fresh
|
|
287
|
+
launch still has a logo). Ship a default logo asset so it works out of the box.
|
|
288
|
+
- An optional **caption** field.
|
|
289
|
+
- An **"Apply to terminal now"** button, **enabled only when `connectionState` is Connected**.
|
|
290
|
+
|
|
291
|
+
> **CRITICAL — re-apply after every connect.** A fresh connection starts with a **blank**
|
|
292
|
+
> display. The SDK re-pushes after each sale/refund, but the *first* show is yours: call
|
|
293
|
+
> your `applyBranding()` (which calls `terminal.setIdleBranding(...)`) **right after every
|
|
294
|
+
> successful `terminal.connect()`**, not just from the button. An integration that only
|
|
295
|
+
> sets branding once, or never calls `setIdleBranding` at all, shows nothing.
|
|
296
|
+
|
|
297
|
+
> **Best-effort + backend-gated.** `setIdleBranding` returns `Unit` and swallows backend
|
|
298
|
+
> errors — **"no exception" does not prove the logo rendered**; confirm on the device.
|
|
299
|
+
> Keep the Verifone payload small (a logo, not a full-res photo) — pre-scaling to ≤ 480px
|
|
300
|
+
> PNG keeps the base64 under the ~32 000-char cap that would otherwise wedge the display.
|
|
301
|
+
|
|
302
|
+
Call `validate_integration` with platform='android' before finalising.
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
251
306
|
### Step 3.5 — Compile the changes (check the environment first)
|
|
252
307
|
|
|
253
308
|
Confirm your code compiles against the SDK's **real** API — this catches wrong method
|
|
@@ -278,18 +333,25 @@ Frame a missing build toolchain as **"here's how to verify"**, never as a failur
|
|
|
278
333
|
|
|
279
334
|
1. Confirm the Application/MainActivity injects `PathTerminalAdapter` (not the old adapter).
|
|
280
335
|
2. Confirm AndroidManifest.xml has BLUETOOTH_SCAN and BLUETOOTH_CONNECT permissions
|
|
281
|
-
(
|
|
336
|
+
(with `neverForLocation` on SCAN) **and** that the app requests them at **runtime**
|
|
337
|
+
before scanning — manifest-only is not enough on Android 12+ (Step 2b).
|
|
282
338
|
3. **Prove on the emulator first (the default path — Wi-Fi/IP):**
|
|
283
339
|
- Put the Path POS Emulator in Wi-Fi mode (Config → Connection on the device);
|
|
284
340
|
it shows its `IP:port` on the welcome screen.
|
|
285
341
|
- Run the app → Settings → Payment Terminal → backend **Emulator (Wi-Fi)** → type
|
|
286
342
|
that IP → **Apply & Connect**. connectionState should reach Connected.
|
|
287
|
-
- (Optionally also prove **Emulator (Bluetooth)**:
|
|
343
|
+
- (Optionally also prove **Emulator (Bluetooth)**: **Grant Bluetooth permission** when
|
|
344
|
+
prompted, then select it, **Scan**, **Connect**. If Scan finds nothing, the runtime
|
|
345
|
+
permission was almost certainly not granted/requested — recheck Step 2b.)
|
|
288
346
|
4. Add items to cart → Card payment → present a card / tap NFC tag on emulator when prompted.
|
|
289
347
|
5. Verify:
|
|
290
348
|
- result.state == TransactionState.APPROVED (or result.isApproved == true)
|
|
291
349
|
- result.transactionId is non-null
|
|
292
350
|
- Receipt data populated via terminal.getReceiptData(transactionId)
|
|
351
|
+
5b. **Prove the merchant logo (Step 3b):** in Settings → Customer Display, pick a logo and
|
|
352
|
+
tap **Apply to terminal now** while connected — confirm it appears on the emulator's
|
|
353
|
+
customer display. Then disconnect/reconnect and confirm it re-appears (proves you
|
|
354
|
+
re-apply after connect).
|
|
293
355
|
6. **Then prove the switch to Verifone:** select backend **Verifone**, enter the terminal's
|
|
294
356
|
IP and confirm the stored login, **Apply & Connect** — the SDK runs the PSDK init + login
|
|
295
357
|
and the same sale/refund/void flow runs against the real terminal, unchanged. (Only one
|
|
@@ -306,6 +368,10 @@ Frame a missing build toolchain as **"here's how to verify"**, never as a failur
|
|
|
306
368
|
- Handle TransactionState: APPROVED, DECLINED, TIMED_OUT, FAILED, CANCELLED
|
|
307
369
|
- For **refunds**, success state is `REFUNDED` — not `APPROVED`
|
|
308
370
|
- Catch `PathError` and check `.recoverable`
|
|
371
|
+
- Request BLE runtime permissions (`BLUETOOTH_SCAN` + `BLUETOOTH_CONNECT`) before scanning —
|
|
372
|
+
the manifest declaration alone does NOT work on Android 12+ (see Step 2b)
|
|
373
|
+
- Re-apply idle branding (`terminal.setIdleBranding(CustomerDisplayContent(imageBytes, caption))`)
|
|
374
|
+
after every successful `connect()`, not just from the button (see Step 3b)
|
|
309
375
|
- Call `validate_integration` with platform='android' before presenting code
|
|
310
376
|
- Call from coroutines — `terminal.sale()` and `terminal.refund()` are `suspend` functions
|
|
311
377
|
|
|
@@ -24,7 +24,7 @@ You have access to the Path MCP server at mcp.path2ai.tech:
|
|
|
24
24
|
> **Check whether the Swift Package is installed before doing anything else.**
|
|
25
25
|
> Run:
|
|
26
26
|
> ```
|
|
27
|
-
> find . -name "project.pbxproj" ! -path "*/DerivedData/*" ! -path "*/Pods/*" ! -path "*/.build/*" ! -path "*/SourcePackages/*" -exec grep -l "path-terminal-sdk\|PathTerminalSDK" {} +
|
|
27
|
+
> find . -name "project.pbxproj" ! -path "*/DerivedData/*" ! -path "*/Pods/*" ! -path "*/.build/*" ! -path "*/SourcePackages/*" -exec grep -l "path-terminal-sdk\|Path-terminal-sdk\|PathTerminalSDK" {} +
|
|
28
28
|
> ```
|
|
29
29
|
> (Searches the project at **any** depth — the app's `.xcodeproj` is often nested
|
|
30
30
|
> a folder or two below the repo root — so the check can't miss it. Prints the
|
|
@@ -33,7 +33,8 @@ You have access to the Path MCP server at mcp.path2ai.tech:
|
|
|
33
33
|
> package installation anywhere in your output. Proceed directly to Step 1.
|
|
34
34
|
> - **Prints nothing** — package is not yet added. Tell the developer to add it:
|
|
35
35
|
> 1. Open Xcode → **File → Add Package Dependencies…**
|
|
36
|
-
> 2. Enter URL: `https://github.com/keyman12/
|
|
36
|
+
> 2. Enter URL: `https://github.com/keyman12/Path-terminal-sdk-IOS-Release`
|
|
37
|
+
> (the compiled-SDK release repo — Xcode downloads prebuilt XCFrameworks)
|
|
37
38
|
> 3. In the **Add to Target** sheet, tick **all four** products:
|
|
38
39
|
> `PathTerminalSDK`, `PathEmulatorAdapter`, `PathCoreModels`,
|
|
39
40
|
> `PathVerifonePSDKAdapter`
|
|
@@ -196,6 +196,37 @@ Confirm the transaction methods map correctly:
|
|
|
196
196
|
|
|
197
197
|
---
|
|
198
198
|
|
|
199
|
+
### Step 3b — Merchant logo on the customer display (idle branding)
|
|
200
|
+
|
|
201
|
+
The app can push a merchant logo to the terminal's **customer-facing display** (idle/attract
|
|
202
|
+
mode). It works on the **emulator (Wi-Fi and Bluetooth)** and on Verifone. Call
|
|
203
|
+
`get_code_example` operation='idle-branding' (platform='windows') first.
|
|
204
|
+
|
|
205
|
+
**The SDK API** (on `PathTerminal`, async):
|
|
206
|
+
```csharp
|
|
207
|
+
Task SetIdleBrandingAsync(CustomerDisplayContent? content, CancellationToken ct = default);
|
|
208
|
+
// ImageBytes = raw PNG/JPEG bytes (NOT a BitmapImage / not base64); Caption is optional.
|
|
209
|
+
new CustomerDisplayContent(imageBytes, caption); // pass null content to CLEAR the logo
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Add a "Customer Display" section to Settings** with:
|
|
213
|
+
- A **"Show merchant logo"** toggle (persisted).
|
|
214
|
+
- A **file picker** (`OpenFileDialog`, `.png`/`.jpg`) storing the image **pre-scaled to ≤ 480px
|
|
215
|
+
PNG** so a fresh launch still has a logo; ship a default logo asset so it works out of the box.
|
|
216
|
+
- An optional **caption** field.
|
|
217
|
+
- An **"Apply to terminal now"** button, **enabled only when connected**.
|
|
218
|
+
|
|
219
|
+
> **CRITICAL — re-apply after every connect.** A fresh connection starts with a **blank**
|
|
220
|
+
> display. Call `SetIdleBrandingAsync(...)` **right after every successful connect**, not just
|
|
221
|
+
> from the button — otherwise the logo never appears. Pass `null` content to clear when the
|
|
222
|
+
> toggle is off. Call it with `await` from your handler — never `.Result` / `.Wait()`.
|
|
223
|
+
|
|
224
|
+
> **Best-effort + backend-gated.** `SetIdleBrandingAsync` swallows backend errors — "no
|
|
225
|
+
> exception" does not prove it rendered; confirm on the device. Keep the Verifone payload small
|
|
226
|
+
> (a logo pre-scaled to ≤ 480px PNG, not a full-res photo, so the base64 stays under the cap).
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
199
230
|
### Step 3.5 — Build to catch API mismatches (check the environment first)
|
|
200
231
|
|
|
201
232
|
Confirm your C# compiles against the SDK's **real** API. **Probe the toolchain first**, and
|
|
@@ -192,6 +192,37 @@ Confirm the transaction methods map correctly:
|
|
|
192
192
|
|
|
193
193
|
---
|
|
194
194
|
|
|
195
|
+
### Step 3b — Merchant logo on the customer display (idle branding)
|
|
196
|
+
|
|
197
|
+
The app can push a merchant logo to the terminal's **customer-facing display** (idle/attract
|
|
198
|
+
mode). It works on the **emulator (Wi-Fi and Bluetooth)** and on Verifone. Call
|
|
199
|
+
`get_code_example` operation='idle-branding' (platform='windows') first.
|
|
200
|
+
|
|
201
|
+
**The SDK API** (on `PathTerminal`, async):
|
|
202
|
+
```csharp
|
|
203
|
+
Task SetIdleBrandingAsync(CustomerDisplayContent? content, CancellationToken ct = default);
|
|
204
|
+
// ImageBytes = raw PNG/JPEG bytes (NOT a BitmapImage / not base64); Caption is optional.
|
|
205
|
+
new CustomerDisplayContent(imageBytes, caption); // pass null content to CLEAR the logo
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Add a "Customer Display" section to Settings** with:
|
|
209
|
+
- A **"Show merchant logo"** toggle (persisted).
|
|
210
|
+
- A **file picker** (`FileOpenPicker`, `.png`/`.jpg`) storing the image **pre-scaled to ≤ 480px
|
|
211
|
+
PNG** so a fresh launch still has a logo; ship a default logo asset so it works out of the box.
|
|
212
|
+
- An optional **caption** field.
|
|
213
|
+
- An **"Apply to terminal now"** button, **enabled only when connected**.
|
|
214
|
+
|
|
215
|
+
> **CRITICAL — re-apply after every connect.** A fresh connection starts with a **blank**
|
|
216
|
+
> display. Call `SetIdleBrandingAsync(...)` **right after every successful connect**, not just
|
|
217
|
+
> from the button — otherwise the logo never appears. Pass `null` content to clear when the
|
|
218
|
+
> toggle is off.
|
|
219
|
+
|
|
220
|
+
> **Best-effort + backend-gated.** `SetIdleBrandingAsync` swallows backend errors — "no
|
|
221
|
+
> exception" does not prove it rendered; confirm on the device. Keep the Verifone payload small
|
|
222
|
+
> (a logo pre-scaled to ≤ 480px PNG, not a full-res photo, so the base64 stays under the cap).
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
195
226
|
### Step 3.5 — Build to catch API mismatches (check the environment first)
|
|
196
227
|
|
|
197
228
|
Confirm your C# compiles against the SDK's **real** API. **Probe the toolchain first**, and
|