@hanzo/browser-extension 1.7.2 → 1.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/browser-extension/background-firefox.js +426 -168
  2. package/dist/browser-extension/background.js +38 -43
  3. package/dist/browser-extension/chrome/background.js +38 -43
  4. package/dist/browser-extension/chrome/manifest.json +1 -1
  5. package/dist/browser-extension/chrome/popup.js +18 -7
  6. package/dist/browser-extension/chrome/sidebar.js +12 -11
  7. package/dist/browser-extension/firefox/background.js +426 -168
  8. package/dist/browser-extension/firefox/manifest.json +1 -1
  9. package/dist/browser-extension/firefox/popup.js +18 -7
  10. package/dist/browser-extension/firefox/sidebar.js +12 -11
  11. package/dist/browser-extension/manifest.json +1 -1
  12. package/dist/browser-extension/package.json +1 -1
  13. package/dist/browser-extension/popup.js +18 -7
  14. package/dist/browser-extension/safari/background.js +38 -43
  15. package/dist/browser-extension/safari/popup.js +18 -7
  16. package/dist/browser-extension/safari/sidebar.js +12 -11
  17. package/dist/browser-extension/sidebar.js +12 -11
  18. package/dist/hanzo-ai-chrome-1.7.2.zip +0 -0
  19. package/dist/hanzo-ai-chrome-1.7.3.zip +0 -0
  20. package/dist/hanzo-ai-firefox-1.7.2.zip +0 -0
  21. package/dist/hanzo-ai-firefox-1.7.3.zip +0 -0
  22. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +295 -295
  23. package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +1 -1
  24. package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +1 -1
  25. package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +1 -1
  26. package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +1 -1
  27. package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +1 -1
  28. package/hanzo-ai-chrome-v1.7.6.zip +0 -0
  29. package/hanzo-ai-firefox-v1.7.6.zip +0 -0
  30. package/package.json +1 -1
  31. package/src/manifest-firefox.json +1 -1
  32. package/src/manifest.json +1 -1
  33. package/src/package.json +1 -1
  34. package/src/chat-widget.tsx +0 -93
  35. package/src/popup.js +0 -192
  36. package/src/sidebar.js +0 -884
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Hanzo AI",
4
- "version": "1.7.2",
4
+ "version": "1.7.6",
5
5
  "description": "AI-powered dev assistant — click-to-code navigation, source maps, WebGPU AI, and MCP integration for Claude Code.",
6
6
  "permissions": [
7
7
  "activeTab",
@@ -46,16 +46,27 @@
46
46
  loginBtn.textContent = "Signing in...";
47
47
  chrome.runtime.sendMessage({ action: "auth.login" }, (response) => {
48
48
  loginBtn.disabled = false;
49
- loginBtn.innerHTML = '<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg> Sign in with Hanzo';
49
+ loginBtn.textContent = "Sign in with Hanzo";
50
50
  if (response == null ? void 0 : response.success) {
51
51
  checkAuth();
52
+ } else {
53
+ const msg = (response == null ? void 0 : response.error) || "Unable to sign in. Please try again.";
54
+ loginBtn.textContent = msg;
55
+ setTimeout(() => {
56
+ loginBtn.textContent = "Sign in with Hanzo";
57
+ }, 3e3);
52
58
  }
53
59
  });
54
60
  });
55
61
  logoutBtn == null ? void 0 : logoutBtn.addEventListener("click", () => {
56
62
  chrome.runtime.sendMessage({ action: "auth.logout" }, () => {
57
- mainSection.classList.add("hidden");
58
63
  loginSection.classList.remove("hidden");
64
+ const avatar = document.getElementById("user-avatar");
65
+ const name = document.getElementById("user-name");
66
+ const email = document.getElementById("user-email");
67
+ if (avatar) avatar.src = "";
68
+ if (name) name.textContent = "";
69
+ if (email) email.textContent = "";
59
70
  });
60
71
  });
61
72
  openPanel == null ? void 0 : openPanel.addEventListener("click", () => {
@@ -159,11 +170,11 @@
159
170
  }
160
171
  }
161
172
  });
162
- chrome.runtime.sendMessage({ action: "runLocalAI", prompt: "" }, (response) => {
173
+ chrome.runtime.sendMessage({ action: "checkWebGPU" }, (response) => {
163
174
  if (chrome.runtime.lastError) return;
164
- gpuStatus.classList.add((response == null ? void 0 : response.success) ? "connected" : "disconnected");
165
- gpuStatus.classList.remove((response == null ? void 0 : response.success) ? "disconnected" : "connected");
166
- gpuDetail.textContent = (response == null ? void 0 : response.success) ? "Available" : "Not available";
175
+ gpuStatus.classList.add((response == null ? void 0 : response.available) ? "connected" : "disconnected");
176
+ gpuStatus.classList.remove((response == null ? void 0 : response.available) ? "disconnected" : "connected");
177
+ gpuDetail.textContent = (response == null ? void 0 : response.available) ? response.adapter || "Available" : "Not available";
167
178
  });
168
179
  mcpStatus.classList.add("connected");
169
180
  mcpPort.textContent = "Fallback";
@@ -264,4 +275,4 @@
264
275
  checkAuth();
265
276
  });
266
277
  })();
267
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3BvcHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBIYW56byBBSSBcdTIwMTQgUG9wdXAgU2NyaXB0XG4vLyBVc2VzIGJhY2tncm91bmQgbWVzc2FnZSBwYXNzaW5nIGZvciBhdXRoIChub3QgZGlyZWN0IHN0b3JhZ2UgYWNjZXNzKS5cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgY29uc3QgbG9naW5TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLXNlY3Rpb24nKTtcbiAgY29uc3QgbWFpblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1zZWN0aW9uJyk7XG4gIGNvbnN0IHNldHRpbmdzU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1zZWN0aW9uJyk7XG5cbiAgLy8gQXV0aFxuICBjb25zdCBsb2dpbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi1idG4nKTtcbiAgY29uc3QgbG9nb3V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ291dC1idG4nKTtcblxuICAvLyBPcGVuIHBhbmVsXG4gIGNvbnN0IG9wZW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuLXBhbmVsJyk7XG4gIGNvbnN0IG9wZW5QYWdlT3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuLXBhZ2Utb3ZlcmxheScpO1xuXG4gIC8vIFN0YXR1cyBkb3RzXG4gIGNvbnN0IHphcFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtc3RhdHVzJyk7XG4gIGNvbnN0IHphcERldGFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtZGV0YWlsJyk7XG4gIGNvbnN0IG1jcFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3Atc3RhdHVzJyk7XG4gIGNvbnN0IG1jcFBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWNwLXBvcnQnKTtcbiAgY29uc3QgY2RwU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NkcC1zdGF0dXMnKTtcbiAgY29uc3QgY2RwRGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NkcC1kZXRhaWwnKTtcbiAgY29uc3QgZ3B1U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1zdGF0dXMnKTtcbiAgY29uc3QgZ3B1RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1kZXRhaWwnKTtcblxuICAvLyBTZXR0aW5nc1xuICBjb25zdCBvcGVuU2V0dGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3Blbi1zZXR0aW5ncycpO1xuICBjb25zdCBiYWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2stYnRuJyk7XG4gIGNvbnN0IHNhdmVTZXR0aW5ncyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLXNldHRpbmdzJyk7XG4gIGNvbnN0IHRlc3RDb25uZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QtY29ubmVjdGlvbicpO1xuXG4gIC8vIC0tLSBBdXRoIHZpYSBiYWNrZ3JvdW5kIC0tLVxuICBmdW5jdGlvbiBjaGVja0F1dGgoKSB7XG4gICAgLy8gQWx3YXlzIHNob3cgbWFpbiBzZWN0aW9uIGFuZCBzdGF0dXMgKHRvb2xzIHdvcmsgd2l0aG91dCBsb2dpbilcbiAgICBtYWluU2VjdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByZWZyZXNoU3RhdHVzKCk7XG5cbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguc3RhdHVzJyB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHJldHVybjtcbiAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZS5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIGxvZ2luU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnVzZXIpIHtcbiAgICAgICAgICBjb25zdCBhdmF0YXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1hdmF0YXInKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbmFtZScpO1xuICAgICAgICAgIGNvbnN0IGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItZW1haWwnKTtcbiAgICAgICAgICBhdmF0YXIuc3JjID0gcmVzcG9uc2UudXNlci5waWN0dXJlIHx8IHJlc3BvbnNlLnVzZXIuYXZhdGFyIHx8ICdpY29uNDgucG5nJztcbiAgICAgICAgICBuYW1lLnRleHRDb250ZW50ID0gcmVzcG9uc2UudXNlci5uYW1lIHx8IHJlc3BvbnNlLnVzZXIuZGlzcGxheU5hbWUgfHwgJ0hhbnpvIFVzZXInO1xuICAgICAgICAgIGVtYWlsLnRleHRDb250ZW50ID0gcmVzcG9uc2UudXNlci5lbWFpbCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9naW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9naW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvZ2luQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBsb2dpbkJ0bi50ZXh0Q29udGVudCA9ICdTaWduaW5nIGluLi4uJztcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGgubG9naW4nIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgbG9naW5CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGxvZ2luQnRuLmlubmVySFRNTCA9ICc8c3ZnIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCJNMTUgM2g0YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMmgtNE0xMCAxN2w1LTUtNS01TTE1IDEySDNcIi8+PC9zdmc+IFNpZ24gaW4gd2l0aCBIYW56byc7XG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgY2hlY2tBdXRoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGxvZ291dEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmxvZ291dCcgfSwgKCkgPT4ge1xuICAgICAgbWFpblNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICBsb2dpblNlY3Rpb24uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLSBPcGVuIHNpZGUgcGFuZWwgLS0tXG4gIG9wZW5QYW5lbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGNocm9tZS5zaWRlUGFuZWwpIHtcbiAgICAgIGNocm9tZS50YWJzLnF1ZXJ5KHsgYWN0aXZlOiB0cnVlLCBjdXJyZW50V2luZG93OiB0cnVlIH0sICh0YWJzKSA9PiB7XG4gICAgICAgIGlmICh0YWJzWzBdPy5pZCkge1xuICAgICAgICAgIGNocm9tZS5zaWRlUGFuZWwub3Blbih7IHRhYklkOiB0YWJzWzBdLmlkIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmlyZWZveDogc2lkZWJhcl9hY3Rpb24gaXMgYXV0b21hdGljXG4gICAgICB3aW5kb3cuY2xvc2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGlzSW5qZWN0YWJsZVRhYih0YWI6IGNocm9tZS50YWJzLlRhYiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGFiIHx8ICF0YWIuaWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB1cmwgPSB0YWIudXJsIHx8ICcnO1xuICAgIGlmICghdXJsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdjaHJvbWU6Ly8nKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnY2hyb21lLWV4dGVuc2lvbjovLycpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdkZXZ0b29sczovLycpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdlZGdlOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2Fib3V0OicpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCd2aWV3LXNvdXJjZTonKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnbW96LWV4dGVuc2lvbjovLycpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvcGVuUGFnZU92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9ICdPcGVuaW5nLi4uJztcbiAgICBvcGVuUGFnZU92ZXJsYXkuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG5cbiAgICBjaHJvbWUudGFicy5xdWVyeSh7IGFjdGl2ZTogdHJ1ZSwgY3VycmVudFdpbmRvdzogdHJ1ZSB9LCAodGFicykgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGFic1swXTtcbiAgICAgIGxldCB0YXJnZXRUYWIgPSBpc0luamVjdGFibGVUYWIoYWN0aXZlVGFiKSA/IGFjdGl2ZVRhYiA6IG51bGw7XG5cbiAgICAgIGlmICghdGFyZ2V0VGFiKSB7XG4gICAgICAgIGNocm9tZS50YWJzLnF1ZXJ5KHsgY3VycmVudFdpbmRvdzogdHJ1ZSB9LCAoYWxsVGFicykgPT4ge1xuICAgICAgICAgIHRhcmdldFRhYiA9IGFsbFRhYnMuZmluZCgodGFiKSA9PiBpc0luamVjdGFibGVUYWIodGFiKSkgfHwgbnVsbDtcbiAgICAgICAgICBpZiAoIXRhcmdldFRhYj8uaWQpIHtcbiAgICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9ICdObyB2YWxpZCBwYWdlIHRhYic7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ1RvZ2dsZSBPbi1QYWdlIE92ZXJsYXknO1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgfSwgMTIwMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdwYWdlLm92ZXJsYXkudG9nZ2xlJywgdGFiSWQ6IHRhcmdldFRhYi5pZCB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IgfHwgIXJlc3BvbnNlPy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9ICdVbmF2YWlsYWJsZSBvbiB0aGlzIHBhZ2UnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3BlbmVkID0gISFyZXNwb25zZT8ub3BlbjtcbiAgICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gb3BlbmVkID8gJ092ZXJsYXkgT3BlbmVkJyA6ICdPdmVybGF5IEhpZGRlbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ1RvZ2dsZSBPbi1QYWdlIE92ZXJsYXknO1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgfSwgOTAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0YXJnZXRUYWI/LmlkKSB7XG4gICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9ICdObyBBY3RpdmUgVGFiJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ1RvZ2dsZSBPbi1QYWdlIE92ZXJsYXknO1xuICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0sIDEyMDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAncGFnZS5vdmVybGF5LnRvZ2dsZScsIHRhYklkOiB0YXJnZXRUYWIuaWQgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IgfHwgIXJlc3BvbnNlPy5zdWNjZXNzKSB7XG4gICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ1VuYXZhaWxhYmxlIG9uIHRoaXMgcGFnZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmVkID0gISFyZXNwb25zZT8ub3BlbjtcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSBvcGVuZWQgPyAnT3ZlcmxheSBPcGVuZWQnIDogJ092ZXJsYXkgSGlkZGVuJztcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgfSwgOTAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0gU3RhdHVzIC0tLVxuICBmdW5jdGlvbiByZWZyZXNoU3RhdHVzKCkge1xuICAgIC8vIFpBUCBzdGF0dXNcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ3phcC5zdGF0dXMnIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikgcmV0dXJuO1xuICAgICAgaWYgKHJlc3BvbnNlPy5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHphcCA9IHJlc3BvbnNlLnphcDtcbiAgICAgICAgaWYgKHphcC5jb25uZWN0ZWQpIHtcbiAgICAgICAgICB6YXBTdGF0dXMuY2xhc3NMaXN0LmFkZCgnY29ubmVjdGVkJyk7XG4gICAgICAgICAgemFwU3RhdHVzLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgIGNvbnN0IG1jcENvdW50ID0gemFwLm1jcHM/Lmxlbmd0aCB8fCAwO1xuICAgICAgICAgIGNvbnN0IHRvb2xDb3VudCA9IHphcC5tY3BzPy5yZWR1Y2UoKHN1bSwgbSkgPT4gc3VtICsgKG0udG9vbHM/Lmxlbmd0aCB8fCAwKSwgMCkgfHwgMDtcbiAgICAgICAgICB6YXBEZXRhaWwudGV4dENvbnRlbnQgPSBgJHttY3BDb3VudH0gTUNQKHMpLCAke3Rvb2xDb3VudH0gdG9vbHNgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHphcFN0YXR1cy5jbGFzc0xpc3QucmVtb3ZlKCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICB6YXBTdGF0dXMuY2xhc3NMaXN0LmFkZCgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgemFwRGV0YWlsLnRleHRDb250ZW50ID0gJ05vdCBjb25uZWN0ZWQnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBHUFUgc3RhdHVzXG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdydW5Mb2NhbEFJJywgcHJvbXB0OiAnJyB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHJldHVybjtcbiAgICAgIGdwdVN0YXR1cy5jbGFzc0xpc3QuYWRkKHJlc3BvbnNlPy5zdWNjZXNzID8gJ2Nvbm5lY3RlZCcgOiAnZGlzY29ubmVjdGVkJyk7XG4gICAgICBncHVTdGF0dXMuY2xhc3NMaXN0LnJlbW92ZShyZXNwb25zZT8uc3VjY2VzcyA/ICdkaXNjb25uZWN0ZWQnIDogJ2Nvbm5lY3RlZCcpO1xuICAgICAgZ3B1RGV0YWlsLnRleHRDb250ZW50ID0gcmVzcG9uc2U/LnN1Y2Nlc3MgPyAnQXZhaWxhYmxlJyA6ICdOb3QgYXZhaWxhYmxlJztcbiAgICB9KTtcblxuICAgIC8vIE1DUC9DRFAgXHUyMDE0IHNldCBhcyBhY3RpdmUgZm9yIG5vdyAoY2hlY2tlZCB2aWEgWkFQKVxuICAgIG1jcFN0YXR1cy5jbGFzc0xpc3QuYWRkKCdjb25uZWN0ZWQnKTtcbiAgICBtY3BQb3J0LnRleHRDb250ZW50ID0gJ0ZhbGxiYWNrJztcbiAgICBjZHBTdGF0dXMuY2xhc3NMaXN0LmFkZCgnY29ubmVjdGVkJyk7XG4gICAgY2RwRGV0YWlsLnRleHRDb250ZW50ID0gJ0FjdGl2ZSc7XG4gIH1cblxuICAvLyAtLS0gU2V0dGluZ3MgLS0tXG4gIG9wZW5TZXR0aW5ncz8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbWFpblNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgc2V0dGluZ3NTZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgIGxvYWRTZXR0aW5ncygpO1xuICB9KTtcblxuICBiYWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzZXR0aW5nc1NlY3Rpb24uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgbWFpblNlY3Rpb24uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGxvYWRTZXR0aW5ncygpIHtcbiAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoWydtY3BQb3J0JywgJ2NkcFBvcnQnLCAnemFwUG9ydHMnXSwgKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgbWNwUG9ydElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC1wb3J0LXNldHRpbmcnKTtcbiAgICAgIGNvbnN0IGNkcFBvcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZHAtcG9ydC1zZXR0aW5nJyk7XG4gICAgICBjb25zdCB6YXBQb3J0c0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3phcC1wb3J0cy1zZXR0aW5nJyk7XG5cbiAgICAgIGlmIChtY3BQb3J0SW5wdXQpIG1jcFBvcnRJbnB1dC52YWx1ZSA9IHJlc3VsdC5tY3BQb3J0IHx8IDMwMDE7XG4gICAgICBpZiAoY2RwUG9ydElucHV0KSBjZHBQb3J0SW5wdXQudmFsdWUgPSByZXN1bHQuY2RwUG9ydCB8fCA5MjIzO1xuICAgICAgaWYgKHphcFBvcnRzSW5wdXQpIHphcFBvcnRzSW5wdXQudmFsdWUgPSAocmVzdWx0LnphcFBvcnRzIHx8IFs5OTk5LCA5OTk4LCA5OTk3LCA5OTk2LCA5OTk1XSkuam9pbignLCcpO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZVNldHRpbmdzPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBtY3BQb3J0VmFsID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC1wb3J0LXNldHRpbmcnKT8udmFsdWUpIHx8IDMwMDE7XG4gICAgY29uc3QgY2RwUG9ydFZhbCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZHAtcG9ydC1zZXR0aW5nJyk/LnZhbHVlKSB8fCA5MjIzO1xuICAgIGNvbnN0IHphcFBvcnRzVmFsID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtcG9ydHMtc2V0dGluZycpPy52YWx1ZSB8fCAnJylcbiAgICAgIC5zcGxpdCgnLCcpLm1hcChwID0+IHBhcnNlSW50KHAudHJpbSgpKSkuZmlsdGVyKHAgPT4gcCA+IDAgJiYgcCA8IDY1NTM2KTtcblxuICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XG4gICAgICBtY3BQb3J0OiBtY3BQb3J0VmFsLFxuICAgICAgY2RwUG9ydDogY2RwUG9ydFZhbCxcbiAgICAgIHphcFBvcnRzOiB6YXBQb3J0c1ZhbC5sZW5ndGggPyB6YXBQb3J0c1ZhbCA6IFs5OTk5LCA5OTk4LCA5OTk3LCA5OTk2LCA5OTk1XSxcbiAgICB9LCAoKSA9PiB7XG4gICAgICBzYXZlU2V0dGluZ3MudGV4dENvbnRlbnQgPSAnU2F2ZWQhJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBzYXZlU2V0dGluZ3MudGV4dENvbnRlbnQgPSAnU2F2ZSBTZXR0aW5ncyc7IH0sIDE1MDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0gVGVzdCBDb25uZWN0aW9uIC0tLVxuICB0ZXN0Q29ubmVjdGlvbj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgdGVzdENvbm5lY3Rpb24udGV4dENvbnRlbnQgPSAnVGVzdGluZy4uLic7XG4gICAgdGVzdENvbm5lY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICd6YXAuZGlzY292ZXInIH0sICgpID0+IHtcbiAgICAgIHJlZnJlc2hTdGF0dXMoKTtcbiAgICAgIHRlc3RDb25uZWN0aW9uLnRleHRDb250ZW50ID0gJ1Rlc3QgQ29ubmVjdGlvbic7XG4gICAgICB0ZXN0Q29ubmVjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBGZWF0dXJlIHRvZ2dsZXNcbiAgWydzb3VyY2UtbWFwcycsICd3ZWJncHUtYWknLCAnYnJvd3Nlci1jb250cm9sJywgJ3RhYi1maWxlc3lzdGVtJ10uZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGNoZWNrYm94KSB7XG4gICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoW2lkXSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gcmVzdWx0W2lkXSAhPT0gZmFsc2U7IC8vIGRlZmF1bHQgb25cbiAgICAgIH0pO1xuICAgICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoeyBbaWRdOiBjaGVja2JveC5jaGVja2VkIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyAtLS0gQnJvd3NlciBCYWNrZW5kIFBpY2tlciAtLS1cbiAgY29uc3QgYmFja2VuZFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicm93c2VyLWJhY2tlbmQnKSBhcyBIVE1MU2VsZWN0RWxlbWVudCB8IG51bGw7XG4gIGNvbnN0IGJyaWRnZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmlkZ2Utc3RhdHVzJyk7XG4gIGNvbnN0IGJyaWRnZURldGFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmlkZ2UtZGV0YWlsJyk7XG5cbiAgZnVuY3Rpb24gbG9hZEJhY2tlbmRQcmVmZXJlbmNlKCkge1xuICAgIGNocm9tZS5zdG9yYWdlLnN5bmMuZ2V0KFsnYnJvd3NlckJhY2tlbmQnXSwgKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKGJhY2tlbmRTZWxlY3QgJiYgcmVzdWx0LmJyb3dzZXJCYWNrZW5kKSB7XG4gICAgICAgIGJhY2tlbmRTZWxlY3QudmFsdWUgPSByZXN1bHQuYnJvd3NlckJhY2tlbmQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoQnJpZGdlU3RhdHVzKCkge1xuICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYnJpZGdlLnN0YXR1cycgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSByZXR1cm47XG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MgJiYgcmVzcG9uc2UuY29ubmVjdGVkKSB7XG4gICAgICAgIGJyaWRnZVN0YXR1cz8uY2xhc3NMaXN0LmFkZCgnY29ubmVjdGVkJyk7XG4gICAgICAgIGJyaWRnZVN0YXR1cz8uY2xhc3NMaXN0LnJlbW92ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJzID0gcmVzcG9uc2UuYnJvd3NlcnMgfHwgW107XG4gICAgICAgIGJyaWRnZURldGFpbC50ZXh0Q29udGVudCA9IGJyb3dzZXJzLmxlbmd0aFxuICAgICAgICAgID8gYENvbm5lY3RlZDogJHticm93c2Vycy5qb2luKCcsICcpfWBcbiAgICAgICAgICA6ICdDb25uZWN0ZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJpZGdlU3RhdHVzPy5jbGFzc0xpc3QucmVtb3ZlKCdjb25uZWN0ZWQnKTtcbiAgICAgICAgYnJpZGdlU3RhdHVzPy5jbGFzc0xpc3QuYWRkKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgYnJpZGdlRGV0YWlsLnRleHRDb250ZW50ID0gJ05vdCBjb25uZWN0ZWQnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYmFja2VuZFNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYmFja2VuZFNlbGVjdC52YWx1ZTtcblxuICAgIC8vIFNhdmUgdG8gY2hyb21lLnN0b3JhZ2Uuc3luYyAoY3Jvc3MtZGV2aWNlKVxuICAgIGNocm9tZS5zdG9yYWdlLnN5bmMuc2V0KHsgYnJvd3NlckJhY2tlbmQ6IHZhbHVlIH0pO1xuXG4gICAgLy8gRm9yd2FyZCB0byBiYWNrZ3JvdW5kIHRvIHBlcnNpc3QgdmlhIENEUCBicmlkZ2UgKyBzeW5jIHRvIElBTVxuICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHtcbiAgICAgIGFjdGlvbjogJ2NvbmZpZy5zYXZlJyxcbiAgICAgIGtleTogJ2Jyb3dzZXJCYWNrZW5kJyxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuICBsb2FkQmFja2VuZFByZWZlcmVuY2UoKTtcbiAgcmVmcmVzaEJyaWRnZVN0YXR1cygpO1xuXG4gIC8vIEluaXRcbiAgY2hlY2tBdXRoKCk7XG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUdBLFdBQVMsaUJBQWlCLG9CQUFvQixNQUFNO0FBQ2xELFVBQU0sZUFBZSxTQUFTLGVBQWUsZUFBZTtBQUM1RCxVQUFNLGNBQWMsU0FBUyxlQUFlLGNBQWM7QUFDMUQsVUFBTSxrQkFBa0IsU0FBUyxlQUFlLGtCQUFrQjtBQUdsRSxVQUFNLFdBQVcsU0FBUyxlQUFlLFdBQVc7QUFDcEQsVUFBTSxZQUFZLFNBQVMsZUFBZSxZQUFZO0FBR3RELFVBQU0sWUFBWSxTQUFTLGVBQWUsWUFBWTtBQUN0RCxVQUFNLGtCQUFrQixTQUFTLGVBQWUsbUJBQW1CO0FBR25FLFVBQU0sWUFBWSxTQUFTLGVBQWUsWUFBWTtBQUN0RCxVQUFNLFlBQVksU0FBUyxlQUFlLFlBQVk7QUFDdEQsVUFBTSxZQUFZLFNBQVMsZUFBZSxZ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QUUsR0FBRyxDQUFDLFdBQVc7QUFDekMsbUJBQVMsVUFBVSxPQUFPLEVBQUUsTUFBTTtBQUFBLFFBQ3BDLENBQUM7QUFDRCxpQkFBUyxpQkFBaUIsVUFBVSxNQUFNO0FBQ3hDLGlCQUFPLFFBQVEsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxRQUFRLENBQUM7QUFBQSxRQUNyRCxDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0YsQ0FBQztBQUdELFVBQU0sZ0JBQWdCLFNBQVMsZUFBZSxpQkFBaUI7QUFDL0QsVUFBTSxlQUFlLFNBQVMsZUFBZSxlQUFlO0FBQzVELFVBQU0sZUFBZSxTQUFTLGVBQWUsZUFBZTtBQUU1RCxhQUFTLHdCQUF3QjtBQUMvQixhQUFPLFFBQVEsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxXQUFXO0FBQ3RELFlBQUksaUJBQWlCLE9BQU8sZ0JBQWdCO0FBQzFDLHdCQUFjLFFBQVEsT0FBTztBQUFBLFFBQy9CO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLGFBQVMsc0JBQXNCO0FBQzdCLGFBQU8sUUFBUSxZQUFZLEVBQUUsUUFBUSxnQkFBZ0IsR0FBRyxDQUFDLGFBQWE7QUFDcEUsWUFBSSxPQUFPLFFBQVEsVUFBVztBQUM5QixhQUFJLHFDQUFVLFlBQVcsU0FBUyxXQUFXO0FBQzNDLHVEQUFjLFVBQVUsSUFBSTtBQUM1Qix1REFBYyxVQUFVLE9BQU87QUFDL0IsZ0JBQU0sV0FBVyxTQUFTLFlBQVksQ0FBQztBQUN2Qyx1QkFBYSxjQUFjLFNBQVMsU0FDaEMsY0FBYyxTQUFTLEtBQUssSUFBSSxDQUFDLEtBQ2pDO0FBQUEsUUFDTixPQUFPO0FBQ0wsdURBQWMsVUFBVSxPQUFPO0FBQy9CLHVEQUFjLFVBQVUsSUFBSTtBQUM1Qix1QkFBYSxjQUFjO0FBQUEsUUFDN0I7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBRUEsbURBQWUsaUJBQWlCLFVBQVUsTUFBTTtBQUM5QyxZQUFNLFFBQVEsY0FBYztBQUc1QixhQUFPLFFBQVEsS0FBSyxJQUFJLEVBQUUsZ0JBQWdCLE1BQU0sQ0FBQztBQUdqRCxhQUFPLFFBQVEsWUFBWTtBQUFBLFFBQ3pCLFFBQVE7QUFBQSxRQUNSLEtBQUs7QUFBQSxRQUNMO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLDBCQUFzQjtBQUN0Qix3QkFBb0I7QUFHcEIsY0FBVTtBQUFBLEVBQ1osQ0FBQzsiLAogICJuYW1lcyI6IFsiX2EiXQp9Cg==
278
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3BvcHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBIYW56byBBSSBcdTIwMTQgUG9wdXAgU2NyaXB0XG4vLyBVc2VzIGJhY2tncm91bmQgbWVzc2FnZSBwYXNzaW5nIGZvciBhdXRoIChub3QgZGlyZWN0IHN0b3JhZ2UgYWNjZXNzKS5cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgY29uc3QgbG9naW5TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLXNlY3Rpb24nKTtcbiAgY29uc3QgbWFpblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1zZWN0aW9uJyk7XG4gIGNvbnN0IHNldHRpbmdzU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1zZWN0aW9uJyk7XG5cbiAgLy8gQXV0aFxuICBjb25zdCBsb2dpbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi1idG4nKTtcbiAgY29uc3QgbG9nb3V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ291dC1idG4nKTtcblxuICAvLyBPcGVuIHBhbmVsXG4gIGNvbnN0IG9wZW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuLXBhbmVsJyk7XG4gIGNvbnN0IG9wZW5QYWdlT3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuLXBhZ2Utb3ZlcmxheScpO1xuXG4gIC8vIFN0YXR1cyBkb3RzXG4gIGNvbnN0IHphcFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtc3RhdHVzJyk7XG4gIGNvbnN0IHphcERldGFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtZGV0YWlsJyk7XG4gIGNvbnN0IG1jcFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3Atc3RhdHVzJyk7XG4gIGNvbnN0IG1jcFBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWNwLXBvcnQnKTtcbiAgY29uc3QgY2RwU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NkcC1zdGF0dXMnKTtcbiAgY29uc3QgY2RwRGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NkcC1kZXRhaWwnKTtcbiAgY29uc3QgZ3B1U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1zdGF0dXMnKTtcbiAgY29uc3QgZ3B1RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1kZXRhaWwnKTtcblxuICAvLyBTZXR0aW5nc1xuICBjb25zdCBvcGVuU2V0dGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3Blbi1zZXR0aW5ncycpO1xuICBjb25zdCBiYWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2stYnRuJyk7XG4gIGNvbnN0IHNhdmVTZXR0aW5ncyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLXNldHRpbmdzJyk7XG4gIGNvbnN0IHRlc3RDb25uZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QtY29ubmVjdGlvbicpO1xuXG4gIC8vIC0tLSBBdXRoIHZpYSBiYWNrZ3JvdW5kIC0tLVxuICBmdW5jdGlvbiBjaGVja0F1dGgoKSB7XG4gICAgLy8gQWx3YXlzIHNob3cgbWFpbiBzZWN0aW9uIGFuZCBzdGF0dXMgKHRvb2xzIHdvcmsgd2l0aG91dCBsb2dpbilcbiAgICBtYWluU2VjdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByZWZyZXNoU3RhdHVzKCk7XG5cbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguc3RhdHVzJyB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHJldHVybjtcbiAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZS5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIGxvZ2luU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnVzZXIpIHtcbiAgICAgICAgICBjb25zdCBhdmF0YXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1hdmF0YXInKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbmFtZScpO1xuICAgICAgICAgIGNvbnN0IGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItZW1haWwnKTtcbiAgICAgICAgICBhdmF0YXIuc3JjID0gcmVzcG9uc2UudXNlci5waWN0dXJlIHx8IHJlc3BvbnNlLnVzZXIuYXZhdGFyIHx8ICdpY29uNDgucG5nJztcbiAgICAgICAgICBuYW1lLnRleHRDb250ZW50ID0gcmVzcG9uc2UudXNlci5uYW1lIHx8IHJlc3BvbnNlLnVzZXIuZGlzcGxheU5hbWUgfHwgJ0hhbnpvIFVzZXInO1xuICAgICAgICAgIGVtYWlsLnRleHRDb250ZW50ID0gcmVzcG9uc2UudXNlci5lbWFpbCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9naW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9naW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvZ2luQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBsb2dpbkJ0bi50ZXh0Q29udGVudCA9ICdTaWduaW5nIGluLi4uJztcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGgubG9naW4nIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgbG9naW5CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGxvZ2luQnRuLnRleHRDb250ZW50ID0gJ1NpZ24gaW4gd2l0aCBIYW56byc7XG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgY2hlY2tBdXRoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtc2cgPSByZXNwb25zZT8uZXJyb3IgfHwgJ1VuYWJsZSB0byBzaWduIGluLiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgIGxvZ2luQnRuLnRleHRDb250ZW50ID0gbXNnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbG9naW5CdG4udGV4dENvbnRlbnQgPSAnU2lnbiBpbiB3aXRoIEhhbnpvJzsgfSwgMzAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGxvZ291dEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmxvZ291dCcgfSwgKCkgPT4ge1xuICAgICAgbG9naW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgICAgLy8gS2VlcCBtYWluIHNlY3Rpb24gdmlzaWJsZSBcdTIwMTQgdG9vbHMgd29yayB3aXRob3V0IGF1dGhcbiAgICAgIGNvbnN0IGF2YXRhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLWF2YXRhcicpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbmFtZScpO1xuICAgICAgY29uc3QgZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1lbWFpbCcpO1xuICAgICAgaWYgKGF2YXRhcikgYXZhdGFyLnNyYyA9ICcnO1xuICAgICAgaWYgKG5hbWUpIG5hbWUudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIGlmIChlbWFpbCkgZW1haWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tIE9wZW4gc2lkZSBwYW5lbCAtLS1cbiAgb3BlblBhbmVsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY2hyb21lLnNpZGVQYW5lbCkge1xuICAgICAgY2hyb21lLnRhYnMucXVlcnkoeyBhY3RpdmU6IHRydWUsIGN1cnJlbnRXaW5kb3c6IHRydWUgfSwgKHRhYnMpID0+IHtcbiAgICAgICAgaWYgKHRhYnNbMF0/LmlkKSB7XG4gICAgICAgICAgY2hyb21lLnNpZGVQYW5lbC5vcGVuKHsgdGFiSWQ6IHRhYnNbMF0uaWQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaXJlZm94OiBzaWRlYmFyX2FjdGlvbiBpcyBhdXRvbWF0aWNcbiAgICAgIHdpbmRvdy5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gaXNJbmplY3RhYmxlVGFiKHRhYjogY2hyb21lLnRhYnMuVGFiIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0YWIgfHwgIXRhYi5pZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHVybCA9IHRhYi51cmwgfHwgJyc7XG4gICAgaWYgKCF1cmwpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2Nocm9tZTovLycpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2RldnRvb2xzOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2VkZ2U6Ly8nKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnYWJvdXQ6JykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ3ZpZXctc291cmNlOicpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdtb3otZXh0ZW5zaW9uOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9wZW5QYWdlT3ZlcmxheT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ09wZW5pbmcuLi4nO1xuICAgIG9wZW5QYWdlT3ZlcmxheS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcblxuICAgIGNocm9tZS50YWJzLnF1ZXJ5KHsgYWN0aXZlOiB0cnVlLCBjdXJyZW50V2luZG93OiB0cnVlIH0sICh0YWJzKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmVUYWIgPSB0YWJzWzBdO1xuICAgICAgbGV0IHRhcmdldFRhYiA9IGlzSW5qZWN0YWJsZVRhYihhY3RpdmVUYWIpID8gYWN0aXZlVGFiIDogbnVsbDtcblxuICAgICAgaWYgKCF0YXJnZXRUYWIpIHtcbiAgICAgICAgY2hyb21lLnRhYnMucXVlcnkoeyBjdXJyZW50V2luZG93OiB0cnVlIH0sIChhbGxUYWJzKSA9PiB7XG4gICAgICAgICAgdGFyZ2V0VGFiID0gYWxsVGFicy5maW5kKCh0YWIpID0+IGlzSW5qZWN0YWJsZVRhYih0YWIpKSB8fCBudWxsO1xuICAgICAgICAgIGlmICghdGFyZ2V0VGFiPy5pZCkge1xuICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ05vIHZhbGlkIHBhZ2UgdGFiJztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9LCAxMjAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ3BhZ2Uub3ZlcmxheS50b2dnbGUnLCB0YWJJZDogdGFyZ2V0VGFiLmlkIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvciB8fCAhcmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ1VuYXZhaWxhYmxlIG9uIHRoaXMgcGFnZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBvcGVuZWQgPSAhIXJlc3BvbnNlPy5vcGVuO1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSBvcGVuZWQgPyAnT3ZlcmxheSBPcGVuZWQnIDogJ092ZXJsYXkgSGlkZGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9LCA5MDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRhcmdldFRhYj8uaWQpIHtcbiAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ05vIEFjdGl2ZSBUYWInO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgfSwgMTIwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdwYWdlLm92ZXJsYXkudG9nZ2xlJywgdGFiSWQ6IHRhcmdldFRhYi5pZCB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvciB8fCAhcmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVW5hdmFpbGFibGUgb24gdGhpcyBwYWdlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvcGVuZWQgPSAhIXJlc3BvbnNlPy5vcGVuO1xuICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9IG9wZW5lZCA/ICdPdmVybGF5IE9wZW5lZCcgOiAnT3ZlcmxheSBIaWRkZW4nO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9ICdUb2dnbGUgT24tUGFnZSBPdmVybGF5JztcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICB9LCA5MDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLSBTdGF0dXMgLS0tXG4gIGZ1bmN0aW9uIHJlZnJlc2hTdGF0dXMoKSB7XG4gICAgLy8gWkFQIHN0YXR1c1xuICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnemFwLnN0YXR1cycgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSByZXR1cm47XG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgemFwID0gcmVzcG9uc2UuemFwO1xuICAgICAgICBpZiAoemFwLmNvbm5lY3RlZCkge1xuICAgICAgICAgIHphcFN0YXR1cy5jbGFzc0xpc3QuYWRkKCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICB6YXBTdGF0dXMuY2xhc3NMaXN0LnJlbW92ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgY29uc3QgbWNwQ291bnQgPSB6YXAubWNwcz8ubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgY29uc3QgdG9vbENvdW50ID0gemFwLm1jcHM/LnJlZHVjZSgoc3VtLCBtKSA9PiBzdW0gKyAobS50b29scz8ubGVuZ3RoIHx8IDApLCAwKSB8fCAwO1xuICAgICAgICAgIHphcERldGFpbC50ZXh0Q29udGVudCA9IGAke21jcENvdW50fSBNQ1AocyksICR7dG9vbENvdW50fSB0b29sc2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgemFwU3RhdHVzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgIHphcFN0YXR1cy5jbGFzc0xpc3QuYWRkKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICB6YXBEZXRhaWwudGV4dENvbnRlbnQgPSAnTm90IGNvbm5lY3RlZCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEdQVSBzdGF0dXNcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2NoZWNrV2ViR1BVJyB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHJldHVybjtcbiAgICAgIGdwdVN0YXR1cy5jbGFzc0xpc3QuYWRkKHJlc3BvbnNlPy5hdmFpbGFibGUgPyAnY29ubmVjdGVkJyA6ICdkaXNjb25uZWN0ZWQnKTtcbiAgICAgIGdwdVN0YXR1cy5jbGFzc0xpc3QucmVtb3ZlKHJlc3BvbnNlPy5hdmFpbGFibGUgPyAnZGlzY29ubmVjdGVkJyA6ICdjb25uZWN0ZWQnKTtcbiAgICAgIGdwdURldGFpbC50ZXh0Q29udGVudCA9IHJlc3BvbnNlPy5hdmFpbGFibGUgPyAocmVzcG9uc2UuYWRhcHRlciB8fCAnQXZhaWxhYmxlJykgOiAnTm90IGF2YWlsYWJsZSc7XG4gICAgfSk7XG5cbiAgICAvLyBNQ1AvQ0RQIFx1MjAxNCBzZXQgYXMgYWN0aXZlIGZvciBub3cgKGNoZWNrZWQgdmlhIFpBUClcbiAgICBtY3BTdGF0dXMuY2xhc3NMaXN0LmFkZCgnY29ubmVjdGVkJyk7XG4gICAgbWNwUG9ydC50ZXh0Q29udGVudCA9ICdGYWxsYmFjayc7XG4gICAgY2RwU3RhdHVzLmNsYXNzTGlzdC5hZGQoJ2Nvbm5lY3RlZCcpO1xuICAgIGNkcERldGFpbC50ZXh0Q29udGVudCA9ICdBY3RpdmUnO1xuICB9XG5cbiAgLy8gLS0tIFNldHRpbmdzIC0tLVxuICBvcGVuU2V0dGluZ3M/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1haW5TZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHNldHRpbmdzU2VjdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICBsb2FkU2V0dGluZ3MoKTtcbiAgfSk7XG5cbiAgYmFja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgc2V0dGluZ3NTZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIG1haW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICB9KTtcblxuICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFsnbWNwUG9ydCcsICdjZHBQb3J0JywgJ3phcFBvcnRzJ10sIChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IG1jcFBvcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3AtcG9ydC1zZXR0aW5nJyk7XG4gICAgICBjb25zdCBjZHBQb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2RwLXBvcnQtc2V0dGluZycpO1xuICAgICAgY29uc3QgemFwUG9ydHNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtcG9ydHMtc2V0dGluZycpO1xuXG4gICAgICBpZiAobWNwUG9ydElucHV0KSBtY3BQb3J0SW5wdXQudmFsdWUgPSByZXN1bHQubWNwUG9ydCB8fCAzMDAxO1xuICAgICAgaWYgKGNkcFBvcnRJbnB1dCkgY2RwUG9ydElucHV0LnZhbHVlID0gcmVzdWx0LmNkcFBvcnQgfHwgOTIyMztcbiAgICAgIGlmICh6YXBQb3J0c0lucHV0KSB6YXBQb3J0c0lucHV0LnZhbHVlID0gKHJlc3VsdC56YXBQb3J0cyB8fCBbOTk5OSwgOTk5OCwgOTk5NywgOTk5NiwgOTk5NV0pLmpvaW4oJywnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVTZXR0aW5ncz8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgbWNwUG9ydFZhbCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3AtcG9ydC1zZXR0aW5nJyk/LnZhbHVlKSB8fCAzMDAxO1xuICAgIGNvbnN0IGNkcFBvcnRWYWwgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2RwLXBvcnQtc2V0dGluZycpPy52YWx1ZSkgfHwgOTIyMztcbiAgICBjb25zdCB6YXBQb3J0c1ZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemFwLXBvcnRzLXNldHRpbmcnKT8udmFsdWUgfHwgJycpXG4gICAgICAuc3BsaXQoJywnKS5tYXAocCA9PiBwYXJzZUludChwLnRyaW0oKSkpLmZpbHRlcihwID0+IHAgPiAwICYmIHAgPCA2NTUzNik7XG5cbiAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoe1xuICAgICAgbWNwUG9ydDogbWNwUG9ydFZhbCxcbiAgICAgIGNkcFBvcnQ6IGNkcFBvcnRWYWwsXG4gICAgICB6YXBQb3J0czogemFwUG9ydHNWYWwubGVuZ3RoID8gemFwUG9ydHNWYWwgOiBbOTk5OSwgOTk5OCwgOTk5NywgOTk5NiwgOTk5NV0sXG4gICAgfSwgKCkgPT4ge1xuICAgICAgc2F2ZVNldHRpbmdzLnRleHRDb250ZW50ID0gJ1NhdmVkISc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgc2F2ZVNldHRpbmdzLnRleHRDb250ZW50ID0gJ1NhdmUgU2V0dGluZ3MnOyB9LCAxNTAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tIFRlc3QgQ29ubmVjdGlvbiAtLS1cbiAgdGVzdENvbm5lY3Rpb24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHRlc3RDb25uZWN0aW9uLnRleHRDb250ZW50ID0gJ1Rlc3RpbmcuLi4nO1xuICAgIHRlc3RDb25uZWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnemFwLmRpc2NvdmVyJyB9LCAoKSA9PiB7XG4gICAgICByZWZyZXNoU3RhdHVzKCk7XG4gICAgICB0ZXN0Q29ubmVjdGlvbi50ZXh0Q29udGVudCA9ICdUZXN0IENvbm5lY3Rpb24nO1xuICAgICAgdGVzdENvbm5lY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gRmVhdHVyZSB0b2dnbGVzXG4gIFsnc291cmNlLW1hcHMnLCAnd2ViZ3B1LWFpJywgJ2Jyb3dzZXItY29udHJvbCcsICd0YWItZmlsZXN5c3RlbSddLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChjaGVja2JveCkge1xuICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFtpZF0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHJlc3VsdFtpZF0gIT09IGZhbHNlOyAvLyBkZWZhdWx0IG9uXG4gICAgICB9KTtcbiAgICAgIGNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgW2lkXTogY2hlY2tib3guY2hlY2tlZCB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tIEJyb3dzZXIgQmFja2VuZCBQaWNrZXIgLS0tXG4gIGNvbnN0IGJhY2tlbmRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJvd3Nlci1iYWNrZW5kJykgYXMgSFRNTFNlbGVjdEVsZW1lbnQgfCBudWxsO1xuICBjb25zdCBicmlkZ2VTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJpZGdlLXN0YXR1cycpO1xuICBjb25zdCBicmlkZ2VEZXRhaWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJpZGdlLWRldGFpbCcpO1xuXG4gIGZ1bmN0aW9uIGxvYWRCYWNrZW5kUHJlZmVyZW5jZSgpIHtcbiAgICBjaHJvbWUuc3RvcmFnZS5zeW5jLmdldChbJ2Jyb3dzZXJCYWNrZW5kJ10sIChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChiYWNrZW5kU2VsZWN0ICYmIHJlc3VsdC5icm93c2VyQmFja2VuZCkge1xuICAgICAgICBiYWNrZW5kU2VsZWN0LnZhbHVlID0gcmVzdWx0LmJyb3dzZXJCYWNrZW5kO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaEJyaWRnZVN0YXR1cygpIHtcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2JyaWRnZS5zdGF0dXMnIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikgcmV0dXJuO1xuICAgICAgaWYgKHJlc3BvbnNlPy5zdWNjZXNzICYmIHJlc3BvbnNlLmNvbm5lY3RlZCkge1xuICAgICAgICBicmlkZ2VTdGF0dXM/LmNsYXNzTGlzdC5hZGQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICBicmlkZ2VTdGF0dXM/LmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHJlc3BvbnNlLmJyb3dzZXJzIHx8IFtdO1xuICAgICAgICBicmlkZ2VEZXRhaWwudGV4dENvbnRlbnQgPSBicm93c2Vycy5sZW5ndGhcbiAgICAgICAgICA/IGBDb25uZWN0ZWQ6ICR7YnJvd3NlcnMuam9pbignLCAnKX1gXG4gICAgICAgICAgOiAnQ29ubmVjdGVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyaWRnZVN0YXR1cz8uY2xhc3NMaXN0LnJlbW92ZSgnY29ubmVjdGVkJyk7XG4gICAgICAgIGJyaWRnZVN0YXR1cz8uY2xhc3NMaXN0LmFkZCgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIGJyaWRnZURldGFpbC50ZXh0Q29udGVudCA9ICdOb3QgY29ubmVjdGVkJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGJhY2tlbmRTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGJhY2tlbmRTZWxlY3QudmFsdWU7XG5cbiAgICAvLyBTYXZlIHRvIGNocm9tZS5zdG9yYWdlLnN5bmMgKGNyb3NzLWRldmljZSlcbiAgICBjaHJvbWUuc3RvcmFnZS5zeW5jLnNldCh7IGJyb3dzZXJCYWNrZW5kOiB2YWx1ZSB9KTtcblxuICAgIC8vIEZvcndhcmQgdG8gYmFja2dyb3VuZCB0byBwZXJzaXN0IHZpYSBDRFAgYnJpZGdlICsgc3luYyB0byBJQU1cbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICBhY3Rpb246ICdjb25maWcuc2F2ZScsXG4gICAgICBrZXk6ICdicm93c2VyQmFja2VuZCcsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgbG9hZEJhY2tlbmRQcmVmZXJlbmNlKCk7XG4gIHJlZnJlc2hCcmlk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
@@ -60,8 +60,8 @@
60
60
  };
61
61
  }
62
62
  setupEventListeners() {
63
- var _a, _b;
64
- this.el.authBtn.addEventListener("click", () => this.login());
63
+ var _a, _b, _c, _d, _e, _f, _g;
64
+ (_a = this.el.authBtn) == null ? void 0 : _a.addEventListener("click", () => this.login());
65
65
  document.querySelectorAll(".tab").forEach((tab) => {
66
66
  tab.addEventListener("click", () => this.switchTab(tab.dataset.tab));
67
67
  });
@@ -73,18 +73,18 @@
73
73
  }
74
74
  });
75
75
  this.el.chatInput.addEventListener("input", () => this.autoResize());
76
- (_a = this.el.ragEnabled) == null ? void 0 : _a.addEventListener("change", () => {
76
+ (_b = this.el.ragEnabled) == null ? void 0 : _b.addEventListener("change", () => {
77
77
  this.setRagStatus(this.el.ragEnabled.checked ? "RAG enabled" : "RAG disabled");
78
78
  });
79
- (_b = this.el.tabContextEnabled) == null ? void 0 : _b.addEventListener("change", () => {
79
+ (_c = this.el.tabContextEnabled) == null ? void 0 : _c.addEventListener("change", () => {
80
80
  var _a2;
81
81
  if (!((_a2 = this.el.ragEnabled) == null ? void 0 : _a2.checked)) return;
82
82
  this.setRagStatus(this.el.tabContextEnabled.checked ? "Tab context on" : "Tab context off");
83
83
  });
84
- this.el.refreshTabs.addEventListener("click", () => this.refreshTabFilesystem());
85
- this.el.launchAgent.addEventListener("click", () => this.showAgentLauncher());
86
- this.el.logoutBtn.addEventListener("click", () => this.logout());
87
- this.el.saveSettings.addEventListener("click", () => this.saveSettings());
84
+ (_d = this.el.refreshTabs) == null ? void 0 : _d.addEventListener("click", () => this.refreshTabFilesystem());
85
+ (_e = this.el.launchAgent) == null ? void 0 : _e.addEventListener("click", () => this.showAgentLauncher());
86
+ (_f = this.el.logoutBtn) == null ? void 0 : _f.addEventListener("click", () => this.logout());
87
+ (_g = this.el.saveSettings) == null ? void 0 : _g.addEventListener("click", () => this.saveSettings());
88
88
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
89
89
  this.handleMessage(request);
90
90
  return true;
@@ -96,7 +96,6 @@
96
96
  async checkAuth() {
97
97
  this.el.tabBar.classList.remove("hidden");
98
98
  this.el.authSection.classList.add("hidden");
99
- this.switchTab("tools");
100
99
  this.connectToMCP();
101
100
  this.refreshTabFilesystem();
102
101
  this.checkWebGPU();
@@ -109,10 +108,12 @@
109
108
  this.switchTab("chat");
110
109
  } else {
111
110
  this.showChatLoginPrompt();
111
+ this.switchTab("chat");
112
112
  }
113
113
  } catch (error) {
114
114
  console.error("Auth check failed:", error);
115
115
  this.showChatLoginPrompt();
116
+ this.switchTab("chat");
116
117
  }
117
118
  }
118
119
  async login() {
@@ -130,7 +131,7 @@
130
131
  this.showError("Sign in failed");
131
132
  } finally {
132
133
  this.el.authBtn.disabled = false;
133
- this.el.authBtn.textContent = "Sign in with Hanzo";
134
+ this.el.authBtn.textContent = "Sign in";
134
135
  }
135
136
  }
136
137
  async logout() {
@@ -775,4 +776,4 @@ ${rows.join("\n")}`;
775
776
  };
776
777
  var hanzoSidebar = new HanzoSidebar();
777
778
  })();
778
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NpZGViYXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIEhhbnpvIEFJIEJyb3dzZXIgRXh0ZW5zaW9uIFNpZGViYXIgXHUyMDE0IENoYXQgKyBUb29scyArIFNldHRpbmdzXG5cbmNsYXNzIEhhbnpvU2lkZWJhciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWdlbnRzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdjaGF0JztcbiAgICB0aGlzLm1lc3NhZ2VzID0gW107XG4gICAgdGhpcy5zdHJlYW1pbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBudWxsO1xuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMucmFnQ29udGV4dCA9IG51bGw7XG5cbiAgICB0aGlzLmluaXRpYWxpemVVSSgpO1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuY2hlY2tBdXRoKCk7XG4gIH1cblxuICBpbml0aWFsaXplVUkoKSB7XG4gICAgdGhpcy5lbCA9IHtcbiAgICAgIC8vIEF1dGhcbiAgICAgIGF1dGhTZWN0aW9uOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zZWN0aW9uJyksXG4gICAgICBhdXRoQnRuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1idG4nKSxcbiAgICAgIHRhYkJhcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1iYXInKSxcbiAgICAgIHVzZXJCYWRnZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItYmFkZ2UnKSxcbiAgICAgIGhlYWRlckF2YXRhcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlci1hdmF0YXInKSxcblxuICAgICAgLy8gQ2hhdFxuICAgICAgdGFiQ2hhdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1jaGF0JyksXG4gICAgICBjaGF0TWVzc2FnZXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LW1lc3NhZ2VzJyksXG4gICAgICBjaGF0SW5wdXQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWlucHV0JyksXG4gICAgICBzZW5kQnRuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VuZC1idG4nKSxcbiAgICAgIG1vZGVsU2VsZWN0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc2VsZWN0JyksXG4gICAgICByYWdFbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFnLWVuYWJsZWQnKSxcbiAgICAgIHRhYkNvbnRleHRFbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWNvbnRleHQtZW5hYmxlZCcpLFxuICAgICAgcmFnU3RhdHVzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFnLXN0YXR1cycpLFxuXG4gICAgICAvLyBUb29sc1xuICAgICAgdGFiVG9vbHM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItdG9vbHMnKSxcbiAgICAgIG1jcFN0YXR1czogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC1zdGF0dXMnKSxcbiAgICAgIG1jcFRvb2xzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWNwLXRvb2xzJyksXG4gICAgICBtY3BUb29sTGlzdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC10b29sLWxpc3QnKSxcbiAgICAgIGFnZW50Q291bnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZ2VudC1jb3VudCcpLFxuICAgICAgYWdlbnRMaXN0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlbnQtbGlzdCcpLFxuICAgICAgdGFiRnM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItZnMnKSxcbiAgICAgIHJlZnJlc2hUYWJzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaC10YWJzJyksXG4gICAgICBncHVTdGF0dXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncHUtc3RhdHVzJyksXG4gICAgICBncHVNb2RlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1tb2RlbCcpLFxuICAgICAgbGF1bmNoQWdlbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXVuY2gtYWdlbnQnKSxcblxuICAgICAgLy8gU2V0dGluZ3NcbiAgICAgIHRhYlNldHRpbmdzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNldHRpbmdzJyksXG4gICAgICB1c2VyQXZhdGFyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1hdmF0YXInKSxcbiAgICAgIHVzZXJOYW1lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1uYW1lJyksXG4gICAgICB1c2VyRW1haWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLWVtYWlsJyksXG4gICAgICBsb2dvdXRCdG46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvdXQtYnRuJyksXG4gICAgICBzYXZlU2V0dGluZ3M6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLXNldHRpbmdzJyksXG4gICAgICBkZWZhdWx0TW9kZWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWZhdWx0LW1vZGVsJyksXG4gICAgICByYWdVc2VaYXA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWctdXNlLXphcCcpLFxuICAgICAgcmFnSW5jbHVkZVRhYkNvbnRleHQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWctaW5jbHVkZS10YWItY29udGV4dCcpLFxuICAgICAgcmFnVG9wSzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhZy10b3AtaycpLFxuICAgICAgcmFnS2I6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWcta2InKSxcbiAgICAgIHJhZ0VuZHBvaW50OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFnLWVuZHBvaW50JyksXG4gICAgICByYWdBcGlLZXk6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWctYXBpLWtleScpLFxuICAgIH07XG4gIH1cblxuICBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIC8vIEF1dGhcbiAgICB0aGlzLmVsLmF1dGhCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmxvZ2luKCkpO1xuXG4gICAgLy8gVGFic1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWInKS5mb3JFYWNoKHRhYiA9PiB7XG4gICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnN3aXRjaFRhYih0YWIuZGF0YXNldC50YWIpKTtcbiAgICB9KTtcblxuICAgIC8vIENoYXRcbiAgICB0aGlzLmVsLnNlbmRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlKCkpO1xuICAgIHRoaXMuZWwuY2hhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZWwuY2hhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gdGhpcy5hdXRvUmVzaXplKCkpO1xuICAgIHRoaXMuZWwucmFnRW5hYmxlZD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXRSYWdTdGF0dXModGhpcy5lbC5yYWdFbmFibGVkLmNoZWNrZWQgPyAnUkFHIGVuYWJsZWQnIDogJ1JBRyBkaXNhYmxlZCcpO1xuICAgIH0pO1xuICAgIHRoaXMuZWwudGFiQ29udGV4dEVuYWJsZWQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5lbC5yYWdFbmFibGVkPy5jaGVja2VkKSByZXR1cm47XG4gICAgICB0aGlzLnNldFJhZ1N0YXR1cyh0aGlzLmVsLnRhYkNvbnRleHRFbmFibGVkLmNoZWNrZWQgPyAnVGFiIGNvbnRleHQgb24nIDogJ1RhYiBjb250ZXh0IG9mZicpO1xuICAgIH0pO1xuXG4gICAgLy8gVG9vbHNcbiAgICB0aGlzLmVsLnJlZnJlc2hUYWJzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5yZWZyZXNoVGFiRmlsZXN5c3RlbSgpKTtcbiAgICB0aGlzLmVsLmxhdW5jaEFnZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zaG93QWdlbnRMYXVuY2hlcigpKTtcblxuICAgIC8vIFNldHRpbmdzXG4gICAgdGhpcy5lbC5sb2dvdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmxvZ291dCgpKTtcbiAgICB0aGlzLmVsLnNhdmVTZXR0aW5ncy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2F2ZVNldHRpbmdzKCkpO1xuXG4gICAgLy8gQmFja2dyb3VuZCBtZXNzYWdlc1xuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcigocmVxdWVzdCwgc2VuZGVyLCBzZW5kUmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZShyZXF1ZXN0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEF1dGhcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgYXN5bmMgY2hlY2tBdXRoKCkge1xuICAgIC8vIEFsd2F5cyBzaG93IHRhYnMgYW5kIGluaXRpYWxpemUgdG9vbHMgXHUyMDE0IGF1dGggb25seSBnYXRlcyBjaGF0XG4gICAgdGhpcy5lbC50YWJCYXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgdGhpcy5lbC5hdXRoU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB0aGlzLnN3aXRjaFRhYigndG9vbHMnKTsgLy8gRGVmYXVsdCB0byB0b29scyAoYWx3YXlzIHdvcmtzKVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBmZWF0dXJlcyB0aGF0IHdvcmsgd2l0aG91dCBhdXRoXG4gICAgdGhpcy5jb25uZWN0VG9NQ1AoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWJGaWxlc3lzdGVtKCk7XG4gICAgdGhpcy5jaGVja1dlYkdQVSgpO1xuICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgdGhpcy5zdGFydE1vbml0b3JpbmcoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYXV0aC5zdGF0dXMnIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlPy5zdWNjZXNzICYmIHJlc3BvbnNlLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRVc2VyKHJlc3BvbnNlLnVzZXIpO1xuICAgICAgICB0aGlzLnN3aXRjaFRhYignY2hhdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Q2hhdExvZ2luUHJvbXB0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0F1dGggY2hlY2sgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRoaXMuc2hvd0NoYXRMb2dpblByb21wdCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvZ2luKCkge1xuICAgIHRoaXMuZWwuYXV0aEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5lbC5hdXRoQnRuLnRleHRDb250ZW50ID0gJ1NpZ25pbmcgaW4uLi4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmxvZ2luJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZT8uc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnNldFVzZXIocmVzcG9uc2UudXNlcik7XG4gICAgICAgIHRoaXMuaGlkZUNoYXRMb2dpblByb21wdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IocmVzcG9uc2U/LmVycm9yIHx8ICdTaWduIGluIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignU2lnbiBpbiBmYWlsZWQnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lbC5hdXRoQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmVsLmF1dGhCdG4udGV4dENvbnRlbnQgPSAnU2lnbiBpbiB3aXRoIEhhbnpvJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKSB7XG4gICAgYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmxvZ291dCcgfSk7XG4gICAgdGhpcy5lbC51c2VyQmFkZ2UuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgdGhpcy5lbC51c2VyTmFtZS50ZXh0Q29udGVudCA9ICcnO1xuICAgIHRoaXMuZWwudXNlckVtYWlsLnRleHRDb250ZW50ID0gJyc7XG4gICAgdGhpcy5zaG93Q2hhdExvZ2luUHJvbXB0KCk7XG4gICAgdGhpcy5zd2l0Y2hUYWIoJ3Rvb2xzJyk7XG4gIH1cblxuICBzZXRVc2VyKHVzZXIpIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICBjb25zdCBhdmF0YXIgPSB1c2VyLnBpY3R1cmUgfHwgdXNlci5hdmF0YXIgfHwgJyc7XG4gICAgICBpZiAoYXZhdGFyKSB7XG4gICAgICAgIHRoaXMuZWwuaGVhZGVyQXZhdGFyLnNyYyA9IGF2YXRhcjtcbiAgICAgICAgdGhpcy5lbC51c2VyQmFkZ2UuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgIHRoaXMuZWwudXNlckF2YXRhci5zcmMgPSBhdmF0YXI7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLnVzZXJOYW1lLnRleHRDb250ZW50ID0gdXNlci5uYW1lIHx8IHVzZXIuZGlzcGxheU5hbWUgfHwgJ1VzZXInO1xuICAgICAgdGhpcy5lbC51c2VyRW1haWwudGV4dENvbnRlbnQgPSB1c2VyLmVtYWlsIHx8ICcnO1xuICAgIH1cbiAgICB0aGlzLmxvYWRNb2RlbHMoKTtcbiAgICB0aGlzLmxvYWRDb252ZXJzYXRpb24oKTtcbiAgfVxuXG4gIHNob3dDaGF0TG9naW5Qcm9tcHQoKSB7XG4gICAgdGhpcy5hdXRoZW50aWNhdGVkID0gZmFsc2U7XG4gICAgLy8gU2hvdyBsb2dpbiBwcm9tcHQgaW4gY2hhdCBhcmVhIGluc3RlYWQgb2YgYmxvY2tpbmcgZW50aXJlIHNpZGViYXJcbiAgICBjb25zdCBjaGF0TG9naW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdC1sb2dpbi1wcm9tcHQnKTtcbiAgICBpZiAoY2hhdExvZ2luKSBjaGF0TG9naW4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgY29uc3QgY2hhdENvbXBvc2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtY29tcG9zZXInKTtcbiAgICBpZiAoY2hhdENvbXBvc2VyKSBjaGF0Q29tcG9zZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gIH1cblxuICBoaWRlQ2hhdExvZ2luUHJvbXB0KCkge1xuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgY29uc3QgY2hhdExvZ2luID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtbG9naW4tcHJvbXB0Jyk7XG4gICAgaWYgKGNoYXRMb2dpbikgY2hhdExvZ2luLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIGNvbnN0IGNoYXRDb21wb3NlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWNvbXBvc2VyJyk7XG4gICAgaWYgKGNoYXRDb21wb3NlcikgY2hhdENvbXBvc2VyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRhYiBOYXZpZ2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN3aXRjaFRhYihuYW1lKSB7XG4gICAgdGhpcy5jdXJyZW50VGFiID0gbmFtZTtcblxuICAgIC8vIFVwZGF0ZSB0YWIgYnV0dG9uc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWInKS5mb3JFYWNoKHQgPT4ge1xuICAgICAgdC5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCB0LmRhdGFzZXQudGFiID09PSBuYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIFNob3cvaGlkZSBjb250ZW50XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYi1jb250ZW50JykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0YWItJHtuYW1lfWApO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGF0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGFzeW5jIGxvYWRNb2RlbHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdjaGF0Lmxpc3RNb2RlbHMnIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlPy5zdWNjZXNzICYmIHJlc3BvbnNlLm1vZGVscz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuZWwubW9kZWxTZWxlY3Q7XG4gICAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiByZXNwb25zZS5tb2RlbHMpIHtcbiAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICBvcHQudmFsdWUgPSBtb2RlbC5pZDtcbiAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBtb2RlbC5uYW1lIHx8IG1vZGVsLmlkO1xuICAgICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsc28gcG9wdWxhdGUgc2V0dGluZ3MgZGVmYXVsdCBtb2RlbFxuICAgICAgICB0aGlzLmVsLmRlZmF1bHRNb2RlbC5pbm5lckhUTUwgPSBzZWxlY3QuaW5uZXJIVE1MO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gS2VlcCBkZWZhdWx0IG9wdGlvbnNcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZSgpIHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbC5jaGF0SW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghdGV4dCB8fCB0aGlzLnN0cmVhbWluZykgcmV0dXJuO1xuICAgIGlmICghdGhpcy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignUGxlYXNlIHNpZ24gaW4gdG8gdXNlIGNoYXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdG9rZW5cbiAgICBjb25zdCB0b2tlblJlc3AgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguZ2V0VG9rZW4nIH0pO1xuICAgIGlmICghdG9rZW5SZXNwPy5zdWNjZXNzIHx8ICF0b2tlblJlc3AudG9rZW4pIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCdQbGVhc2Ugc2lnbiBpbiBhZ2FpbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJNZXNzYWdlID0geyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHRleHQgfTtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuZWwubW9kZWxTZWxlY3QudmFsdWU7XG4gICAgbGV0IHJlcXVlc3RNZXNzYWdlcyA9IFsuLi50aGlzLm1lc3NhZ2VzLCB1c2VyTWVzc2FnZV07XG5cbiAgICB0aGlzLnJhZ0NvbnRleHQgPSBudWxsO1xuICAgIGlmICh0aGlzLmVsLnJhZ0VuYWJsZWQ/LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuc2V0UmFnU3RhdHVzKCdSZXRyaWV2aW5nIGNvbnRleHQuLi4nKTtcbiAgICAgIGNvbnN0IHJhZ1Jlc3AgPSBhd2FpdCB0aGlzLnJlcXVlc3RSYWdDb250ZXh0KHRleHQpO1xuICAgICAgaWYgKHJhZ1Jlc3A/LnN1Y2Nlc3MgJiYgQXJyYXkuaXNBcnJheShyYWdSZXNwLnNuaXBwZXRzKSAmJiByYWdSZXNwLnNuaXBwZXRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJhZ0NvbnRleHQgPSByYWdSZXNwO1xuICAgICAgICByZXF1ZXN0TWVzc2FnZXMgPSBbXG4gICAgICAgICAgeyByb2xlOiAnc3lzdGVtJywgY29udGVudDogdGhpcy5idWlsZFJhZ1N5c3RlbVByb21wdChyYWdSZXNwKSB9LFxuICAgICAgICAgIC4uLnJlcXVlc3RNZXNzYWdlcyxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5zZXRSYWdTdGF0dXMoYFJBRzogJHtyYWdSZXNwLnNuaXBwZXRzLmxlbmd0aH0gc25pcHBldChzKSBmcm9tICR7cmFnUmVzcC5zb3VyY2UgfHwgJ2NvbnRleHQnfWApO1xuICAgICAgfSBlbHNlIGlmIChyYWdSZXNwPy5lcnJvcikge1xuICAgICAgICB0aGlzLnNldFJhZ1N0YXR1cyhgUkFHIHVuYXZhaWxhYmxlICgke3JhZ1Jlc3AuZXJyb3J9KWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRSYWdTdGF0dXMoJ05vIGNvbnRleHQgZm91bmQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRSYWdTdGF0dXMoJ1JBRyBkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8vIEFkZCB1c2VyIG1lc3NhZ2UgdG8gdHJhbnNjcmlwdFxuICAgIHRoaXMubWVzc2FnZXMucHVzaCh1c2VyTWVzc2FnZSk7XG4gICAgdGhpcy5hcHBlbmRNZXNzYWdlKCd1c2VyJywgdGV4dCk7XG5cbiAgICAvLyBDbGVhciBpbnB1dFxuICAgIHRoaXMuZWwuY2hhdElucHV0LnZhbHVlID0gJyc7XG4gICAgdGhpcy5hdXRvUmVzaXplKCk7XG5cbiAgICAvLyBTaG93IHR5cGluZ1xuICAgIHRoaXMuc3RyZWFtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVsLnNlbmRCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGNvbnN0IHR5cGluZ0VsID0gdGhpcy5zaG93VHlwaW5nKCk7XG5cbiAgICAvLyBDcmVhdGUgYXNzaXN0YW50IG1lc3NhZ2UgZWxlbWVudFxuICAgIGNvbnN0IGFzc2lzdGFudEVsID0gdGhpcy5hcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCAnJyk7XG4gICAgbGV0IGZ1bGxDb250ZW50ID0gJyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gU3RyZWFtIHZpYSBkaXJlY3QgZmV0Y2ggKHNpZGViYXIgaGFzIGFjY2VzcyB2aWEgQ1NQKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuaGFuem8uYWkvdjEvY2hhdC9jb21wbGV0aW9ucycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VuUmVzcC50b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgbWVzc2FnZXM6IHJlcXVlc3RNZXNzYWdlcyxcbiAgICAgICAgICBzdHJlYW06IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICBzaWduYWw6ICh0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkpLnNpZ25hbCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVyclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQVBJIGVycm9yICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJUZXh0fWApO1xuICAgICAgfVxuXG4gICAgICB0eXBpbmdFbC5yZW1vdmUoKTtcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICBsZXQgYnVmZmVyID0gJyc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChkb25lKSBicmVhaztcblxuICAgICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgICAgICBpZiAoIXRyaW1tZWQgfHwgdHJpbW1lZC5zdGFydHNXaXRoKCc6JykpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2RhdGE6ICcpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdHJpbW1lZC5zbGljZSg2KTtcbiAgICAgICAgICAgIGlmIChkYXRhID09PSAnW0RPTkVdJykgYnJlYWs7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHBhcnNlZC5jaG9pY2VzPy5bMF0/LmRlbHRhPy5jb250ZW50O1xuICAgICAgICAgICAgICBpZiAoZGVsdGEpIHtcbiAgICAgICAgICAgICAgICBmdWxsQ29udGVudCArPSBkZWx0YTtcbiAgICAgICAgICAgICAgICBhc3Npc3RhbnRFbC5pbm5lckhUTUwgPSB0aGlzLnJlbmRlck1hcmtkb3duKGZ1bGxDb250ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmFnQ29udGV4dD8uc25pcHBldHM/Lmxlbmd0aCkge1xuICAgICAgICBmdWxsQ29udGVudCArPSB0aGlzLmJ1aWxkUmFnQ2l0YXRpb25CbG9jayh0aGlzLnJhZ0NvbnRleHQpO1xuICAgICAgICBhc3Npc3RhbnRFbC5pbm5lckhUTUwgPSB0aGlzLnJlbmRlck1hcmtkb3duKGZ1bGxDb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsgcm9sZTogJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IGZ1bGxDb250ZW50IH0pO1xuICAgICAgdGhpcy5zYXZlQ29udmVyc2F0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHR5cGluZ0VsLnJlbW92ZSgpO1xuICAgICAgaWYgKGVycm9yPy5uYW1lICE9PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgYXNzaXN0YW50RWwucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuYXBwZW5kRXJyb3IoZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NoYXQgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RyZWFtaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgdGhpcy5lbC5zZW5kQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0QWN0aXZlVGFiQ29udGV4dCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW2FjdGl2ZVRhYl0gPSBhd2FpdCBjaHJvbWUudGFicy5xdWVyeSh7IGFjdGl2ZTogdHJ1ZSwgY3VycmVudFdpbmRvdzogdHJ1ZSB9KTtcbiAgICAgIGlmICghYWN0aXZlVGFiKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogYWN0aXZlVGFiLnVybCB8fCAnJyxcbiAgICAgICAgdGl0bGU6IGFjdGl2ZVRhYi50aXRsZSB8fCAnJyxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXF1ZXN0UmFnQ29udGV4dChxdWVyeSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWdlQ29udGV4dCA9IHRoaXMuZWwudGFiQ29udGV4dEVuYWJsZWQ/LmNoZWNrZWQgPyBhd2FpdCB0aGlzLmdldEFjdGl2ZVRhYkNvbnRleHQoKSA6IG51bGw7XG4gICAgICBjb25zdCB0b3BLID0gTWF0aC5tYXgoMSwgTWF0aC5taW4ocGFyc2VJbnQodGhpcy5lbC5yYWdUb3BLPy52YWx1ZSB8fCAnNScsIDEwKSB8fCA1LCAyMCkpO1xuXG4gICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBhY3Rpb246ICdyYWcucXVlcnknLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgdG9wSyxcbiAgICAgICAgaW5jbHVkZVRhYkNvbnRleHQ6ICEhdGhpcy5lbC50YWJDb250ZXh0RW5hYmxlZD8uY2hlY2tlZCxcbiAgICAgICAgdXNlWmFwTWVtb3J5OiAhIXRoaXMuZWwucmFnVXNlWmFwPy5jaGVja2VkLFxuICAgICAgICBrbm93bGVkZ2VCYXNlOiB0aGlzLmVsLnJhZ0tiPy52YWx1ZSB8fCAnJyxcbiAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZWwucmFnRW5kcG9pbnQ/LnZhbHVlIHx8ICcnLFxuICAgICAgICBhcGlLZXk6IHRoaXMuZWwucmFnQXBpS2V5Py52YWx1ZSB8fCAnJyxcbiAgICAgICAgcGFnZUNvbnRleHQ6IHBhZ2VDb250ZXh0IHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcXVlcnkgUkFHJyB9O1xuICAgIH1cbiAgfVxuXG4gIGJ1aWxkUmFnU3lzdGVtUHJvbXB0KHJhZ1Jlc3BvbnNlKSB7XG4gICAgY29uc3Qgc25pcHBldHMgPSAocmFnUmVzcG9uc2U/LnNuaXBwZXRzIHx8IFtdKS5zbGljZSgwLCA4KTtcbiAgICBjb25zdCBsaW5lcyA9IHNuaXBwZXRzLm1hcCgoc25pcHBldCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gc25pcHBldC50aXRsZSB8fCBzbmlwcGV0LnNvdXJjZSB8fCBgU25pcHBldCAke2luZGV4ICsgMX1gO1xuICAgICAgY29uc3Qgc2NvcmUgPSB0eXBlb2Ygc25pcHBldC5zY29yZSA9PT0gJ251bWJlcicgPyBgIChzY29yZSAke3NuaXBwZXQuc2NvcmUudG9GaXhlZCgzKX0pYCA6ICcnO1xuICAgICAgY29uc3Qgc291cmNlTGluZSA9IHNuaXBwZXQudXJsID8gYCR7dGl0bGV9JHtzY29yZX0gXHUyMDE0ICR7c25pcHBldC51cmx9YCA6IGAke3RpdGxlfSR7c2NvcmV9YDtcbiAgICAgIHJldHVybiBgWyR7aW5kZXggKyAxfV0gJHtzb3VyY2VMaW5lfVxcbiR7c25pcHBldC5jb250ZW50fWA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgJ1lvdSBhcmUgYXNzaXN0aW5nIGluc2lkZSBIYW56byBCcm93c2VyIEV4dGVuc2lvbi4nLFxuICAgICAgJ1VzZSB0aGUgcmV0cmlldmVkIGNvbnRleHQgYmVsb3cgd2hlbiByZWxldmFudCwgYW5kIHN0YXRlIHVuY2VydGFpbnR5IGlmIGNvbnRleHQgaXMgaW5zdWZmaWNpZW50LicsXG4gICAgICAnUmV0cmlldmVkIENvbnRleHQ6JyxcbiAgICAgIC4uLmxpbmVzLFxuICAgIF0uam9pbignXFxuXFxuJyk7XG4gIH1cblxuICBidWlsZFJhZ0NpdGF0aW9uQmxvY2socmFnUmVzcG9uc2UpIHtcbiAgICBjb25zdCBzbmlwcGV0cyA9IChyYWdSZXNwb25zZT8uc25pcHBldHMgfHwgW10pLnNsaWNlKDAsIDUpO1xuICAgIGlmICghc25pcHBldHMubGVuZ3RoKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCByb3dzID0gc25pcHBldHMubWFwKChzbmlwcGV0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGl0bGUgPSBzbmlwcGV0LnRpdGxlIHx8IHNuaXBwZXQuc291cmNlIHx8IGBTbmlwcGV0ICR7aW5kZXggKyAxfWA7XG4gICAgICBpZiAoc25pcHBldC51cmwpIHtcbiAgICAgICAgcmV0dXJuIGAtICR7dGl0bGV9OiAke3NuaXBwZXQudXJsfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYC0gJHt0aXRsZX1gO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGBcXG5cXG4tLS1cXG5Db250ZXh0IFNvdXJjZXM6XFxuJHtyb3dzLmpvaW4oJ1xcbicpfWA7XG4gIH1cblxuICBzZXRSYWdTdGF0dXModGV4dCkge1xuICAgIGlmICghdGhpcy5lbC5yYWdTdGF0dXMpIHJldHVybjtcbiAgICB0aGlzLmVsLnJhZ1N0YXR1cy50ZXh0Q29udGVudCA9IHRleHQgfHwgJ1JlYWR5JztcbiAgfVxuXG4gIGFwcGVuZE1lc3NhZ2Uocm9sZSwgY29udGVudCkge1xuICAgIC8vIFJlbW92ZSB3ZWxjb21lIG1lc3NhZ2VcbiAgICBjb25zdCB3ZWxjb21lID0gdGhpcy5lbC5jaGF0TWVzc2FnZXMucXVlcnlTZWxlY3RvcignLmNoYXQtd2VsY29tZScpO1xuICAgIGlmICh3ZWxjb21lKSB3ZWxjb21lLnJlbW92ZSgpO1xuXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IGBtc2cgbXNnLSR7cm9sZX1gO1xuICAgIGRpdi5pbm5lckhUTUwgPSByb2xlID09PSAnYXNzaXN0YW50JyA/IHRoaXMucmVuZGVyTWFya2Rvd24oY29udGVudCkgOiB0aGlzLmVzY2FwZUh0bWwoY29udGVudCk7XG4gICAgdGhpcy5lbC5jaGF0TWVzc2FnZXMuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIGFwcGVuZEVycm9yKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuY2xhc3NOYW1lID0gJ21zZy1lcnJvcic7XG4gICAgZGl2LnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICB0aGlzLmVsLmNoYXRNZXNzYWdlcy5hcHBlbmRDaGlsZChkaXYpO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgfVxuXG4gIHNob3dUeXBpbmcoKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICd0eXBpbmctaW5kaWNhdG9yJztcbiAgICBkaXYuaW5uZXJIVE1MID0gJzxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPic7XG4gICAgdGhpcy5lbC5jaGF0TWVzc2FnZXMuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKCkge1xuICAgIHRoaXMuZWwuY2hhdE1lc3NhZ2VzLnNjcm9sbFRvcCA9IHRoaXMuZWwuY2hhdE1lc3NhZ2VzLnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIGF1dG9SZXNpemUoKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmVsLmNoYXRJbnB1dDtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gTWF0aC5taW4oZWwuc2Nyb2xsSGVpZ2h0LCAxMjApICsgJ3B4JztcbiAgfVxuXG4gIC8vIE1pbmltYWwgbWFya2Rvd246IGNvZGUgYmxvY2tzLCBpbmxpbmUgY29kZSwgYm9sZCwgaXRhbGljLCBsaW5lIGJyZWFrc1xuICByZW5kZXJNYXJrZG93bih0ZXh0KSB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmVzY2FwZUh0bWwodGV4dCk7XG5cbiAgICAvLyBDb2RlIGJsb2NrczogYGBgbGFuZ1xcbi4uLlxcbmBgYFxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL2BgYChcXHcqKVxcbihbXFxzXFxTXSo/KWBgYC9nLCAoXywgbGFuZywgY29kZSkgPT4ge1xuICAgICAgcmV0dXJuIGA8cHJlPjxjb2RlPiR7Y29kZS50cmltKCl9PC9jb2RlPjwvcHJlPmA7XG4gICAgfSk7XG5cbiAgICAvLyBJbmxpbmUgY29kZTogYC4uLmBcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpO1xuXG4gICAgLy8gQm9sZDogKiouLi4qKlxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcKlxcKihbXipdKylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcblxuICAgIC8vIEl0YWxpYzogKi4uLipcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXCooW14qXSspXFwqL2csICc8ZW0+JDE8L2VtPicpO1xuXG4gICAgLy8gTGluZSBicmVha3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcblxuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgZXNjYXBlSHRtbCh0ZXh0KSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIGFzeW5jIGxvYWRDb252ZXJzYXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoWydoYW56b19jaGF0X21lc3NhZ2VzJ10sIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5oYW56b19jaGF0X21lc3NhZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gcmVzdWx0LmhhbnpvX2NoYXRfbWVzc2FnZXM7XG4gICAgICAgICAgLy8gUmVuZGVyIHN0b3JlZCBtZXNzYWdlc1xuICAgICAgICAgIGNvbnN0IHdlbGNvbWUgPSB0aGlzLmVsLmNoYXRNZXNzYWdlcy5xdWVyeVNlbGVjdG9yKCcuY2hhdC13ZWxjb21lJyk7XG4gICAgICAgICAgaWYgKHdlbGNvbWUpIHdlbGNvbWUucmVtb3ZlKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgdGhpcy5tZXNzYWdlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRNZXNzYWdlKG1zZy5yb2xlLCBtc2cuY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZUNvbnZlcnNhdGlvbigpIHtcbiAgICAvLyBLZWVwIGxhc3QgNTAgbWVzc2FnZXNcbiAgICBjb25zdCB0b1N0b3JlID0gdGhpcy5tZXNzYWdlcy5zbGljZSgtNTApO1xuICAgIGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IGhhbnpvX2NoYXRfbWVzc2FnZXM6IHRvU3RvcmUgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVG9vbHMgVGFiXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGFzeW5jIGNvbm5lY3RUb01DUCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgemFwUmVzcG9uc2UgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ3phcC5zdGF0dXMnIH0pO1xuICAgICAgaWYgKHphcFJlc3BvbnNlPy5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHphcCA9IHphcFJlc3BvbnNlLnphcDtcbiAgICAgICAgY29uc3QgdG9vbENvdW50ID0gemFwLm1jcHM/LnJlZHVjZSgoc3VtLCBtKSA9PiBzdW0gKyAobS50b29scz8ubGVuZ3RoIHx8IDApLCAwKSB8fCAwO1xuICAgICAgICB0aGlzLnVwZGF0ZU1DUFN0YXR1cyh6YXAuY29ubmVjdGVkLCB0b29sQ291bnQsIHphcC5tY3BzPy5sZW5ndGggfHwgMCk7XG4gICAgICAgIGlmICh6YXAuY29ubmVjdGVkKSB7XG4gICAgICAgICAgY29uc3QgdG9vbHNSZXNwID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICd6YXAubGlzdFRvb2xzJyB9KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1DUFRvb2xMaXN0KHRvb2xzUmVzcD8uc3VjY2VzcyA/IHRvb2xzUmVzcC50b29scyA6IFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1DUFRvb2xMaXN0KFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVNQ1BTdGF0dXMoZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1DUFRvb2xMaXN0KFtdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMudXBkYXRlTUNQU3RhdHVzKGZhbHNlKTtcbiAgICAgIHRoaXMudXBkYXRlTUNQVG9vbExpc3QoW10pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU1DUFN0YXR1cyhjb25uZWN0ZWQsIHRvb2xDb3VudCA9IDAsIG1jcENvdW50ID0gMCkge1xuICAgIHRoaXMuZWwubWNwU3RhdHVzLmlubmVySFRNTCA9IGNvbm5lY3RlZCA/IGBcbiAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvciBjb25uZWN0ZWRcIj48L3NwYW4+XG4gICAgICAke21jcENvdW50ID4gMCA/IGBaQVA6ICR7bWNwQ291bnR9IE1DUChzKWAgOiAnQ29ubmVjdGVkJ31cbiAgICBgIDogYFxuICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIGRpc2Nvbm5lY3RlZFwiPjwvc3Bhbj5cbiAgICAgIERpc2Nvbm5lY3RlZFxuICAgIGA7XG4gICAgdGhpcy5lbC5tY3BUb29scy50ZXh0Q29udGVudCA9IHRvb2xDb3VudDtcbiAgfVxuXG4gIHVwZGF0ZU1DUFRvb2xMaXN0KHRvb2xzKSB7XG4gICAgaWYgKCF0aGlzLmVsLm1jcFRvb2xMaXN0KSByZXR1cm47XG4gICAgaWYgKCF0b29scyB8fCAhdG9vbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVsLm1jcFRvb2xMaXN0LnRleHRDb250ZW50ID0gJ05vIHRvb2xzIGRpc2NvdmVyZWQgeWV0Lic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKSkuc29ydCgpO1xuICAgIGNvbnN0IHByZXZpZXcgPSBuYW1lcy5zbGljZSgwLCAyMCk7XG4gICAgY29uc3Qgc3VmZml4ID0gbmFtZXMubGVuZ3RoID4gcHJldmlldy5sZW5ndGggPyBgXFxuLi4uICske25hbWVzLmxlbmd0aCAtIHByZXZpZXcubGVuZ3RofSBtb3JlYCA6ICcnO1xuICAgIHRoaXMuZWwubWNwVG9vbExpc3QudGV4dENvbnRlbnQgPSBgJHtwcmV2aWV3LmpvaW4oJ1xcbicpfSR7c3VmZml4fWA7XG4gIH1cblxuICBhc3luYyByZWZyZXNoVGFiRmlsZXN5c3RlbSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFicyA9IGF3YWl0IGNocm9tZS50YWJzLnF1ZXJ5KHt9KTtcbiAgICAgIHRoaXMuZWwudGFiRnMuaW5uZXJIVE1MID0gdGFicy5tYXAoKHRhYiwgaSkgPT4gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWl0ZW0gJHt0YWIuYWN0aXZlID8gJ2FjdGl2ZScgOiAnJ31cIiBkYXRhLXRhYi1pZD1cIiR7dGFiLmlkfVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiAydjEyaDEyVjJIMnptMSAxaDEwdjEwSDNWM3pcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHNwYW4gdGl0bGU9XCIke3RoaXMuZXNjYXBlSHRtbCh0YWIudXJsIHx8ICcnKX1cIj4vdGFicy8ke2l9LyR7dGhpcy5zYW5pdGl6ZVBhdGgodGFiLnRpdGxlIHx8ICd1bnRpdGxlZCcpfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgKS5qb2luKCcnKTtcblxuICAgICAgdGhpcy5lbC50YWJGcy5xdWVyeVNlbGVjdG9yQWxsKCcudGFiLWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGNocm9tZS50YWJzLnVwZGF0ZShwYXJzZUludChpdGVtLmRhdGFzZXQudGFiSWQpLCB7IGFjdGl2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBzYW5pdGl6ZVBhdGgodGl0bGUpIHtcbiAgICByZXR1cm4gdGl0bGUucmVwbGFjZSgvW15hLXpBLVowLTktX10vZywgJ18nKS50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZygwLCAzMCk7XG4gIH1cblxuICBhc3luYyBjaGVja1dlYkdQVSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2NoZWNrV2ViR1BVJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZT8uYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuZWwuZ3B1U3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pbmRpY2F0b3IgY29ubmVjdGVkXCI+PC9zcGFuPlxuICAgICAgICAgIEF2YWlsYWJsZVxuICAgICAgICBgO1xuICAgICAgICB0aGlzLmVsLmdwdU1vZGVsLnRleHRDb250ZW50ID0gcmVzcG9uc2UuYWRhcHRlciB8fCAnVW5rbm93bic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsLmdwdVN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIGRpc2Nvbm5lY3RlZFwiPjwvc3Bhbj5cbiAgICAgICAgICBOb3QgQXZhaWxhYmxlXG4gICAgICAgIGA7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgdXBkYXRlQWdlbnRMaXN0KCkge1xuICAgIGNvbnN0IGFyciA9IEFycmF5LmZyb20odGhpcy5hZ2VudHMudmFsdWVzKCkpO1xuICAgIHRoaXMuZWwuYWdlbnRDb3VudC50ZXh0Q29udGVudCA9IGFyci5sZW5ndGg7XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZWwuYWdlbnRMaXN0LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj5ObyBhY3RpdmUgYWdlbnRzPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbC5hZ2VudExpc3QuaW5uZXJIVE1MID0gYXJyLm1hcChhID0+IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1pdGVtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1pY29uXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA2djZsNCAyXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LW5hbWVcIj4ke3RoaXMuZXNjYXBlSHRtbChhLm5hbWUpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1zdGF0dXNcIj4ke2Euc3RhdHVzfSBcdTIwMjIgVGFiICR7YS50YWJJZH08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuIHNtYWxsXCIgZGF0YS1zdG9wPVwiJHthLmlkfVwiIHRpdGxlPVwiU3RvcFwiPlxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgKS5qb2luKCcnKTtcblxuICAgIHRoaXMuZWwuYWdlbnRMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXN0b3BdJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LnN0b3A7XG4gICAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnc3RvcEFnZW50JywgYWdlbnRJZDogaWQgfSk7XG4gICAgICAgIHRoaXMuYWdlbnRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlbnRMaXN0KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNob3dBZ2VudExhdW5jaGVyKCkge1xuICAgIC8vIENyZWF0ZSBhZ2VudCBsYXVuY2hlciBtb2RhbCBvdmVybGF5XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG92ZXJsYXkuY2xhc3NOYW1lID0gJ21vZGFsLW92ZXJsYXknO1xuICAgIG92ZXJsYXkuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxoMz5MYXVuY2ggQWdlbnQ8L2gzPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biBjbG9zZS1tb2RhbFwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2V0dGluZy1pdGVtXCI+XG4gICAgICAgICAgICA8c3Bhbj5UYXJnZXQgVGFiPC9zcGFuPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImFnZW50LXRhYi1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFjdGl2ZVwiPkFjdGl2ZSBUYWI8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2V0dGluZy1pdGVtXCI+XG4gICAgICAgICAgICA8c3Bhbj5BZ2VudCBUeXBlPC9zcGFuPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImFnZW50LXR5cGUtc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicm93c2VyLWNvbnRyb2xcIj5Ccm93c2VyIEF1dG9tYXRpb248L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInBhZ2UtYW5hbHl6ZXJcIj5QYWdlIEFuYWx5emVyPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmb3JtLWZpbGxlclwiPkZvcm0gRmlsbGVyPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYXRhLWV4dHJhY3RvclwiPkRhdGEgRXh0cmFjdG9yPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNldHRpbmctaXRlbVwiPlxuICAgICAgICAgICAgPHNwYW4+SW5zdHJ1Y3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiYWdlbnQtaW5zdHJ1Y3Rpb25zXCIgcm93cz1cIjNcIiBwbGFjZWhvbGRlcj1cIkRlc2NyaWJlIHdoYXQgdGhlIGFnZW50IHNob3VsZCBkby4uLlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2Vjb25kYXJ5LWJ0biBjYW5jZWwtbW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicHJpbWFyeS1idG4gbGF1bmNoLW1vZGFsXCI+TGF1bmNoPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuXG4gICAgLy8gUG9wdWxhdGUgdGFic1xuICAgIGNocm9tZS50YWJzLnF1ZXJ5KHt9LCAodGFicykgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjYWdlbnQtdGFiLXNlbGVjdCcpO1xuICAgICAgdGFicy5mb3JFYWNoKHRhYiA9PiB7XG4gICAgICAgIGlmICh0YWIuaWQpIHtcbiAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICBvcHQudmFsdWUgPSB0YWIuaWQ7XG4gICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7dGFiLnRpdGxlPy5zdWJzdHJpbmcoMCwgNDApIHx8ICdVbnRpdGxlZCd9ICR7dGFiLmFjdGl2ZSA/ICcoYWN0aXZlKScgOiAnJ31gO1xuICAgICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIGhhbmRsZXJzXG4gICAgb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcuY2xvc2UtbW9kYWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG92ZXJsYXkucmVtb3ZlKCkpO1xuICAgIG92ZXJsYXkucXVlcnlTZWxlY3RvcignLmNhbmNlbC1tb2RhbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gb3ZlcmxheS5yZW1vdmUoKSk7XG4gICAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgb3ZlcmxheS5yZW1vdmUoKTsgfSk7XG5cbiAgICAvLyBMYXVuY2ggaGFuZGxlclxuICAgIG92ZXJsYXkucXVlcnlTZWxlY3RvcignLmxhdW5jaC1tb2RhbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFiU2VsZWN0ID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjYWdlbnQtdGFiLXNlbGVjdCcpO1xuICAgICAgY29uc3QgdHlwZVNlbGVjdCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2FnZW50LXR5cGUtc2VsZWN0Jyk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJyNhZ2VudC1pbnN0cnVjdGlvbnMnKTtcblxuICAgICAgbGV0IHRhYklkO1xuICAgICAgaWYgKHRhYlNlbGVjdC52YWx1ZSA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgICAgY29uc3QgW2FjdGl2ZVRhYl0gPSBhd2FpdCBjaHJvbWUudGFicy5xdWVyeSh7IGFjdGl2ZTogdHJ1ZSwgY3VycmVudFdpbmRvdzogdHJ1ZSB9KTtcbiAgICAgICAgdGFiSWQgPSBhY3RpdmVUYWI/LmlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiSWQgPSBwYXJzZUludCh0YWJTZWxlY3QudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRhYklkKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdObyB0YWIgc2VsZWN0ZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZ2VudFR5cGUgPSB0eXBlU2VsZWN0LnZhbHVlO1xuICAgICAgY29uc3QgYWdlbnRJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnMudmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIG92ZXJsYXkucmVtb3ZlKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgIGFjdGlvbjogJ2xhdW5jaEFJV29ya2VyJyxcbiAgICAgICAgICB0YWJJZCxcbiAgICAgICAgICBtb2RlbDogYWdlbnRUeXBlLFxuICAgICAgICAgIGluc3RydWN0aW9uczogYWdlbnRJbnN0cnVjdGlvbnMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZT8uc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IGFnZW50SWQgPSByZXNwb25zZS5hZ2VudElkIHx8IGBhZ2VudC0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfWA7XG4gICAgICAgICAgdGhpcy5hZ2VudHMuc2V0KGFnZW50SWQsIHtcbiAgICAgICAgICAgIGlkOiBhZ2VudElkLFxuICAgICAgICAgICAgbmFtZTogYWdlbnRUeXBlLFxuICAgICAgICAgICAgdGFiSWQsXG4gICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUFnZW50TGlzdCgpO1xuICAgICAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihgQWdlbnQgbGF1bmNoZWQgb24gdGFiICR7dGFiSWR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IocmVzcG9uc2U/LmVycm9yIHx8ICdGYWlsZWQgdG8gbGF1bmNoIGFnZW50Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdGYWlsZWQgdG8gbGF1bmNoIGFnZW50OiAnICsgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2V0dGluZ3MgVGFiXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGxvYWRTZXR0aW5ncygpIHtcbiAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoW1xuICAgICAgJ21jcFBvcnQnLFxuICAgICAgJ2NkcFBvcnQnLFxuICAgICAgJ3phcFBvcnRzJyxcbiAgICAgICdoYW56b19kZWZhdWx0X21vZGVsJyxcbiAgICAgICdoYW56b19yYWdfZW5kcG9pbnQnLFxuICAgICAgJ2hhbnpvX3JhZ19hcGlfa2V5JyxcbiAgICAgICdoYW56b19yYWdfa2InLFxuICAgICAgJ2hhbnpvX3JhZ190b3BfaycsXG4gICAgICAnaGFuem9fcmFnX2luY2x1ZGVfdGFiX2NvbnRleHQnLFxuICAgICAgJ2hhbnpvX3JhZ191c2VfemFwJyxcbiAgICAgICdoYW56b19jaGF0X3JhZ19lbmFibGVkJyxcbiAgICAgICdoYW56b19jaGF0X3RhYl9jb250ZXh0X2VuYWJsZWQnLFxuICAgIF0sIChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IG1jcFBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWNwLXBvcnQtc2V0dGluZycpO1xuICAgICAgY29uc3QgY2RwUG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZHAtcG9ydC1zZXR0aW5nJyk7XG4gICAgICBjb25zdCB6YXBQb3J0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtcG9ydHMtc2V0dGluZycpO1xuXG4gICAgICBpZiAobWNwUG9ydCkgbWNwUG9ydC52YWx1ZSA9IHJlc3VsdC5tY3BQb3J0IHx8IDMwMDE7XG4gICAgICBpZiAoY2RwUG9ydCkgY2RwUG9ydC52YWx1ZSA9IHJlc3VsdC5jZHBQb3J0IHx8IDkyMjM7XG4gICAgICBpZiAoemFwUG9ydHMpIHphcFBvcnRzLnZhbHVlID0gKHJlc3VsdC56YXBQb3J0cyB8fCBbOTk5OSw5OTk4LDk5OTcsOTk5Niw5OTk1XSkuam9pbignLCcpO1xuICAgICAgaWYgKHJlc3VsdC5oYW56b19kZWZhdWx0X21vZGVsICYmIHRoaXMuZWwuZGVmYXVsdE1vZGVsKSB7XG4gICAgICAgIHRoaXMuZWwuZGVmYXVsdE1vZGVsLnZhbHVlID0gcmVzdWx0LmhhbnpvX2RlZmF1bHRfbW9kZWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVsLnJhZ0VuZHBvaW50KSB0aGlzLmVsLnJhZ0VuZHBvaW50LnZhbHVlID0gcmVzdWx0LmhhbnpvX3JhZ19lbmRwb2ludCB8fCAnJztcbiAgICAgIGlmICh0aGlzLmVsLnJhZ0FwaUtleSkgdGhpcy5lbC5yYWdBcGlLZXkudmFsdWUgPSByZXN1bHQuaGFuem9fcmFnX2FwaV9rZXkgfHwgJyc7XG4gICAgICBpZiAodGhpcy5lbC5yYWdLYikgdGhpcy5lbC5yYWdLYi52YWx1ZSA9IHJlc3VsdC5oYW56b19yYWdfa2IgfHwgJyc7XG4gICAgICBpZiAodGhpcy5lbC5yYWdUb3BLKSB0aGlzLmVsLnJhZ1RvcEsudmFsdWUgPSBTdHJpbmcocmVzdWx0LmhhbnpvX3JhZ190b3BfayB8fCA1KTtcbiAgICAgIGlmICh0aGlzLmVsLnJhZ0luY2x1ZGVUYWJDb250ZXh0KSB0aGlzLmVsLnJhZ0luY2x1ZGVUYWJDb250ZXh0LmNoZWNrZWQgPSByZXN1bHQuaGFuem9fcmFnX2luY2x1ZGVfdGFiX2NvbnRleHQgIT09IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuZWwucmFnVXNlWmFwKSB0aGlzLmVsLnJhZ1VzZVphcC5jaGVja2VkID0gcmVzdWx0LmhhbnpvX3JhZ191c2VfemFwICE9PSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmVsLnJhZ0VuYWJsZWQpIHRoaXMuZWwucmFnRW5hYmxlZC5jaGVja2VkID0gcmVzdWx0LmhhbnpvX2NoYXRfcmFnX2VuYWJsZWQgIT09IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuZWwudGFiQ29udGV4dEVuYWJsZWQpIHRoaXMuZWwudGFiQ29udGV4dEVuYWJsZWQuY2hlY2tlZCA9IHJlc3VsdC5oYW56b19jaGF0X3RhYl9jb250ZXh0X2VuYWJsZWQgIT09IGZhbHNlO1xuICAgICAgdGhpcy5zZXRSYWdTdGF0dXModGhpcy5lbC5yYWdFbmFibGVkPy5jaGVja2VkID8gJ1JlYWR5JyA6ICdSQUcgZGlzYWJsZWQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICBjb25zdCBtY3BQb3J0ID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC1wb3J0LXNldHRpbmcnKT8udmFsdWUpIHx8IDMwMDE7XG4gICAgY29uc3QgY2RwUG9ydCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZHAtcG9ydC1zZXR0aW5nJyk/LnZhbHVlKSB8fCA5MjIzO1xuICAgIGNvbnN0IHphcFBvcnRzID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtcG9ydHMtc2V0dGluZycpPy52YWx1ZSB8fCAnJylcbiAgICAgIC5zcGxpdCgnLCcpLm1hcChwID0+IHBhcnNlSW50KHAudHJpbSgpKSkuZmlsdGVyKHAgPT4gcCA+IDAgJiYgcCA8IDY1NTM2KTtcblxuICAgIGF3YWl0IGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XG4gICAgICBtY3BQb3J0LFxuICAgICAgY2RwUG9ydCxcbiAgICAgIHphcFBvcnRzOiB6YXBQb3J0cy5sZW5ndGggPyB6YXBQb3J0cyA6IFs5OTk5LDk5OTgsOTk5Nyw5OTk2LDk5OTVdLFxuICAgICAgaGFuem9fZGVmYXVsdF9tb2RlbDogdGhpcy5lbC5kZWZhdWx0TW9kZWw/LnZhbHVlIHx8ICdncHQtNG8nLFxuICAgICAgJ3NhZmUtbW9kZSc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYWZlLW1vZGUnKT8uY2hlY2tlZCxcbiAgICAgICdlbmFibGUtd2ViZ3B1JzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS13ZWJncHUnKT8uY2hlY2tlZCxcbiAgICAgIG1heEFnZW50czogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21heC1hZ2VudHMnKT8udmFsdWUpIHx8IDMsXG4gICAgICBoYW56b19yYWdfZW5kcG9pbnQ6IHRoaXMuZWwucmFnRW5kcG9pbnQ/LnZhbHVlPy50cmltKCkgfHwgJycsXG4gICAgICBoYW56b19yYWdfYXBpX2tleTogdGhpcy5lbC5yYWdBcGlLZXk/LnZhbHVlPy50cmltKCkgfHwgJycsXG4gICAgICBoYW56b19yYWdfa2I6IHRoaXMuZWwucmFnS2I/LnZhbHVlPy50cmltKCkgfHwgJycsXG4gICAgICBoYW56b19yYWdfdG9wX2s6IE1hdGgubWF4KDEsIE1hdGgubWluKHBhcnNlSW50KHRoaXMuZWwucmFnVG9wSz8udmFsdWUgfHwgJzUnLCAxMCkgfHwgNSwgMjApKSxcbiAgICAgIGhhbnpvX3JhZ19pbmNsdWRlX3RhYl9jb250ZXh0OiAhIXRoaXMuZWwucmFnSW5jbHVkZVRhYkNvbnRleHQ/LmNoZWNrZWQsXG4gICAgICBoYW56b19yYWdfdXNlX3phcDogISF0aGlzLmVsLnJhZ1VzZVphcD8uY2hlY2tlZCxcbiAgICAgIGhhbnpvX2NoYXRfcmFnX2VuYWJsZWQ6ICEhdGhpcy5lbC5yYWdFbmFibGVkPy5jaGVja2VkLFxuICAgICAgaGFuem9fY2hhdF90YWJfY29udGV4dF9lbmFibGVkOiAhIXRoaXMuZWwudGFiQ29udGV4dEVuYWJsZWQ/LmNoZWNrZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oJ1NldHRpbmdzIHNhdmVkJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0eVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBzdGFydE1vbml0b3JpbmcoKSB7XG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jb25uZWN0VG9NQ1AoKSwgMTAwMDApO1xuICAgIGNocm9tZS50YWJzLm9uVXBkYXRlZC5hZGRMaXN0ZW5lcigoKSA9PiB0aGlzLnJlZnJlc2hUYWJGaWxlc3lzdGVtKCkpO1xuICAgIGNocm9tZS50YWJzLm9uUmVtb3ZlZC5hZGRMaXN0ZW5lcigoKSA9PiB0aGlzLnJlZnJlc2hUYWJGaWxlc3lzdGVtKCkpO1xuICB9XG5cbiAgaGFuZGxlTWVzc2FnZShyZXF1ZXN0KSB7XG4gICAgc3dpdGNoIChyZXF1ZXN0LmFjdGlvbikge1xuICAgICAgY2FzZSAnYWdlbnRVcGRhdGUnOlxuICAgICAgICBpZiAocmVxdWVzdC5hZ2VudElkICYmIHRoaXMuYWdlbnRzLmhhcyhyZXF1ZXN0LmFnZW50SWQpKSB7XG4gICAgICAgICAgdGhpcy5hZ2VudHMuZ2V0KHJlcXVlc3QuYWdlbnRJZCkuc3RhdHVzID0gcmVxdWVzdC5zdGF0dXM7XG4gICAgICAgICAgdGhpcy51cGRhdGVBZ2VudExpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzaG93Tm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLmNsYXNzTmFtZSA9ICdub3RpZmljYXRpb24nO1xuICAgIGVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IGVsLnJlbW92ZSgpLCAzMDAwKTtcbiAgfVxuXG4gIHNob3dFcnJvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbC5jbGFzc05hbWUgPSAnbm90aWZpY2F0aW9uIGVycm9yJztcbiAgICBlbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiBlbC5yZW1vdmUoKSwgNTAwMCk7XG4gIH1cbn1cblxuLy8gSW5pdGlhbGl6ZVxuY29uc3QgaGFuem9TaWRlYmFyID0gbmV3IEhhbnpvU2lkZWJhcigpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBRUEsTUFBTSxlQUFOLE1BQW1CO0FBQUEsSUFDakIsY0FBYztBQUNaLFdBQUssU0FBUyxvQkFBSSxJQUFJO0FBQ3RCLFdBQUssYUFBYTtBQUNsQixXQUFLLFdBQVcsQ0FBQztBQUNqQixXQUFLLFlBQVk7QUFDakIsV0FBSyxtQkFBbUI7QUFDeEIsV0FBSyxnQkFBZ0I7QUFDckIsV0FBSyxhQUFhO0FBRWxCLFdBQUssYUFBYTtBQUNsQixXQUFLLG9CQUFvQjtBQUN6QixXQUFLLFVBQVU7QUFBQSxJQUNqQjtBQUFBLElBRUEsZUFBZTtBQUNiLFdBQUssS0FBSztB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
779
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NpZGViYXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIEhhbnpvIEFJIEJyb3dzZXIgRXh0ZW5zaW9uIFNpZGViYXIgXHUyMDE0IENoYXQgKyBUb29scyArIFNldHRpbmdzXG5cbmNsYXNzIEhhbnpvU2lkZWJhciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWdlbnRzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdjaGF0JztcbiAgICB0aGlzLm1lc3NhZ2VzID0gW107XG4gICAgdGhpcy5zdHJlYW1pbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBudWxsO1xuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMucmFnQ29udGV4dCA9IG51bGw7XG5cbiAgICB0aGlzLmluaXRpYWxpemVVSSgpO1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuY2hlY2tBdXRoKCk7XG4gIH1cblxuICBpbml0aWFsaXplVUkoKSB7XG4gICAgdGhpcy5lbCA9IHtcbiAgICAgIC8vIEF1dGhcbiAgICAgIGF1dGhTZWN0aW9uOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zZWN0aW9uJyksXG4gICAgICBhdXRoQnRuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1idG4nKSxcbiAgICAgIHRhYkJhcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1iYXInKSxcbiAgICAgIHVzZXJCYWRnZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItYmFkZ2UnKSxcbiAgICAgIGhlYWRlckF2YXRhcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlci1hdmF0YXInKSxcblxuICAgICAgLy8gQ2hhdFxuICAgICAgdGFiQ2hhdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1jaGF0JyksXG4gICAgICBjaGF0TWVzc2FnZXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LW1lc3NhZ2VzJyksXG4gICAgICBjaGF0SW5wdXQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWlucHV0JyksXG4gICAgICBzZW5kQnRuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VuZC1idG4nKSxcbiAgICAgIG1vZGVsU2VsZWN0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZWwtc2VsZWN0JyksXG4gICAgICByYWdFbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFnLWVuYWJsZWQnKSxcbiAgICAgIHRhYkNvbnRleHRFbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWNvbnRleHQtZW5hYmxlZCcpLFxuICAgICAgcmFnU3RhdHVzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFnLXN0YXR1cycpLFxuXG4gICAgICAvLyBUb29sc1xuICAgICAgdGFiVG9vbHM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItdG9vbHMnKSxcbiAgICAgIG1jcFN0YXR1czogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC1zdGF0dXMnKSxcbiAgICAgIG1jcFRvb2xzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWNwLXRvb2xzJyksXG4gICAgICBtY3BUb29sTGlzdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC10b29sLWxpc3QnKSxcbiAgICAgIGFnZW50Q291bnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZ2VudC1jb3VudCcpLFxuICAgICAgYWdlbnRMaXN0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlbnQtbGlzdCcpLFxuICAgICAgdGFiRnM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItZnMnKSxcbiAgICAgIHJlZnJlc2hUYWJzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaC10YWJzJyksXG4gICAgICBncHVTdGF0dXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncHUtc3RhdHVzJyksXG4gICAgICBncHVNb2RlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1tb2RlbCcpLFxuICAgICAgbGF1bmNoQWdlbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXVuY2gtYWdlbnQnKSxcblxuICAgICAgLy8gU2V0dGluZ3NcbiAgICAgIHRhYlNldHRpbmdzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXNldHRpbmdzJyksXG4gICAgICB1c2VyQXZhdGFyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1hdmF0YXInKSxcbiAgICAgIHVzZXJOYW1lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1uYW1lJyksXG4gICAgICB1c2VyRW1haWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLWVtYWlsJyksXG4gICAgICBsb2dvdXRCdG46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvdXQtYnRuJyksXG4gICAgICBzYXZlU2V0dGluZ3M6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLXNldHRpbmdzJyksXG4gICAgICBkZWZhdWx0TW9kZWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWZhdWx0LW1vZGVsJyksXG4gICAgICByYWdVc2VaYXA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWctdXNlLXphcCcpLFxuICAgICAgcmFnSW5jbHVkZVRhYkNvbnRleHQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWctaW5jbHVkZS10YWItY29udGV4dCcpLFxuICAgICAgcmFnVG9wSzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhZy10b3AtaycpLFxuICAgICAgcmFnS2I6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWcta2InKSxcbiAgICAgIHJhZ0VuZHBvaW50OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmFnLWVuZHBvaW50JyksXG4gICAgICByYWdBcGlLZXk6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWctYXBpLWtleScpLFxuICAgIH07XG4gIH1cblxuICBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIC8vIEF1dGhcbiAgICB0aGlzLmVsLmF1dGhCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5sb2dpbigpKTtcblxuICAgIC8vIFRhYnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zd2l0Y2hUYWIodGFiLmRhdGFzZXQudGFiKSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGF0XG4gICAgdGhpcy5lbC5zZW5kQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZSgpKTtcbiAgICB0aGlzLmVsLmNoYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVsLmNoYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHRoaXMuYXV0b1Jlc2l6ZSgpKTtcbiAgICB0aGlzLmVsLnJhZ0VuYWJsZWQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2V0UmFnU3RhdHVzKHRoaXMuZWwucmFnRW5hYmxlZC5jaGVja2VkID8gJ1JBRyBlbmFibGVkJyA6ICdSQUcgZGlzYWJsZWQnKTtcbiAgICB9KTtcbiAgICB0aGlzLmVsLnRhYkNvbnRleHRFbmFibGVkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZWwucmFnRW5hYmxlZD8uY2hlY2tlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRSYWdTdGF0dXModGhpcy5lbC50YWJDb250ZXh0RW5hYmxlZC5jaGVja2VkID8gJ1RhYiBjb250ZXh0IG9uJyA6ICdUYWIgY29udGV4dCBvZmYnKTtcbiAgICB9KTtcblxuICAgIC8vIFRvb2xzXG4gICAgdGhpcy5lbC5yZWZyZXNoVGFicz8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnJlZnJlc2hUYWJGaWxlc3lzdGVtKCkpO1xuICAgIHRoaXMuZWwubGF1bmNoQWdlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zaG93QWdlbnRMYXVuY2hlcigpKTtcblxuICAgIC8vIFNldHRpbmdzXG4gICAgdGhpcy5lbC5sb2dvdXRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5sb2dvdXQoKSk7XG4gICAgdGhpcy5lbC5zYXZlU2V0dGluZ3M/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zYXZlU2V0dGluZ3MoKSk7XG5cbiAgICAvLyBCYWNrZ3JvdW5kIG1lc3NhZ2VzXG4gICAgY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChyZXF1ZXN0LCBzZW5kZXIsIHNlbmRSZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVNZXNzYWdlKHJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQXV0aFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBhc3luYyBjaGVja0F1dGgoKSB7XG4gICAgLy8gQWx3YXlzIHNob3cgdGFicyBhbmQgaW5pdGlhbGl6ZSB0b29scyBcdTIwMTQgYXV0aCBvbmx5IGdhdGVzIGNoYXRcbiAgICB0aGlzLmVsLnRhYkJhci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICB0aGlzLmVsLmF1dGhTZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmZWF0dXJlcyB0aGF0IHdvcmsgd2l0aG91dCBhdXRoXG4gICAgdGhpcy5jb25uZWN0VG9NQ1AoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWJGaWxlc3lzdGVtKCk7XG4gICAgdGhpcy5jaGVja1dlYkdQVSgpO1xuICAgIHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgdGhpcy5zdGFydE1vbml0b3JpbmcoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYXV0aC5zdGF0dXMnIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlPy5zdWNjZXNzICYmIHJlc3BvbnNlLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRVc2VyKHJlc3BvbnNlLnVzZXIpO1xuICAgICAgICB0aGlzLnN3aXRjaFRhYignY2hhdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Q2hhdExvZ2luUHJvbXB0KCk7XG4gICAgICAgIHRoaXMuc3dpdGNoVGFiKCdjaGF0Jyk7IC8vIFNob3cgY2hhdCB0YWIgd2l0aCBsb2dpbiBwcm9tcHRcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQXV0aCBjaGVjayBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgdGhpcy5zaG93Q2hhdExvZ2luUHJvbXB0KCk7XG4gICAgICB0aGlzLnN3aXRjaFRhYignY2hhdCcpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvZ2luKCkge1xuICAgIHRoaXMuZWwuYXV0aEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5lbC5hdXRoQnRuLnRleHRDb250ZW50ID0gJ1NpZ25pbmcgaW4uLi4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmxvZ2luJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZT8uc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnNldFVzZXIocmVzcG9uc2UudXNlcik7XG4gICAgICAgIHRoaXMuaGlkZUNoYXRMb2dpblByb21wdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IocmVzcG9uc2U/LmVycm9yIHx8ICdTaWduIGluIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignU2lnbiBpbiBmYWlsZWQnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lbC5hdXRoQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmVsLmF1dGhCdG4udGV4dENvbnRlbnQgPSAnU2lnbiBpbic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9nb3V0KCkge1xuICAgIGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYXV0aC5sb2dvdXQnIH0pO1xuICAgIHRoaXMuZWwudXNlckJhZGdlLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHRoaXMuZWwudXNlck5hbWUudGV4dENvbnRlbnQgPSAnJztcbiAgICB0aGlzLmVsLnVzZXJFbWFpbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIHRoaXMuc2hvd0NoYXRMb2dpblByb21wdCgpO1xuICAgIHRoaXMuc3dpdGNoVGFiKCd0b29scycpO1xuICB9XG5cbiAgc2V0VXNlcih1c2VyKSB7XG4gICAgdGhpcy5hdXRoZW50aWNhdGVkID0gdHJ1ZTtcbiAgICBpZiAodXNlcikge1xuICAgICAgY29uc3QgYXZhdGFyID0gdXNlci5waWN0dXJlIHx8IHVzZXIuYXZhdGFyIHx8ICcnO1xuICAgICAgaWYgKGF2YXRhcikge1xuICAgICAgICB0aGlzLmVsLmhlYWRlckF2YXRhci5zcmMgPSBhdmF0YXI7XG4gICAgICAgIHRoaXMuZWwudXNlckJhZGdlLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgICAgICB0aGlzLmVsLnVzZXJBdmF0YXIuc3JjID0gYXZhdGFyO1xuICAgICAgfVxuICAgICAgdGhpcy5lbC51c2VyTmFtZS50ZXh0Q29udGVudCA9IHVzZXIubmFtZSB8fCB1c2VyLmRpc3BsYXlOYW1lIHx8ICdVc2VyJztcbiAgICAgIHRoaXMuZWwudXNlckVtYWlsLnRleHRDb250ZW50ID0gdXNlci5lbWFpbCB8fCAnJztcbiAgICB9XG4gICAgdGhpcy5sb2FkTW9kZWxzKCk7XG4gICAgdGhpcy5sb2FkQ29udmVyc2F0aW9uKCk7XG4gIH1cblxuICBzaG93Q2hhdExvZ2luUHJvbXB0KCkge1xuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IGZhbHNlO1xuICAgIC8vIFNob3cgbG9naW4gcHJvbXB0IGluIGNoYXQgYXJlYSBpbnN0ZWFkIG9mIGJsb2NraW5nIGVudGlyZSBzaWRlYmFyXG4gICAgY29uc3QgY2hhdExvZ2luID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtbG9naW4tcHJvbXB0Jyk7XG4gICAgaWYgKGNoYXRMb2dpbikgY2hhdExvZ2luLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgIGNvbnN0IGNoYXRDb21wb3NlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWNvbXBvc2VyJyk7XG4gICAgaWYgKGNoYXRDb21wb3NlcikgY2hhdENvbXBvc2VyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICB9XG5cbiAgaGlkZUNoYXRMb2dpblByb21wdCgpIHtcbiAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xuICAgIGNvbnN0IGNoYXRMb2dpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGF0LWxvZ2luLXByb21wdCcpO1xuICAgIGlmIChjaGF0TG9naW4pIGNoYXRMb2dpbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICBjb25zdCBjaGF0Q29tcG9zZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdC1jb21wb3NlcicpO1xuICAgIGlmIChjaGF0Q29tcG9zZXIpIGNoYXRDb21wb3Nlci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUYWIgTmF2aWdhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBzd2l0Y2hUYWIobmFtZSkge1xuICAgIHRoaXMuY3VycmVudFRhYiA9IG5hbWU7XG5cbiAgICAvLyBVcGRhdGUgdGFiIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFiJykuZm9yRWFjaCh0ID0+IHtcbiAgICAgIHQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgdC5kYXRhc2V0LnRhYiA9PT0gbmFtZSk7XG4gICAgfSk7XG5cbiAgICAvLyBTaG93L2hpZGUgY29udGVudFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWItY29udGVudCcpLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpKTtcbiAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGFiLSR7bmFtZX1gKTtcbiAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2hhdFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBhc3luYyBsb2FkTW9kZWxzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnY2hhdC5saXN0TW9kZWxzJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZS5tb2RlbHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBzZWxlY3QgPSB0aGlzLmVsLm1vZGVsU2VsZWN0O1xuICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgcmVzcG9uc2UubW9kZWxzKSB7XG4gICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgICAgb3B0LnZhbHVlID0gbW9kZWwuaWQ7XG4gICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gbW9kZWwubmFtZSB8fCBtb2RlbC5pZDtcbiAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIHBvcHVsYXRlIHNldHRpbmdzIGRlZmF1bHQgbW9kZWxcbiAgICAgICAgdGhpcy5lbC5kZWZhdWx0TW9kZWwuaW5uZXJIVE1MID0gc2VsZWN0LmlubmVySFRNTDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgZGVmYXVsdCBvcHRpb25zXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UoKSB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZWwuY2hhdElucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXRleHQgfHwgdGhpcy5zdHJlYW1pbmcpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuYXV0aGVudGljYXRlZCkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ1BsZWFzZSBzaWduIGluIHRvIHVzZSBjaGF0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRva2VuXG4gICAgY29uc3QgdG9rZW5SZXNwID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmdldFRva2VuJyB9KTtcbiAgICBpZiAoIXRva2VuUmVzcD8uc3VjY2VzcyB8fCAhdG9rZW5SZXNwLnRva2VuKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignUGxlYXNlIHNpZ24gaW4gYWdhaW4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyTWVzc2FnZSA9IHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiB0ZXh0IH07XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLmVsLm1vZGVsU2VsZWN0LnZhbHVlO1xuICAgIGxldCByZXF1ZXN0TWVzc2FnZXMgPSBbLi4udGhpcy5tZXNzYWdlcywgdXNlck1lc3NhZ2VdO1xuXG4gICAgdGhpcy5yYWdDb250ZXh0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5lbC5yYWdFbmFibGVkPy5jaGVja2VkKSB7XG4gICAgICB0aGlzLnNldFJhZ1N0YXR1cygnUmV0cmlldmluZyBjb250ZXh0Li4uJyk7XG4gICAgICBjb25zdCByYWdSZXNwID0gYXdhaXQgdGhpcy5yZXF1ZXN0UmFnQ29udGV4dCh0ZXh0KTtcbiAgICAgIGlmIChyYWdSZXNwPy5zdWNjZXNzICYmIEFycmF5LmlzQXJyYXkocmFnUmVzcC5zbmlwcGV0cykgJiYgcmFnUmVzcC5zbmlwcGV0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yYWdDb250ZXh0ID0gcmFnUmVzcDtcbiAgICAgICAgcmVxdWVzdE1lc3NhZ2VzID0gW1xuICAgICAgICAgIHsgcm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6IHRoaXMuYnVpbGRSYWdTeXN0ZW1Qcm9tcHQocmFnUmVzcCkgfSxcbiAgICAgICAgICAuLi5yZXF1ZXN0TWVzc2FnZXMsXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuc2V0UmFnU3RhdHVzKGBSQUc6ICR7cmFnUmVzcC5zbmlwcGV0cy5sZW5ndGh9IHNuaXBwZXQocykgZnJvbSAke3JhZ1Jlc3Auc291cmNlIHx8ICdjb250ZXh0J31gKTtcbiAgICAgIH0gZWxzZSBpZiAocmFnUmVzcD8uZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZXRSYWdTdGF0dXMoYFJBRyB1bmF2YWlsYWJsZSAoJHtyYWdSZXNwLmVycm9yfSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0UmFnU3RhdHVzKCdObyBjb250ZXh0IGZvdW5kJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UmFnU3RhdHVzKCdSQUcgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdXNlciBtZXNzYWdlIHRvIHRyYW5zY3JpcHRcbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2godXNlck1lc3NhZ2UpO1xuICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgndXNlcicsIHRleHQpO1xuXG4gICAgLy8gQ2xlYXIgaW5wdXRcbiAgICB0aGlzLmVsLmNoYXRJbnB1dC52YWx1ZSA9ICcnO1xuICAgIHRoaXMuYXV0b1Jlc2l6ZSgpO1xuXG4gICAgLy8gU2hvdyB0eXBpbmdcbiAgICB0aGlzLnN0cmVhbWluZyA9IHRydWU7XG4gICAgdGhpcy5lbC5zZW5kQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCB0eXBpbmdFbCA9IHRoaXMuc2hvd1R5cGluZygpO1xuXG4gICAgLy8gQ3JlYXRlIGFzc2lzdGFudCBtZXNzYWdlIGVsZW1lbnRcbiAgICBjb25zdCBhc3Npc3RhbnRFbCA9IHRoaXMuYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJycpO1xuICAgIGxldCBmdWxsQ29udGVudCA9ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFN0cmVhbSB2aWEgZGlyZWN0IGZldGNoIChzaWRlYmFyIGhhcyBhY2Nlc3MgdmlhIENTUClcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLmhhbnpvLmFpL3YxL2NoYXQvY29tcGxldGlvbnMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlblJlc3AudG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIG1lc3NhZ2VzOiByZXF1ZXN0TWVzc2FnZXMsXG4gICAgICAgICAgc3RyZWFtOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICAgc2lnbmFsOiAodGhpcy5zdHJlYW1Db250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpKS5zaWduYWwsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFQSSBlcnJvciAke3Jlc3BvbnNlLnN0YXR1c306ICR7ZXJyVGV4dH1gKTtcbiAgICAgIH1cblxuICAgICAgdHlwaW5nRWwucmVtb3ZlKCk7XG4gICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgbGV0IGJ1ZmZlciA9ICcnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG5cbiAgICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcbicpO1xuICAgICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSB8fCAnJztcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgICAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQuc3RhcnRzV2l0aCgnOicpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdkYXRhOiAnKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRyaW1tZWQuc2xpY2UoNik7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gJ1tET05FXScpIGJyZWFrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwYXJzZWQuY2hvaWNlcz8uWzBdPy5kZWx0YT8uY29udGVudDtcbiAgICAgICAgICAgICAgaWYgKGRlbHRhKSB7XG4gICAgICAgICAgICAgICAgZnVsbENvbnRlbnQgKz0gZGVsdGE7XG4gICAgICAgICAgICAgICAgYXNzaXN0YW50RWwuaW5uZXJIVE1MID0gdGhpcy5yZW5kZXJNYXJrZG93bihmdWxsQ29udGVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJhZ0NvbnRleHQ/LnNuaXBwZXRzPy5sZW5ndGgpIHtcbiAgICAgICAgZnVsbENvbnRlbnQgKz0gdGhpcy5idWlsZFJhZ0NpdGF0aW9uQmxvY2sodGhpcy5yYWdDb250ZXh0KTtcbiAgICAgICAgYXNzaXN0YW50RWwuaW5uZXJIVE1MID0gdGhpcy5yZW5kZXJNYXJrZG93bihmdWxsQ29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7IHJvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBmdWxsQ29udGVudCB9KTtcbiAgICAgIHRoaXMuc2F2ZUNvbnZlcnNhdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0eXBpbmdFbC5yZW1vdmUoKTtcbiAgICAgIGlmIChlcnJvcj8ubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGFzc2lzdGFudEVsLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmFwcGVuZEVycm9yKGVycm9yPy5tZXNzYWdlIHx8ICdDaGF0IGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gbnVsbDtcbiAgICAgIHRoaXMuZWwuc2VuZEJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEFjdGl2ZVRhYkNvbnRleHQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFthY3RpdmVUYWJdID0gYXdhaXQgY2hyb21lLnRhYnMucXVlcnkoeyBhY3RpdmU6IHRydWUsIGN1cnJlbnRXaW5kb3c6IHRydWUgfSk7XG4gICAgICBpZiAoIWFjdGl2ZVRhYikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IGFjdGl2ZVRhYi51cmwgfHwgJycsXG4gICAgICAgIHRpdGxlOiBhY3RpdmVUYWIudGl0bGUgfHwgJycsXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVxdWVzdFJhZ0NvbnRleHQocXVlcnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZUNvbnRleHQgPSB0aGlzLmVsLnRhYkNvbnRleHRFbmFibGVkPy5jaGVja2VkID8gYXdhaXQgdGhpcy5nZXRBY3RpdmVUYWJDb250ZXh0KCkgOiBudWxsO1xuICAgICAgY29uc3QgdG9wSyA9IE1hdGgubWF4KDEsIE1hdGgubWluKHBhcnNlSW50KHRoaXMuZWwucmFnVG9wSz8udmFsdWUgfHwgJzUnLCAxMCkgfHwgNSwgMjApKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgYWN0aW9uOiAncmFnLnF1ZXJ5JyxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHRvcEssXG4gICAgICAgIGluY2x1ZGVUYWJDb250ZXh0OiAhIXRoaXMuZWwudGFiQ29udGV4dEVuYWJsZWQ/LmNoZWNrZWQsXG4gICAgICAgIHVzZVphcE1lbW9yeTogISF0aGlzLmVsLnJhZ1VzZVphcD8uY2hlY2tlZCxcbiAgICAgICAga25vd2xlZGdlQmFzZTogdGhpcy5lbC5yYWdLYj8udmFsdWUgfHwgJycsXG4gICAgICAgIGVuZHBvaW50OiB0aGlzLmVsLnJhZ0VuZHBvaW50Py52YWx1ZSB8fCAnJyxcbiAgICAgICAgYXBpS2V5OiB0aGlzLmVsLnJhZ0FwaUtleT8udmFsdWUgfHwgJycsXG4gICAgICAgIHBhZ2VDb250ZXh0OiBwYWdlQ29udGV4dCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHF1ZXJ5IFJBRycgfTtcbiAgICB9XG4gIH1cblxuICBidWlsZFJhZ1N5c3RlbVByb21wdChyYWdSZXNwb25zZSkge1xuICAgIGNvbnN0IHNuaXBwZXRzID0gKHJhZ1Jlc3BvbnNlPy5zbmlwcGV0cyB8fCBbXSkuc2xpY2UoMCwgOCk7XG4gICAgY29uc3QgbGluZXMgPSBzbmlwcGV0cy5tYXAoKHNuaXBwZXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0aXRsZSA9IHNuaXBwZXQudGl0bGUgfHwgc25pcHBldC5zb3VyY2UgfHwgYFNuaXBwZXQgJHtpbmRleCArIDF9YDtcbiAgICAgIGNvbnN0IHNjb3JlID0gdHlwZW9mIHNuaXBwZXQuc2NvcmUgPT09ICdudW1iZXInID8gYCAoc2NvcmUgJHtzbmlwcGV0LnNjb3JlLnRvRml4ZWQoMyl9KWAgOiAnJztcbiAgICAgIGNvbnN0IHNvdXJjZUxpbmUgPSBzbmlwcGV0LnVybCA/IGAke3RpdGxlfSR7c2NvcmV9IFx1MjAxNCAke3NuaXBwZXQudXJsfWAgOiBgJHt0aXRsZX0ke3Njb3JlfWA7XG4gICAgICByZXR1cm4gYFske2luZGV4ICsgMX1dICR7c291cmNlTGluZX1cXG4ke3NuaXBwZXQuY29udGVudH1gO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICdZb3UgYXJlIGFzc2lzdGluZyBpbnNpZGUgSGFuem8gQnJvd3NlciBFeHRlbnNpb24uJyxcbiAgICAgICdVc2UgdGhlIHJldHJpZXZlZCBjb250ZXh0IGJlbG93IHdoZW4gcmVsZXZhbnQsIGFuZCBzdGF0ZSB1bmNlcnRhaW50eSBpZiBjb250ZXh0IGlzIGluc3VmZmljaWVudC4nLFxuICAgICAgJ1JldHJpZXZlZCBDb250ZXh0OicsXG4gICAgICAuLi5saW5lcyxcbiAgICBdLmpvaW4oJ1xcblxcbicpO1xuICB9XG5cbiAgYnVpbGRSYWdDaXRhdGlvbkJsb2NrKHJhZ1Jlc3BvbnNlKSB7XG4gICAgY29uc3Qgc25pcHBldHMgPSAocmFnUmVzcG9uc2U/LnNuaXBwZXRzIHx8IFtdKS5zbGljZSgwLCA1KTtcbiAgICBpZiAoIXNuaXBwZXRzLmxlbmd0aCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3Qgcm93cyA9IHNuaXBwZXRzLm1hcCgoc25pcHBldCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gc25pcHBldC50aXRsZSB8fCBzbmlwcGV0LnNvdXJjZSB8fCBgU25pcHBldCAke2luZGV4ICsgMX1gO1xuICAgICAgaWYgKHNuaXBwZXQudXJsKSB7XG4gICAgICAgIHJldHVybiBgLSAke3RpdGxlfTogJHtzbmlwcGV0LnVybH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAtICR7dGl0bGV9YDtcbiAgICB9KTtcblxuICAgIHJldHVybiBgXFxuXFxuLS0tXFxuQ29udGV4dCBTb3VyY2VzOlxcbiR7cm93cy5qb2luKCdcXG4nKX1gO1xuICB9XG5cbiAgc2V0UmFnU3RhdHVzKHRleHQpIHtcbiAgICBpZiAoIXRoaXMuZWwucmFnU3RhdHVzKSByZXR1cm47XG4gICAgdGhpcy5lbC5yYWdTdGF0dXMudGV4dENvbnRlbnQgPSB0ZXh0IHx8ICdSZWFkeSc7XG4gIH1cblxuICBhcHBlbmRNZXNzYWdlKHJvbGUsIGNvbnRlbnQpIHtcbiAgICAvLyBSZW1vdmUgd2VsY29tZSBtZXNzYWdlXG4gICAgY29uc3Qgd2VsY29tZSA9IHRoaXMuZWwuY2hhdE1lc3NhZ2VzLnF1ZXJ5U2VsZWN0b3IoJy5jaGF0LXdlbGNvbWUnKTtcbiAgICBpZiAod2VsY29tZSkgd2VsY29tZS5yZW1vdmUoKTtcblxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBgbXNnIG1zZy0ke3JvbGV9YDtcbiAgICBkaXYuaW5uZXJIVE1MID0gcm9sZSA9PT0gJ2Fzc2lzdGFudCcgPyB0aGlzLnJlbmRlck1hcmtkb3duKGNvbnRlbnQpIDogdGhpcy5lc2NhcGVIdG1sKGNvbnRlbnQpO1xuICAgIHRoaXMuZWwuY2hhdE1lc3NhZ2VzLmFwcGVuZENoaWxkKGRpdik7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBhcHBlbmRFcnJvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdtc2ctZXJyb3InO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgdGhpcy5lbC5jaGF0TWVzc2FnZXMuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cblxuICBzaG93VHlwaW5nKCkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAndHlwaW5nLWluZGljYXRvcic7XG4gICAgZGl2LmlubmVySFRNTCA9ICc8c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj4nO1xuICAgIHRoaXMuZWwuY2hhdE1lc3NhZ2VzLmFwcGVuZENoaWxkKGRpdik7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbSgpIHtcbiAgICB0aGlzLmVsLmNoYXRNZXNzYWdlcy5zY3JvbGxUb3AgPSB0aGlzLmVsLmNoYXRNZXNzYWdlcy5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICBhdXRvUmVzaXplKCkge1xuICAgIGNvbnN0IGVsID0gdGhpcy5lbC5jaGF0SW5wdXQ7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9IE1hdGgubWluKGVsLnNjcm9sbEhlaWdodCwgMTIwKSArICdweCc7XG4gIH1cblxuICAvLyBNaW5pbWFsIG1hcmtkb3duOiBjb2RlIGJsb2NrcywgaW5saW5lIGNvZGUsIGJvbGQsIGl0YWxpYywgbGluZSBicmVha3NcbiAgcmVuZGVyTWFya2Rvd24odGV4dCkge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGxldCBodG1sID0gdGhpcy5lc2NhcGVIdG1sKHRleHQpO1xuXG4gICAgLy8gQ29kZSBibG9ja3M6IGBgYGxhbmdcXG4uLi5cXG5gYGBcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gYGAoXFx3KilcXG4oW1xcc1xcU10qPylgYGAvZywgKF8sIGxhbmcsIGNvZGUpID0+IHtcbiAgICAgIHJldHVybiBgPHByZT48Y29kZT4ke2NvZGUudHJpbSgpfTwvY29kZT48L3ByZT5gO1xuICAgIH0pO1xuXG4gICAgLy8gSW5saW5lIGNvZGU6IGAuLi5gXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvYChbXmBdKylgL2csICc8Y29kZT4kMTwvY29kZT4nKTtcblxuICAgIC8vIEJvbGQ6ICoqLi4uKipcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXCpcXCooW14qXSspXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+Jyk7XG5cbiAgICAvLyBJdGFsaWM6ICouLi4qXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFwqKFteKl0rKVxcKi9nLCAnPGVtPiQxPC9lbT4nKTtcblxuICAgIC8vIExpbmUgYnJlYWtzXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XG5cbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGVzY2FwZUh0bWwodGV4dCkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICBhc3luYyBsb2FkQ29udmVyc2F0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFsnaGFuem9fY2hhdF9tZXNzYWdlcyddLCAocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuaGFuem9fY2hhdF9tZXNzYWdlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHJlc3VsdC5oYW56b19jaGF0X21lc3NhZ2VzO1xuICAgICAgICAgIC8vIFJlbmRlciBzdG9yZWQgbWVzc2FnZXNcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gdGhpcy5lbC5jaGF0TWVzc2FnZXMucXVlcnlTZWxlY3RvcignLmNoYXQtd2VsY29tZScpO1xuICAgICAgICAgIGlmICh3ZWxjb21lKSB3ZWxjb21lLnJlbW92ZSgpO1xuICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHRoaXMubWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kTWVzc2FnZShtc2cucm9sZSwgbXNnLmNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVDb252ZXJzYXRpb24oKSB7XG4gICAgLy8gS2VlcCBsYXN0IDUwIG1lc3NhZ2VzXG4gICAgY29uc3QgdG9TdG9yZSA9IHRoaXMubWVzc2FnZXMuc2xpY2UoLTUwKTtcbiAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoeyBoYW56b19jaGF0X21lc3NhZ2VzOiB0b1N0b3JlIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRvb2xzIFRhYlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBhc3luYyBjb25uZWN0VG9NQ1AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHphcFJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICd6YXAuc3RhdHVzJyB9KTtcbiAgICAgIGlmICh6YXBSZXNwb25zZT8uc3VjY2Vzcykge1xuICAgICAgICBjb25zdCB6YXAgPSB6YXBSZXNwb25zZS56YXA7XG4gICAgICAgIGNvbnN0IHRvb2xDb3VudCA9IHphcC5tY3BzPy5yZWR1Y2UoKHN1bSwgbSkgPT4gc3VtICsgKG0udG9vbHM/Lmxlbmd0aCB8fCAwKSwgMCkgfHwgMDtcbiAgICAgICAgdGhpcy51cGRhdGVNQ1BTdGF0dXMoemFwLmNvbm5lY3RlZCwgdG9vbENvdW50LCB6YXAubWNwcz8ubGVuZ3RoIHx8IDApO1xuICAgICAgICBpZiAoemFwLmNvbm5lY3RlZCkge1xuICAgICAgICAgIGNvbnN0IHRvb2xzUmVzcCA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnemFwLmxpc3RUb29scycgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNQ1BUb29sTGlzdCh0b29sc1Jlc3A/LnN1Y2Nlc3MgPyB0b29sc1Jlc3AudG9vbHMgOiBbXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNQ1BUb29sTGlzdChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlTUNQU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVNQ1BUb29sTGlzdChbXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVwZGF0ZU1DUFN0YXR1cyhmYWxzZSk7XG4gICAgICB0aGlzLnVwZGF0ZU1DUFRvb2xMaXN0KFtdKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVNQ1BTdGF0dXMoY29ubmVjdGVkLCB0b29sQ291bnQgPSAwLCBtY3BDb3VudCA9IDApIHtcbiAgICB0aGlzLmVsLm1jcFN0YXR1cy5pbm5lckhUTUwgPSBjb25uZWN0ZWQgPyBgXG4gICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pbmRpY2F0b3IgY29ubmVjdGVkXCI+PC9zcGFuPlxuICAgICAgJHttY3BDb3VudCA+IDAgPyBgWkFQOiAke21jcENvdW50fSBNQ1AocylgIDogJ0Nvbm5lY3RlZCd9XG4gICAgYCA6IGBcbiAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvciBkaXNjb25uZWN0ZWRcIj48L3NwYW4+XG4gICAgICBEaXNjb25uZWN0ZWRcbiAgICBgO1xuICAgIHRoaXMuZWwubWNwVG9vbHMudGV4dENvbnRlbnQgPSB0b29sQ291bnQ7XG4gIH1cblxuICB1cGRhdGVNQ1BUb29sTGlzdCh0b29scykge1xuICAgIGlmICghdGhpcy5lbC5tY3BUb29sTGlzdCkgcmV0dXJuO1xuICAgIGlmICghdG9vbHMgfHwgIXRvb2xzLmxlbmd0aCkge1xuICAgICAgdGhpcy5lbC5tY3BUb29sTGlzdC50ZXh0Q29udGVudCA9ICdObyB0b29scyBkaXNjb3ZlcmVkIHlldC4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSkpLnNvcnQoKTtcbiAgICBjb25zdCBwcmV2aWV3ID0gbmFtZXMuc2xpY2UoMCwgMjApO1xuICAgIGNvbnN0IHN1ZmZpeCA9IG5hbWVzLmxlbmd0aCA+IHByZXZpZXcubGVuZ3RoID8gYFxcbi4uLiArJHtuYW1lcy5sZW5ndGggLSBwcmV2aWV3Lmxlbmd0aH0gbW9yZWAgOiAnJztcbiAgICB0aGlzLmVsLm1jcFRvb2xMaXN0LnRleHRDb250ZW50ID0gYCR7cHJldmlldy5qb2luKCdcXG4nKX0ke3N1ZmZpeH1gO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaFRhYkZpbGVzeXN0ZW0oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhYnMgPSBhd2FpdCBjaHJvbWUudGFicy5xdWVyeSh7fSk7XG4gICAgICB0aGlzLmVsLnRhYkZzLmlubmVySFRNTCA9IHRhYnMubWFwKCh0YWIsIGkpID0+IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1pdGVtICR7dGFiLmFjdGl2ZSA/ICdhY3RpdmUnIDogJyd9XCIgZGF0YS10YWItaWQ9XCIke3RhYi5pZH1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTIgMnYxMmgxMlYySDJ6bTEgMWgxMHYxMEgzVjN6XCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIHRpdGxlPVwiJHt0aGlzLmVzY2FwZUh0bWwodGFiLnVybCB8fCAnJyl9XCI+L3RhYnMvJHtpfS8ke3RoaXMuc2FuaXRpemVQYXRoKHRhYi50aXRsZSB8fCAndW50aXRsZWQnKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYCkuam9pbignJyk7XG5cbiAgICAgIHRoaXMuZWwudGFiRnMucXVlcnlTZWxlY3RvckFsbCgnLnRhYi1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBjaHJvbWUudGFicy51cGRhdGUocGFyc2VJbnQoaXRlbS5kYXRhc2V0LnRhYklkKSwgeyBhY3RpdmU6IHRydWUgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgc2FuaXRpemVQYXRoKHRpdGxlKSB7XG4gICAgcmV0dXJuIHRpdGxlLnJlcGxhY2UoL1teYS16QS1aMC05LV9dL2csICdfJykudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMCwgMzApO1xuICB9XG5cbiAgYXN5bmMgY2hlY2tXZWJHUFUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdjaGVja1dlYkdQVScgfSk7XG4gICAgICBpZiAocmVzcG9uc2U/LmF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLmVsLmdwdVN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIGNvbm5lY3RlZFwiPjwvc3Bhbj5cbiAgICAgICAgICBBdmFpbGFibGVcbiAgICAgICAgYDtcbiAgICAgICAgdGhpcy5lbC5ncHVNb2RlbC50ZXh0Q29udGVudCA9IHJlc3BvbnNlLmFkYXB0ZXIgfHwgJ1Vua25vd24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbC5ncHVTdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvciBkaXNjb25uZWN0ZWRcIj48L3NwYW4+XG4gICAgICAgICAgTm90IEF2YWlsYWJsZVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHVwZGF0ZUFnZW50TGlzdCgpIHtcbiAgICBjb25zdCBhcnIgPSBBcnJheS5mcm9tKHRoaXMuYWdlbnRzLnZhbHVlcygpKTtcbiAgICB0aGlzLmVsLmFnZW50Q291bnQudGV4dENvbnRlbnQgPSBhcnIubGVuZ3RoO1xuICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVsLmFnZW50TGlzdC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+Tm8gYWN0aXZlIGFnZW50czwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZWwuYWdlbnRMaXN0LmlubmVySFRNTCA9IGFyci5tYXAoYSA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtaXRlbVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtaWNvblwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgNnY2bDQgMlwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1uYW1lXCI+JHt0aGlzLmVzY2FwZUh0bWwoYS5uYW1lKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtc3RhdHVzXCI+JHthLnN0YXR1c30gXHUyMDIyIFRhYiAke2EudGFiSWR9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0biBzbWFsbFwiIGRhdGEtc3RvcD1cIiR7YS5pZH1cIiB0aXRsZT1cIlN0b3BcIj5cbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYCkuam9pbignJyk7XG5cbiAgICB0aGlzLmVsLmFnZW50TGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zdG9wXScpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5zdG9wO1xuICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ3N0b3BBZ2VudCcsIGFnZW50SWQ6IGlkIH0pO1xuICAgICAgICB0aGlzLmFnZW50cy5kZWxldGUoaWQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFnZW50TGlzdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzaG93QWdlbnRMYXVuY2hlcigpIHtcbiAgICAvLyBDcmVhdGUgYWdlbnQgbGF1bmNoZXIgbW9kYWwgb3ZlcmxheVxuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBvdmVybGF5LmNsYXNzTmFtZSA9ICdtb2RhbC1vdmVybGF5JztcbiAgICBvdmVybGF5LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8aDM+TGF1bmNoIEFnZW50PC9oMz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gY2xvc2UtbW9kYWxcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNldHRpbmctaXRlbVwiPlxuICAgICAgICAgICAgPHNwYW4+VGFyZ2V0IFRhYjwvc3Bhbj5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhZ2VudC10YWItc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY3RpdmVcIj5BY3RpdmUgVGFiPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNldHRpbmctaXRlbVwiPlxuICAgICAgICAgICAgPHNwYW4+QWdlbnQgVHlwZTwvc3Bhbj5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhZ2VudC10eXBlLXNlbGVjdFwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJvd3Nlci1jb250cm9sXCI+QnJvd3NlciBBdXRvbWF0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwYWdlLWFuYWx5emVyXCI+UGFnZSBBbmFseXplcjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZm9ybS1maWxsZXJcIj5Gb3JtIEZpbGxlcjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGF0YS1leHRyYWN0b3JcIj5EYXRhIEV4dHJhY3Rvcjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZXR0aW5nLWl0ZW1cIj5cbiAgICAgICAgICAgIDxzcGFuPkluc3RydWN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImFnZW50LWluc3RydWN0aW9uc1wiIHJvd3M9XCIzXCIgcGxhY2Vob2xkZXI9XCJEZXNjcmliZSB3aGF0IHRoZSBhZ2VudCBzaG91bGQgZG8uLi5cIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlY29uZGFyeS1idG4gY2FuY2VsLW1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInByaW1hcnktYnRuIGxhdW5jaC1tb2RhbFwiPkxhdW5jaDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcblxuICAgIC8vIFBvcHVsYXRlIHRhYnNcbiAgICBjaHJvbWUudGFicy5xdWVyeSh7fSwgKHRhYnMpID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2FnZW50LXRhYi1zZWxlY3QnKTtcbiAgICAgIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICBpZiAodGFiLmlkKSB7XG4gICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgICAgb3B0LnZhbHVlID0gdGFiLmlkO1xuICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGAke3RhYi50aXRsZT8uc3Vic3RyaW5nKDAsIDQwKSB8fCAnVW50aXRsZWQnfSAke3RhYi5hY3RpdmUgPyAnKGFjdGl2ZSknIDogJyd9YDtcbiAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbG9zZSBoYW5kbGVyc1xuICAgIG92ZXJsYXkucXVlcnlTZWxlY3RvcignLmNsb3NlLW1vZGFsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBvdmVybGF5LnJlbW92ZSgpKTtcbiAgICBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5jYW5jZWwtbW9kYWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG92ZXJsYXkucmVtb3ZlKCkpO1xuICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIG92ZXJsYXkucmVtb3ZlKCk7IH0pO1xuXG4gICAgLy8gTGF1bmNoIGhhbmRsZXJcbiAgICBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5sYXVuY2gtbW9kYWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYlNlbGVjdCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignI2FnZW50LXRhYi1zZWxlY3QnKTtcbiAgICAgIGNvbnN0IHR5cGVTZWxlY3QgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJyNhZ2VudC10eXBlLXNlbGVjdCcpO1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcjYWdlbnQtaW5zdHJ1Y3Rpb25zJyk7XG5cbiAgICAgIGxldCB0YWJJZDtcbiAgICAgIGlmICh0YWJTZWxlY3QudmFsdWUgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgIGNvbnN0IFthY3RpdmVUYWJdID0gYXdhaXQgY2hyb21lLnRhYnMucXVlcnkoeyBhY3RpdmU6IHRydWUsIGN1cnJlbnRXaW5kb3c6IHRydWUgfSk7XG4gICAgICAgIHRhYklkID0gYWN0aXZlVGFiPy5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYklkID0gcGFyc2VJbnQodGFiU2VsZWN0LnZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0YWJJZCkge1xuICAgICAgICB0aGlzLnNob3dFcnJvcignTm8gdGFiIHNlbGVjdGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWdlbnRUeXBlID0gdHlwZVNlbGVjdC52YWx1ZTtcbiAgICAgIGNvbnN0IGFnZW50SW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zLnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBvdmVybGF5LnJlbW92ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgICBhY3Rpb246ICdsYXVuY2hBSVdvcmtlcicsXG4gICAgICAgICAgdGFiSWQsXG4gICAgICAgICAgbW9kZWw6IGFnZW50VHlwZSxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IGFnZW50SW5zdHJ1Y3Rpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zdCBhZ2VudElkID0gcmVzcG9uc2UuYWdlbnRJZCB8fCBgYWdlbnQtJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX1gO1xuICAgICAgICAgIHRoaXMuYWdlbnRzLnNldChhZ2VudElkLCB7XG4gICAgICAgICAgICBpZDogYWdlbnRJZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50VHlwZSxcbiAgICAgICAgICAgIHRhYklkLFxuICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVBZ2VudExpc3QoKTtcbiAgICAgICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oYEFnZW50IGxhdW5jaGVkIG9uIHRhYiAke3RhYklkfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKHJlc3BvbnNlPy5lcnJvciB8fCAnRmFpbGVkIHRvIGxhdW5jaCBhZ2VudCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnNob3dFcnJvcignRmFpbGVkIHRvIGxhdW5jaCBhZ2VudDogJyArIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNldHRpbmdzIFRhYlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFtcbiAgICAgICdtY3BQb3J0JyxcbiAgICAgICdjZHBQb3J0JyxcbiAgICAgICd6YXBQb3J0cycsXG4gICAgICAnaGFuem9fZGVmYXVsdF9tb2RlbCcsXG4gICAgICAnaGFuem9fcmFnX2VuZHBvaW50JyxcbiAgICAgICdoYW56b19yYWdfYXBpX2tleScsXG4gICAgICAnaGFuem9fcmFnX2tiJyxcbiAgICAgICdoYW56b19yYWdfdG9wX2snLFxuICAgICAgJ2hhbnpvX3JhZ19pbmNsdWRlX3RhYl9jb250ZXh0JyxcbiAgICAgICdoYW56b19yYWdfdXNlX3phcCcsXG4gICAgICAnaGFuem9fY2hhdF9yYWdfZW5hYmxlZCcsXG4gICAgICAnaGFuem9fY2hhdF90YWJfY29udGV4dF9lbmFibGVkJyxcbiAgICBdLCAocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBtY3BQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21jcC1wb3J0LXNldHRpbmcnKTtcbiAgICAgIGNvbnN0IGNkcFBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2RwLXBvcnQtc2V0dGluZycpO1xuICAgICAgY29uc3QgemFwUG9ydHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemFwLXBvcnRzLXNldHRpbmcnKTtcblxuICAgICAgaWYgKG1jcFBvcnQpIG1jcFBvcnQudmFsdWUgPSByZXN1bHQubWNwUG9ydCB8fCAzMDAxO1xuICAgICAgaWYgKGNkcFBvcnQpIGNkcFBvcnQudmFsdWUgPSByZXN1bHQuY2RwUG9ydCB8fCA5MjIzO1xuICAgICAgaWYgKHphcFBvcnRzKSB6YXBQb3J0cy52YWx1ZSA9IChyZXN1bHQuemFwUG9ydHMgfHwgWzk5OTksOTk5OCw5OTk3LDk5OTYsOTk5NV0pLmpvaW4oJywnKTtcbiAgICAgIGlmIChyZXN1bHQuaGFuem9fZGVmYXVsdF9tb2RlbCAmJiB0aGlzLmVsLmRlZmF1bHRNb2RlbCkge1xuICAgICAgICB0aGlzLmVsLmRlZmF1bHRNb2RlbC52YWx1ZSA9IHJlc3VsdC5oYW56b19kZWZhdWx0X21vZGVsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbC5yYWdFbmRwb2ludCkgdGhpcy5lbC5yYWdFbmRwb2ludC52YWx1ZSA9IHJlc3VsdC5oYW56b19yYWdfZW5kcG9pbnQgfHwgJyc7XG4gICAgICBpZiAodGhpcy5lbC5yYWdBcGlLZXkpIHRoaXMuZWwucmFnQXBpS2V5LnZhbHVlID0gcmVzdWx0LmhhbnpvX3JhZ19hcGlfa2V5IHx8ICcnO1xuICAgICAgaWYgKHRoaXMuZWwucmFnS2IpIHRoaXMuZWwucmFnS2IudmFsdWUgPSByZXN1bHQuaGFuem9fcmFnX2tiIHx8ICcnO1xuICAgICAgaWYgKHRoaXMuZWwucmFnVG9wSykgdGhpcy5lbC5yYWdUb3BLLnZhbHVlID0gU3RyaW5nKHJlc3VsdC5oYW56b19yYWdfdG9wX2sgfHwgNSk7XG4gICAgICBpZiAodGhpcy5lbC5yYWdJbmNsdWRlVGFiQ29udGV4dCkgdGhpcy5lbC5yYWdJbmNsdWRlVGFiQ29udGV4dC5jaGVja2VkID0gcmVzdWx0LmhhbnpvX3JhZ19pbmNsdWRlX3RhYl9jb250ZXh0ICE9PSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmVsLnJhZ1VzZVphcCkgdGhpcy5lbC5yYWdVc2VaYXAuY2hlY2tlZCA9IHJlc3VsdC5oYW56b19yYWdfdXNlX3phcCAhPT0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5lbC5yYWdFbmFibGVkKSB0aGlzLmVsLnJhZ0VuYWJsZWQuY2hlY2tlZCA9IHJlc3VsdC5oYW56b19jaGF0X3JhZ19lbmFibGVkICE9PSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmVsLnRhYkNvbnRleHRFbmFibGVkKSB0aGlzLmVsLnRhYkNvbnRleHRFbmFibGVkLmNoZWNrZWQgPSByZXN1bHQuaGFuem9fY2hhdF90YWJfY29udGV4dF9lbmFibGVkICE9PSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0UmFnU3RhdHVzKHRoaXMuZWwucmFnRW5hYmxlZD8uY2hlY2tlZCA/ICdSZWFkeScgOiAnUkFHIGRpc2FibGVkJyk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgY29uc3QgbWNwUG9ydCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3AtcG9ydC1zZXR0aW5nJyk/LnZhbHVlKSB8fCAzMDAxO1xuICAgIGNvbnN0IGNkcFBvcnQgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2RwLXBvcnQtc2V0dGluZycpPy52YWx1ZSkgfHwgOTIyMztcbiAgICBjb25zdCB6YXBQb3J0cyA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemFwLXBvcnRzLXNldHRpbmcnKT8udmFsdWUgfHwgJycpXG4gICAgICAuc3BsaXQoJywnKS5tYXAocCA9PiBwYXJzZUludChwLnRyaW0oKSkpLmZpbHRlcihwID0+IHAgPiAwICYmIHAgPCA2NTUzNik7XG5cbiAgICBhd2FpdCBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoe1xuICAgICAgbWNwUG9ydCxcbiAgICAgIGNkcFBvcnQsXG4gICAgICB6YXBQb3J0czogemFwUG9ydHMubGVuZ3RoID8gemFwUG9ydHMgOiBbOTk5OSw5OTk4LDk5OTcsOTk5Niw5OTk1XSxcbiAgICAgIGhhbnpvX2RlZmF1bHRfbW9kZWw6IHRoaXMuZWwuZGVmYXVsdE1vZGVsPy52YWx1ZSB8fCAnZ3B0LTRvJyxcbiAgICAgICdzYWZlLW1vZGUnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2FmZS1tb2RlJyk/LmNoZWNrZWQsXG4gICAgICAnZW5hYmxlLXdlYmdwdSc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtd2ViZ3B1Jyk/LmNoZWNrZWQsXG4gICAgICBtYXhBZ2VudHM6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXgtYWdlbnRzJyk/LnZhbHVlKSB8fCAzLFxuICAgICAgaGFuem9fcmFnX2VuZHBvaW50OiB0aGlzLmVsLnJhZ0VuZHBvaW50Py52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgaGFuem9fcmFnX2FwaV9rZXk6IHRoaXMuZWwucmFnQXBpS2V5Py52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgaGFuem9fcmFnX2tiOiB0aGlzLmVsLnJhZ0tiPy52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgaGFuem9fcmFnX3RvcF9rOiBNYXRoLm1heCgxLCBNYXRoLm1pbihwYXJzZUludCh0aGlzLmVsLnJhZ1RvcEs/LnZhbHVlIHx8ICc1JywgMTApIHx8IDUsIDIwKSksXG4gICAgICBoYW56b19yYWdfaW5jbHVkZV90YWJfY29udGV4dDogISF0aGlzLmVsLnJhZ0luY2x1ZGVUYWJDb250ZXh0Py5jaGVja2VkLFxuICAgICAgaGFuem9fcmFnX3VzZV96YXA6ICEhdGhpcy5lbC5yYWdVc2VaYXA/LmNoZWNrZWQsXG4gICAgICBoYW56b19jaGF0X3JhZ19lbmFibGVkOiAhIXRoaXMuZWwucmFnRW5hYmxlZD8uY2hlY2tlZCxcbiAgICAgIGhhbnpvX2NoYXRfdGFiX2NvbnRleHRfZW5hYmxlZDogISF0aGlzLmVsLnRhYkNvbnRleHRFbmFibGVkPy5jaGVja2VkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCdTZXR0aW5ncyBzYXZlZCcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdHlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgc3RhcnRNb25pdG9yaW5nKCkge1xuICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuY29ubmVjdFRvTUNQKCksIDEwMDAwKTtcbiAgICBjaHJvbWUudGFicy5vblVwZGF0ZWQuYWRkTGlzdGVuZXIoKCkgPT4gdGhpcy5yZWZyZXNoVGFiRmlsZXN5c3RlbSgpKTtcbiAgICBjaHJvbWUudGFicy5vblJlbW92ZWQuYWRkTGlzdGVuZXIoKCkgPT4gdGhpcy5yZWZyZXNoVGFiRmlsZXN5c3RlbSgpKTtcbiAgfVxuXG4gIGhhbmRsZU1lc3NhZ2UocmVxdWVzdCkge1xuICAgIHN3aXRjaCAocmVxdWVzdC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2FnZW50VXBkYXRlJzpcbiAgICAgICAgaWYgKHJlcXVlc3QuYWdlbnRJZCAmJiB0aGlzLmFnZW50cy5oYXMocmVxdWVzdC5hZ2VudElkKSkge1xuICAgICAgICAgIHRoaXMuYWdlbnRzLmdldChyZXF1ZXN0LmFnZW50SWQpLnN0YXR1cyA9IHJlcXVlc3Quc3RhdHVzO1xuICAgICAgICAgIHRoaXMudXBkYXRlQWdlbnRMaXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc2hvd05vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbC5jbGFzc05hbWUgPSAnbm90aWZpY2F0aW9uJztcbiAgICBlbC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiBlbC5yZW1vdmUoKSwgMzAwMCk7XG4gIH1cblxuICBzaG93RXJyb3IobWVzc2FnZSkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWwuY2xhc3NOYW1lID0gJ25vdGlmaWNhdGlvbiBlcnJvcic7XG4gICAgZWwudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gZWwucmVtb3ZlKCksIDUwMDApO1xuICB9XG59XG5cbi8vIEluaXRpYWxpemVcbmNvbnN0IGhhbnpvU2lkZWJhciA9IG5ldyBIYW56b1NpZGViYXIoKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUVBLE1BQU0sZUFBTixNQUFtQjtBQUFBLElBQ2pCLGNBQWM7QUFDWixXQUFLLFNBQVMsb0JBQUksSUFBSTtBQUN0QixXQUFLLGFBQWE7QUFDbEIsV0FBSyxXQUFXLENBQUM7QUFDakIsV0FBSyxZQUFZO0FBQ2pCLFdBQUssbUJBQW1CO0FBQ3hCLFdBQUssZ0JBQWdCO0FBQ3JCLFdBQUssYUFBYTtBQUVsQixXQUFLLGFBQWE7QUFDbEIsV0FBSyxvQkFBb0I7QUFDekIsV0FBSyxVQUFVO0FBQUEsSUFDakI7QUFB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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Hanzo AI",
4
- "version": "1.7.2",
4
+ "version": "1.7.6",
5
5
  "description": "AI-powered dev assistant — click-to-code navigation, source maps, WebGPU AI, and MCP integration for Claude Code.",
6
6
  "permissions": [
7
7
  "activeTab",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanzo/browser-extension",
3
- "version": "1.0.0",
3
+ "version": "1.7.5",
4
4
  "description": "Browser extension for click-to-code navigation with MCP integration",
5
5
  "main": "cli.js",
6
6
  "bin": {