<style id="elementor-post-36404">.elementor-36404 .elementor-element.elementor-element-061e8c0{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--flex-wrap-mobile:wrap;}</style>{"id":36404,"date":"2026-04-07T11:58:14","date_gmt":"2026-04-07T07:58:14","guid":{"rendered":"https:\/\/truhauz.com\/?page_id=36404"},"modified":"2026-04-07T17:57:46","modified_gmt":"2026-04-07T13:57:46","slug":"new-projects","status":"publish","type":"page","link":"https:\/\/truhauz.com\/ar\/new-projects\/","title":{"rendered":"\u0645\u0634\u0627\u0631\u064a\u0639 \u062c\u062f\u064a\u062f\u0629"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"36404\" class=\"elementor elementor-36404\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-061e8c0 e-flex e-con-boxed e-con e-parent\" data-id=\"061e8c0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cef770a elementor-widget elementor-widget-html\" data-id=\"cef770a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ============================================================\n     TruHauz \u00d7 Reelly.ai \u2014 Projects Grid\n     Paste into a WordPress Custom HTML block.\n     Requires: truhauz-reelly-plugin.php to be installed & active.\n     ============================================================ -->\n\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@600;700&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\n<style>\n.trly-wrap *, .trly-wrap *::before, .trly-wrap *::after { box-sizing: border-box; margin: 0; padding: 0; }\n.trly-wrap a { text-decoration: none; color: inherit; }\n\n\/* Full-width stretch *\/\n.trly-wrap {\n  width: 100vw;\n  position: relative;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n  max-width: none !important;\n  font-family: 'Inter', sans-serif;\n  background: #fff;\n  overflow-x: hidden;\n}\n\n\/* \u2500\u2500 Header \u2500\u2500 *\/\n.trly-header {\n  background: linear-gradient(135deg, #660033 0%, #3a0020 100%);\n  padding: 60px 24px 50px;\n  text-align: center;\n}\n.trly-badge {\n  display: inline-block;\n  background: rgba(255,255,255,0.15);\n  border: 1px solid rgba(255,255,255,0.35);\n  color: #fff;\n  font-size: 0.7rem;\n  font-weight: 700;\n  letter-spacing: 2px;\n  text-transform: uppercase;\n  padding: 5px 16px;\n  border-radius: 20px;\n  margin-bottom: 16px;\n}\n.trly-header h1 {\n  font-family: 'Playfair Display', serif;\n  font-size: clamp(1.8rem, 4.5vw, 2.8rem);\n  color: #fff;\n  margin-bottom: 12px;\n  line-height: 1.2;\n}\n.trly-header p {\n  color: rgba(255,255,255,0.75);\n  font-size: 1rem;\n  max-width: 600px;\n  margin: 0 auto;\n  line-height: 1.6;\n}\n\n\/* \u2500\u2500 Filters \u2500\u2500 *\/\n.trly-filters {\n  background: #f9f4f6;\n  padding: 24px 24px;\n  border-bottom: 1px solid #f0e0e8;\n}\n.trly-filters-inner {\n  max-width: 1200px;\n  margin: 0 auto;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12px;\n  justify-content: center;\n}\n.trly-filters input, .trly-filters select {\n  font-family: 'Inter', sans-serif;\n  font-size: 0.88rem;\n  padding: 11px 14px;\n  border: 1px solid #e0d0d8;\n  border-radius: 8px;\n  background: #fff;\n  color: #333;\n  min-width: 170px;\n  outline: none;\n  transition: border-color 0.2s;\n}\n.trly-filters input:focus, .trly-filters select:focus { border-color: #660033; }\n.trly-filters button {\n  font-family: 'Inter', sans-serif;\n  font-size: 0.88rem;\n  font-weight: 700;\n  padding: 11px 24px;\n  background: #660033;\n  color: #fff !important;\n  border: none;\n  border-radius: 8px;\n  cursor: pointer;\n  transition: background 0.2s;\n}\n.trly-filters button:hover { background: #3a0020; }\n.trly-filters button.trly-clear { background: #fff; color: #660033 !important; border: 1px solid #660033; }\n.trly-filters button.trly-clear:hover { background: #f0e0e8; }\n\n\/* \u2500\u2500 Grid \u2500\u2500 *\/\n.trly-grid-section { background: #fff; padding: 50px 24px; }\n.trly-grid-inner   { max-width: 1200px; margin: 0 auto; }\n.trly-meta-bar {\n  display: flex; justify-content: space-between; align-items: center;\n  margin-bottom: 24px; flex-wrap: wrap; gap: 10px;\n}\n.trly-count { color: #660033; font-weight: 600; font-size: 0.9rem; }\n.trly-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(310px, 1fr));\n  gap: 26px;\n}\n\n\/* \u2500\u2500 Card \u2500\u2500 *\/\n.trly-card {\n  background: #fff;\n  border-radius: 14px;\n  overflow: hidden;\n  border: 1px solid #f0e0e8;\n  box-shadow: 0 4px 18px rgba(102,0,51,0.06);\n  transition: transform 0.25s, box-shadow 0.25s;\n  display: flex; flex-direction: column;\n  text-decoration: none !important;\n  color: inherit !important;\n  cursor: pointer;\n}\n.trly-card:hover, .trly-card:focus, .trly-card:visited { color: inherit !important; text-decoration: none !important; }\n.trly-card:hover {\n  transform: translateY(-4px);\n  box-shadow: 0 12px 36px rgba(102,0,51,0.16);\n}\n.trly-card-img {\n  width: 100%; height: 220px;\n  background: linear-gradient(135deg, #660033 0%, #3a0020 100%);\n  background-size: cover; background-position: center;\n  position: relative;\n}\n.trly-card-tag {\n  position: absolute; top: 14px; left: 14px;\n  background: rgba(255,255,255,0.95);\n  color: #660033;\n  font-size: 0.7rem;\n  font-weight: 700;\n  padding: 5px 12px;\n  border-radius: 20px;\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n}\n.trly-card-body { padding: 22px; flex: 1; display: flex; flex-direction: column; }\n.trly-card-dev { color: #aa6688; font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 6px; }\n.trly-card h3 {\n  font-family: 'Playfair Display', serif;\n  font-size: 1.3rem;\n  color: #660033;\n  margin-bottom: 8px;\n  line-height: 1.25;\n}\n.trly-card-loc { color: #888; font-size: 0.85rem; margin-bottom: 14px; display: flex; align-items: center; gap: 6px; }\n.trly-card-specs {\n  display: flex; gap: 14px; flex-wrap: wrap;\n  padding: 12px 0;\n  border-top: 1px solid #f0e0e8;\n  border-bottom: 1px solid #f0e0e8;\n  margin-bottom: 14px;\n  font-size: 0.78rem;\n  color: #666;\n}\n.trly-card-specs span { display: flex; align-items: center; gap: 4px; }\n.trly-card-price { color: #660033; font-weight: 700; font-size: 1.1rem; margin-bottom: 16px; }\n.trly-card-price small { color: #888; font-weight: 500; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.5px; display: block; }\n.trly-card-btn {\n  margin-top: auto;\n  display: block;\n  text-align: center;\n  padding: 11px;\n  background: #660033;\n  color: #fff !important;\n  border-radius: 8px;\n  font-weight: 700;\n  font-size: 0.85rem;\n  transition: background 0.2s;\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n}\n.trly-card-btn:hover { background: #3a0020; }\n\n\/* \u2500\u2500 States \u2500\u2500 *\/\n.trly-loading, .trly-empty, .trly-error {\n  text-align: center;\n  padding: 70px 24px;\n  color: #999;\n  font-size: 0.95rem;\n}\n.trly-spinner {\n  width: 38px; height: 38px;\n  border: 3px solid #f0e0e8;\n  border-top-color: #660033;\n  border-radius: 50%;\n  margin: 0 auto 18px;\n  animation: trly-spin 0.9s linear infinite;\n}\n@keyframes trly-spin { to { transform: rotate(360deg); } }\n.trly-error { color: #b00; }\n\n\/* \u2500\u2500 Modal \u2500\u2500 *\/\n.trly-modal-overlay {\n  position: fixed; inset: 0;\n  background: rgba(20, 0, 10, 0.78);\n  z-index: 99999;\n  display: none !important;\n  align-items: flex-start;\n  justify-content: center;\n  padding: 40px 20px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n}\n.trly-modal-overlay.open { display: flex; }\n.trly-modal {\n  background: #fff;\n  border-radius: 16px;\n  max-width: 900px;\n  width: 100%;\n  position: relative;\n  box-shadow: 0 30px 80px rgba(0,0,0,0.45);\n  overflow: hidden;\n  animation: trly-pop 0.25s ease;\n}\n@keyframes trly-pop { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }\n.trly-modal-close {\n  position: absolute; top: 14px; right: 14px;\n  width: 38px; height: 38px;\n  border-radius: 50%;\n  background: rgba(255,255,255,0.95);\n  border: none;\n  font-size: 22px;\n  cursor: pointer;\n  z-index: 5;\n  color: #660033;\n  font-weight: 700;\n  box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n}\n.trly-modal-hero {\n  width: 100%; height: 320px;\n  background: linear-gradient(135deg,#660033,#3a0020);\n  background-size: cover; background-position: center;\n}\n.trly-modal-body { padding: 30px 36px 36px; }\n.trly-modal-dev { color: #aa6688; font-size: 0.78rem; font-weight: 600; text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 8px; }\n.trly-modal-body h2 {\n  font-family: 'Playfair Display', serif;\n  font-size: clamp(1.6rem, 3vw, 2.2rem);\n  color: #660033;\n  margin-bottom: 8px;\n  line-height: 1.2;\n}\n.trly-modal-loc { color: #888; font-size: 0.95rem; margin-bottom: 22px; }\n.trly-modal-stats {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n  gap: 14px;\n  padding: 18px;\n  background: #f9f4f6;\n  border-radius: 12px;\n  margin-bottom: 24px;\n}\n.trly-modal-stat { text-align: center; }\n.trly-modal-stat strong {\n  display: block;\n  font-family: 'Playfair Display', serif;\n  font-size: 1.25rem;\n  color: #660033;\n  margin-bottom: 2px;\n}\n.trly-modal-stat span { font-size: 0.7rem; color: #888; text-transform: uppercase; letter-spacing: 1px; }\n.trly-modal-section { margin-bottom: 22px; }\n.trly-modal-section h4 {\n  font-family: 'Playfair Display', serif;\n  color: #660033;\n  font-size: 1.05rem;\n  margin-bottom: 8px;\n  padding-bottom: 6px;\n  border-bottom: 1px solid #f0e0e8;\n}\n.trly-modal-section p, .trly-modal-section li { color: #555; font-size: 0.9rem; line-height: 1.65; }\n.trly-modal-section ul { list-style: none; }\n.trly-modal-section li { padding: 4px 0; }\n.trly-modal-section li::before { content: '\u2713'; color: #660033; font-weight: 700; margin-right: 8px; }\n.trly-modal-gallery {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n  gap: 8px;\n  margin-top: 12px;\n}\n.trly-modal-gallery img {\n  width: 100%; height: 100px;\n  object-fit: cover;\n  border-radius: 8px;\n  cursor: pointer;\n  transition: transform 0.2s;\n}\n.trly-modal-gallery img:hover { transform: scale(1.04); }\n.trly-modal-actions {\n  display: flex; gap: 12px; flex-wrap: wrap;\n  margin-top: 22px;\n}\n.trly-modal-actions a {\n  flex: 1; min-width: 180px;\n  padding: 14px;\n  text-align: center;\n  background: #660033;\n  color: #fff !important;\n  font-weight: 700;\n  font-size: 0.85rem;\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n  border-radius: 8px;\n  transition: background 0.2s;\n}\n.trly-modal-actions a.secondary { background: #fff; color: #660033 !important; border: 2px solid #660033; }\n.trly-modal-actions a:hover { background: #3a0020; }\n.trly-modal-actions a.secondary:hover { background: #f0e0e8; }\n.trly-modal-loading { padding: 80px 20px; text-align: center; color: #999; }\n\n\/* Card click affordance *\/\n.trly-card { cursor: pointer; }\n\n\/* \u2500\u2500 Pagination \u2500\u2500 *\/\n.trly-pagination {\n  text-align: center;\n  margin-top: 40px;\n}\n.trly-pagination button {\n  font-family: 'Inter', sans-serif;\n  padding: 13px 32px;\n  background: #660033;\n  color: #fff !important;\n  border: none;\n  border-radius: 8px;\n  font-weight: 700;\n  font-size: 0.88rem;\n  cursor: pointer;\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n  transition: background 0.2s;\n}\n.trly-pagination button:hover { background: #3a0020; }\n.trly-pagination button:disabled { background: #ccc; cursor: not-allowed; }\n\n\/* \u2500\u2500 CTA \u2500\u2500 *\/\n.trly-cta {\n  background: linear-gradient(135deg, #660033 0%, #3a0020 100%);\n  padding: 60px 24px;\n  text-align: center;\n}\n.trly-cta h3 {\n  font-family: 'Playfair Display', serif;\n  font-size: clamp(1.5rem, 3.2vw, 2.1rem);\n  color: #fff;\n  margin-bottom: 12px;\n}\n.trly-cta p {\n  color: rgba(255,255,255,0.75);\n  font-size: 0.95rem;\n  margin-bottom: 30px;\n  max-width: 480px;\n  margin-left: auto;\n  margin-right: auto;\n}\n.trly-btn {\n  display: inline-block;\n  padding: 14px 34px;\n  border: 2px solid rgba(255,255,255,0.7);\n  background: rgba(255,255,255,0.12);\n  color: #fff !important;\n  font-weight: 700;\n  font-size: 0.88rem;\n  border-radius: 8px;\n  margin: 6px;\n  transition: background 0.2s, border-color 0.2s;\n}\n.trly-btn:hover { background: rgba(255,255,255,0.22); border-color: #fff; }\n\n@media (max-width: 640px) {\n  .trly-header { padding: 44px 20px 40px; }\n  .trly-grid { grid-template-columns: 1fr; }\n  .trly-filters input, .trly-filters select { min-width: 100%; }\n}\n<\/style>\n\n<div class=\"trly-wrap\">\n\n  <!-- HEADER -->\n  <div class=\"trly-header\">\n    <div class=\"trly-badge\">Live Inventory \u00b7 Reelly.ai<\/div>\n    <h1>Off-Plan Projects in Dubai<\/h1>\n    <p>Browse the latest off-plan developments from Dubai's leading developers, updated in real time from our partner database.<\/p>\n  <\/div>\n\n  <!-- FILTERS -->\n  <div class=\"trly-filters\">\n    <div class=\"trly-filters-inner\">\n      <input id=\"trly-search\"    type=\"text\"   placeholder=\"Search project name\u2026\">\n      <input id=\"trly-developer\" type=\"text\"   placeholder=\"Developer (e.g. emaar)\">\n      <input id=\"trly-area\"      type=\"text\"   placeholder=\"Area (e.g. dubai hills)\">\n      <select id=\"trly-bedrooms\">\n        <option value=\"\">All Bedrooms<\/option>\n        <option value=\"1\">1 BR<\/option>\n        <option value=\"2\">2 BR<\/option>\n        <option value=\"3\">3 BR<\/option>\n        <option value=\"4\">4 BR<\/option>\n        <option value=\"5\">5+ BR<\/option>\n      <\/select>\n      <select id=\"trly-status\">\n        <option value=\"\">All Statuses<\/option>\n        <option value=\"Available\">Available<\/option>\n        <option value=\"Sold out\">Sold Out<\/option>\n        <option value=\"Coming soon\">Coming Soon<\/option>\n      <\/select>\n      <button id=\"trly-apply\">Search<\/button>\n      <button class=\"trly-clear\" id=\"trly-reset\">Reset<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- GRID -->\n  <div class=\"trly-grid-section\">\n    <div class=\"trly-grid-inner\">\n      <div class=\"trly-meta-bar\">\n        <div class=\"trly-count\" id=\"trly-count\">Loading projects\u2026<\/div>\n      <\/div>\n      <div id=\"trly-grid\" class=\"trly-grid\">\n        <div class=\"trly-loading\">\n          <div class=\"trly-spinner\"><\/div>\n          Loading projects from Reelly\u2026\n        <\/div>\n      <\/div>\n      <div class=\"trly-pagination\">\n        <button id=\"trly-more\" style=\"display:none;\">Load More<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- CTA -->\n  <div class=\"trly-cta\">\n    <h3>Found Something You Like?<\/h3>\n    <p>Get exclusive floor plans, payment plans, and unit availability from our team.<\/p>\n    <a class=\"trly-btn\" href=\"https:\/\/truhauz.com\/contact\/\">Talk to an Expert<\/a>\n    <a class=\"trly-btn\" href=\"https:\/\/truhauz.com\/search-results\/\">View All Listings<\/a>\n  <\/div>\n\n  <!-- MODAL -->\n  <div class=\"trly-modal-overlay\" id=\"trly-modal-overlay\">\n    <div class=\"trly-modal\" id=\"trly-modal\">\n      <button class=\"trly-modal-close\" id=\"trly-modal-close\" aria-label=\"Close\">\u00d7<\/button>\n      <div id=\"trly-modal-content\"><\/div>\n    <\/div>\n  <\/div>\n\n<\/div><!-- \/trly-wrap -->\n\n<script data-type="lazy" data-src="data:text/javascript;base64,XG4oZnVuY3Rpb24gKCkge1xuICBcLyogXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgIENPTkZJRyBcdTIwMTQgcG9pbnRzIGF0IHRoZSBXUCBwbHVnaW4ncyBSRVNUIGVuZHBvaW50LlxuICAgICBUaGUgQVBJIGtleSBzdGF5cyBTRUNSRVQgb24gdGhlIHNlcnZlciAoaW4gdGhlIHBsdWdpbikuXG4gICAgIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqXC9cbiAgdmFyIEVORFBPSU5UID0gJ1wvd3AtanNvblwvdHJ1aGF1elwvdjFcL3Byb2plY3RzJztcbiAgdmFyIFBFUl9QQUdFID0gMjA7ICAgICAgICAgIFwvXC8gUmVlbGx5J3MgYWN0dWFsIG1heCBwYWdlIHNpemUgKHNlcnZlci1lbmZvcmNlZClcbiAgdmFyIHBhZ2UgICAgID0gMTtcbiAgdmFyIGxvYWRlZCAgID0gMDsgICAgICAgICAgIFwvXC8gdG90YWwgY2FyZHMgbG9hZGVkIHNvIGZhclxuICB2YXIgdG90YWxBbGwgPSAwOyAgICAgICAgICAgXC9cLyB0b3RhbCByZXBvcnRlZCBieSBBUElcbiAgdmFyIGN1cnJlbnQgID0ge307XG4gIHZhciBwcm9qZWN0Q2FjaGUgPSB7fTsgICAgICBcL1wvIGlkIFx1MjE5MiBmdWxsIHByb2plY3Qgb2JqZWN0IGZyb20gbGlzdFxuXG4gIHZhciBncmlkICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmx5LWdyaWQnKTtcbiAgdmFyIGNvdW50RWwgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktY291bnQnKTtcbiAgdmFyIG1vcmVCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktbW9yZScpO1xuXG4gIGZ1bmN0aW9uIGZtdFByaWNlKHAsIGN1cnJlbmN5KSB7XG4gICAgaWYgKHAgPT0gbnVsbCB8fCBwID09PSAnJykgcmV0dXJuICdcdTIwMTQnO1xuICAgIHZhciBuID0gTnVtYmVyKHApO1xuICAgIGlmIChpc05hTihuKSkgcmV0dXJuIHA7XG4gICAgdmFyIGN1ciA9IGN1cnJlbmN5IHx8ICdBRUQnO1xuICAgIGlmIChuID49IDFlNikgcmV0dXJuIGN1ciArICcgJyArIChuIFwvIDFlNikudG9GaXhlZCgyKSArICdNJztcbiAgICBpZiAobiA+PSAxZTMpIHJldHVybiBjdXIgKyAnICcgKyAobiBcLyAxZTMpLnRvRml4ZWQoMCkgKyAnSyc7XG4gICAgcmV0dXJuIGN1ciArICcgJyArIG4udG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIFwvXC8gUHVsbCBhIHN0cmluZyBvdXQgb2YgYSB2YWx1ZSB0aGF0IG1pZ2h0IGJlIGEgc3RyaW5nIE9SIGFuIG9iamVjdCB3aXRoIC5uYW1lXG4gIGZ1bmN0aW9uIGFzVGV4dCh2KSB7XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHYgPT09ICdudW1iZXInKSByZXR1cm4gU3RyaW5nKHYpO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh2Lm5hbWUgfHwgdi50aXRsZSB8fCB2LmxhYmVsKSByZXR1cm4gdi5uYW1lIHx8IHYudGl0bGUgfHwgdi5sYWJlbDtcbiAgICAgIFwvXC8gUmVlbGx5J3MgbG9jYXRpb24gb2JqZWN0OiB7IGRpc3RyaWN0LCBzZWN0b3IsIHJlZ2lvbiwgY2l0eSB9XG4gICAgICB2YXIgYml0cyA9IFt2LmRpc3RyaWN0LCB2LnNlY3Rvciwgdi5jaXR5LCB2LnJlZ2lvbl0uZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4ICYmIHR5cGVvZiB4ID09PSAnc3RyaW5nJztcbiAgICAgIH0pO1xuICAgICAgXC9cLyBEZS1kdXAgYWRqYWNlbnQgaWRlbnRpY2FsIGVudHJpZXNcbiAgICAgIHZhciBzZWVuID0ge307XG4gICAgICBiaXRzID0gYml0cy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgaWYgKHNlZW5beF0pIHJldHVybiBmYWxzZTsgc2Vlblt4XSA9IDE7IHJldHVybiB0cnVlOyB9KTtcbiAgICAgIHJldHVybiBiaXRzLmpvaW4oJywgJyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIFwvXC8gXCJ1bmRlcl9jb25zdHJ1Y3Rpb25cIiBcdTIxOTIgXCJVbmRlciBDb25zdHJ1Y3Rpb25cIlxuICBmdW5jdGlvbiBuaWNlTGFiZWwocykge1xuICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZShcL19cL2csICcgJykucmVwbGFjZShcL1xcYlxcd1wvZywgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMudG9VcHBlckNhc2UoKTsgfSk7XG4gIH1cblxuICBcL1wvIFN0cmlwIFJlZWxseSdzIFwiIyMjIyNcIiBtYXJrZG93biBoZWFkaW5ncyArIGNvbGxhcHNlIGJsYW5rIGxpbmVzXG4gIGZ1bmN0aW9uIGNsZWFuTWFya2Rvd24ocykge1xuICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgIHJldHVybiBTdHJpbmcocylcbiAgICAgIC5yZXBsYWNlKFwvXiN7MSw2fVxccytcL2dtLCAnJykgICAgICAgICAgIFwvXC8gcmVtb3ZlIGxlYWRpbmcgaGFzaGVzXG4gICAgICAucmVwbGFjZShcL1xcbnszLH1cL2csICdcXG5cXG4nKSAgICAgICAgICAgIFwvXC8gY29sbGFwc2UgZXh0cmEgYmxhbmsgbGluZXNcbiAgICAgIC50cmltKCk7XG4gIH1cbiAgXC9cLyBDb252ZXJ0IG1hcmtkb3duIG92ZXJ2aWV3IGludG8gSFRNTCBzZWN0aW9ucyAoc3BsaXQgb24gaGVhZGluZ3MpXG4gIGZ1bmN0aW9uIG1kVG9IdG1sKHMpIHtcbiAgICBpZiAoIXMpIHJldHVybiAnJztcbiAgICB2YXIgYmxvY2tzID0gU3RyaW5nKHMpLnNwbGl0KFwvXFxuXFxzKlxcblwvKTtcbiAgICB2YXIgaHRtbCA9ICcnO1xuICAgIGJsb2Nrcy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7XG4gICAgICBiID0gYi50cmltKCk7XG4gICAgICBpZiAoIWIpIHJldHVybjtcbiAgICAgIHZhciBtID0gYi5tYXRjaChcL14jezEsNn1cXHMrKC4rKSRcLyk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBodG1sICs9ICc8aDUgc3R5bGU9XCJmb250LWZhbWlseTpcXCdQbGF5ZmFpciBkaXNwbGF5XFwnLHNlcmlmO2NvbG9yOiM2NjAwMzM7Zm9udC1zaXplOjFyZW07bWFyZ2luOjE0cHggMCA0cHg7XCI+JyArIGVzY2FwZUh0bWwobVsxXSkgKyAnPFwvaDU+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJzxwIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMHB4O1wiPicgKyBlc2NhcGVIdG1sKGIpICsgJzxcL3A+JztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBpY2sob2JqLCBrZXlzLCBmYWxsYmFjaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG9ialtrZXlzW2ldXSAhPSBudWxsICYmIG9ialtrZXlzW2ldXSAhPT0gJycpIHJldHVybiBvYmpba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBmYWxsYmFjayB8fCAnJztcbiAgfVxuXG4gIFwvXC8gUkVDVVJTSVZFIGltYWdlIHNjYW5uZXI6IHdhbGtzIHRoZSBlbnRpcmUgcHJvamVjdCBvYmplY3QgbG9va2luZyBmb3JcbiAgXC9cLyBBTlkgc3RyaW5nIHRoYXQgbG9va3MgbGlrZSBhbiBpbWFnZSBVUkwuIEZpZWxkLW5hbWUtYWdub3N0aWMuXG4gIHZhciBJTUdfUkUgPSBcL1xcLihqcGU/Z3xwbmd8d2VicHxnaWZ8YXZpZnxzdmcpKFxcP3wkKVwvaTtcbiAgZnVuY3Rpb24gaXNJbWFnZVVybChzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJyAmJiBcL15odHRwcz86XFxcL1xcXC9cLy50ZXN0KHMpICYmIElNR19SRS50ZXN0KHMpO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRBbGxJbWFnZXMob2JqLCBvdXQsIGRlcHRoKSB7XG4gICAgb3V0ID0gb3V0IHx8IFtdO1xuICAgIGRlcHRoID0gZGVwdGggfHwgMDtcbiAgICBpZiAoIW9iaiB8fCBkZXB0aCA+IDYgfHwgb3V0Lmxlbmd0aCA+IDMwKSByZXR1cm4gb3V0O1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGlzSW1hZ2VVcmwob2JqKSAmJiBvdXQuaW5kZXhPZihvYmopID09PSAtMSkgb3V0LnB1c2gob2JqKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSBmaW5kQWxsSW1hZ2VzKG9ialtpXSwgb3V0LCBkZXB0aCArIDEpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICBcL1wvIFByZWZlciBjb21tb24gVVJMIGtleXMgZmlyc3RcbiAgICAgIFsndXJsJywnc3JjJywnaHJlZicsJ2ltYWdlJywnaW1hZ2VfdXJsJywnY292ZXInLCdjb3Zlcl9pbWFnZScsJ2NvdmVyX2ltYWdlX3VybCcsJ3RodW1ibmFpbCcsJ3RodW1iJywncGhvdG8nLCdwaWN0dXJlJywnbWFpbl9pbWFnZSddXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgaWYgKG9ialtrXSAhPSBudWxsKSBmaW5kQWxsSW1hZ2VzKG9ialtrXSwgb3V0LCBkZXB0aCArIDEpO1xuICAgICAgICB9KTtcbiAgICAgIFwvXC8gVGhlbiB3YWxrIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgZm9yICh2YXIgayBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGspKSB7XG4gICAgICAgICAgZmluZEFsbEltYWdlcyhvYmpba10sIG91dCwgZGVwdGggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIGZ1bmN0aW9uIGV4dHJhY3RJbWFnZShwKSB7XG4gICAgdmFyIGltZ3MgPSBmaW5kQWxsSW1hZ2VzKHApO1xuICAgIHJldHVybiBpbWdzWzBdIHx8ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQ2FyZChwKSB7XG4gICAgdmFyIG5hbWUgICAgICA9IHBpY2socCwgWyduYW1lJywndGl0bGUnLCdwcm9qZWN0X25hbWUnXSwgJ1VudGl0bGVkIFByb2plY3QnKTtcbiAgICB2YXIgZGV2ZWxvcGVyID0gYXNUZXh0KHBpY2socCwgWydkZXZlbG9wZXInLCdkZXZlbG9wZXJfbmFtZScsJ2Rldl9uYW1lJ10sICcnKSk7XG4gICAgdmFyIGFyZWEgICAgICA9IGFzVGV4dChwaWNrKHAsIFsnbG9jYXRpb24nLCdhcmVhJywnYWRkcmVzcycsJ3JlZ2lvbiddLCAnJykpIHx8ICdEdWJhaSc7XG4gICAgdmFyIHByaWNlICAgICA9IHBpY2socCwgWydtaW5fcHJpY2UnLCdzdGFydGluZ19wcmljZScsJ3ByaWNlX2Zyb20nLCdwcmljZSddLCAnJyk7XG4gICAgdmFyIGN1cnJlbmN5ICA9IHBpY2socCwgWydwcmljZV9jdXJyZW5jeScsJ2N1cnJlbmN5J10sICdBRUQnKTtcbiAgICB2YXIgc2l6ZSAgICAgID0gcGljayhwLCBbJ21pbl9zaXplJywnbWluX2FyZWEnLCdhcmVhX2Zyb20nLCdzaXplJ10sICcnKTtcbiAgICB2YXIgYXJlYVVuaXQgID0gcGljayhwLCBbJ2FyZWFfdW5pdCddLCAnc3FmdCcpO1xuICAgIHZhciBoYW5kb3ZlciAgPSBwaWNrKHAsIFsnY29tcGxldGlvbl9kYXRlJywnaGFuZG92ZXInLCdjb21wbGV0aW9uX3llYXInLCdkZWxpdmVyeV9kYXRlJ10sICcnKTtcbiAgICB2YXIgc3RhdHVzICAgID0gcGljayhwLCBbJ3NhbGVfc3RhdHVzJywnc3RhdHVzJywnYXZhaWxhYmlsaXR5J10sICcnKTtcbiAgICB2YXIgdW5pdHMgICAgID0gcGljayhwLCBbJ3VuaXRzX2NvdW50JywndW5pdHNfaW5fc2FsZScsJ2F2YWlsYWJsZV91bml0cyddLCAnJyk7XG4gICAgdmFyIGltZyAgICAgICA9IGV4dHJhY3RJbWFnZShwKTtcbiAgICB2YXIgaWQgICAgICAgID0gcGljayhwLCBbJ2lkJywncHJvamVjdF9pZCcsJ3NsdWcnXSwgJycpO1xuXG4gICAgXC9cLyBGb3JtYXQgY29tcGxldGlvbl9kYXRlIFwiMjAyNy0xMi0zMVwiIFx1MjE5MiBcIlE0IDIwMjdcIlxuICAgIGlmIChoYW5kb3ZlciAmJiBcL15cXGR7NH0tXFxkezJ9XC8udGVzdChoYW5kb3ZlcikpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGhhbmRvdmVyLnNwbGl0KCctJyk7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbChwYXJzZUludChwYXJ0c1sxXSwgMTApIFwvIDMpO1xuICAgICAgaGFuZG92ZXIgPSAnUScgKyBxICsgJyAnICsgcGFydHNbMF07XG4gICAgfVxuXG4gICAgdmFyIGltZ1N0eWxlID0gaW1nID8gJ2JhY2tncm91bmQtaW1hZ2U6dXJsKFxcJycgKyBpbWcgKyAnXFwnKTtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7JyA6ICcnO1xuXG4gICAgdmFyIGRldGFpbFVybCA9ICdcL3Byb2plY3RcLz9pZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKTtcblxuICAgIHJldHVybiAnJyArXG4gICAgICAnPGEgY2xhc3M9XCJ0cmx5LWNhcmRcIiBocmVmPVwiJyArIGRldGFpbHVybCAnXCIgdGFyZ2V0ID1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCIgZGF0YS1pZD1cIicgZXNjYXBlYXR0cihpZCkgZGF0YS1uYW1lID1cIicgZXNjYXBlYXR0cihuYW1lKT4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJ0cmx5LWNhcmQtaW1nXCIgc3R5bGU9XCInICsgaW1nc3R5bGUgJ1wiPicgK1xuICAgICAgICAgIChzdGF0dXMgPyAnPHNwYW4gY2xhc3M9XCJ0cmx5LWNhcmQtdGFnXCI+JyArIGVzY2FwZUh0bWwoc3RhdHVzKSArICc8XC9zcGFuPicgOiAnJykgK1xuICAgICAgICAnPFwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cInRybHktY2FyZC1ib2R5XCI+JyArXG4gICAgICAgICAgKGRldmVsb3BlciA/ICc8ZGl2IGNsYXNzPVwidHJseS1jYXJkLWRldlwiPicgKyBlc2NhcGVIdG1sKGRldmVsb3BlcikgKyAnPFwvZGl2PicgOiAnJykgK1xuICAgICAgICAgICc8aDM+JyArIGVzY2FwZUh0bWwobmFtZSkgKyAnPFwvaDM+JyArXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0cmx5LWNhcmQtbG9jXCI+XHVkODNkXHVkY2NkICcgKyBlc2NhcGVIdG1sKGFyZWEpICsgJzxcL2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInRybHktY2FyZC1zcGVjc1wiPicgK1xuICAgICAgICAgICAgKHVuaXRzID8gJzxzcGFuPlx1ZDgzY1x1ZGZlMiAnICsgZXNjYXBlSHRtbCh1bml0cykgKyAnIHVuaXRzPFwvc3Bhbj4nIDogJycpICtcbiAgICAgICAgICAgIChzaXplID8gJzxzcGFuPlx1ZDgzZFx1ZGNkMCAnICsgZXNjYXBlSHRtbChNYXRoLnJvdW5kKHBhcnNlRmxvYXQoc2l6ZSkpLnRvTG9jYWxlU3RyaW5nKCkpICsgJyAnICsgZXNjYXBlSHRtbChhcmVhVW5pdCkgKyAnPFwvc3Bhbj4nIDogJycpICtcbiAgICAgICAgICAgIChoYW5kb3ZlciA/ICc8c3Bhbj5cdWQ4M2RcdWRkMTEgJyArIGVzY2FwZUh0bWwoaGFuZG92ZXIpICsgJzxcL3NwYW4+JyA6ICcnKSArXG4gICAgICAgICAgJzxcL2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInRybHktY2FyZC1wcmljZVwiPicgK1xuICAgICAgICAgICAgJzxzbWFsbD5TdGFydGluZyBmcm9tPFwvc21hbGw+JyArXG4gICAgICAgICAgICBmbXRQcmljZShwcmljZSwgY3VycmVuY3kpICtcbiAgICAgICAgICAnPFwvZGl2PicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRybHktY2FyZC1idG5cIj5WaWV3IFByb2plY3QgRGV0YWlscyBcdTIxOTI8XC9zcGFuPicgK1xuICAgICAgICAnPFwvZGl2PicgK1xuICAgICAgJzxcL2E+JztcbiAgfVxuXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykge1xuICAgIGlmIChzID09IG51bGwpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoXC9bJjw+XCInXVwvZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnXCInOiAnJnF1b3Q7JywgXCInXCI6ICcmIzM5OycgfVtjXTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBlc2NhcGVBdHRyKHMpIHsgcmV0dXJuIGVzY2FwZUh0bWwocyk7IH1cblxuICBmdW5jdGlvbiBsb2FkKHJlc2V0KSB7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICBwYWdlID0gMTsgbG9hZGVkID0gMDsgdG90YWxBbGwgPSAwO1xuICAgICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInRybHktbG9hZGluZ1wiPjxkaXYgY2xhc3M9XCJ0cmx5LXNwaW5uZXJcIj48XC9kaXY+TG9hZGluZyBwcm9qZWN0cyBmcm9tIFJlZWxseVx1MjAyNjxcL2Rpdj4nO1xuICAgIH1cbiAgICBtb3JlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBtb3JlQnRuLnRleHRDb250ZW50ID0gJ0xvYWRpbmdcdTIwMjYnO1xuXG4gICAgXC9cLyBTZW5kIEJPVEggcGFnZS1zdHlsZSBhbmQgb2Zmc2V0LXN0eWxlIHBhcmFtcyBzbyB0aGUgcGx1Z2luXG4gICAgXC9cLyBmb3J3YXJkcyB3aGF0ZXZlciBSZWVsbHkgYWNjZXB0cy5cbiAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwge1xuICAgICAgcGFnZTogcGFnZSxcbiAgICAgIHBlcl9wYWdlOiBQRVJfUEFHRSxcbiAgICAgIGxpbWl0OiBQRVJfUEFHRSxcbiAgICAgIG9mZnNldDogKHBhZ2UgLSAxKSAqIFBFUl9QQUdFXG4gICAgfSk7XG4gICAgdmFyIHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7XG5cbiAgICBmZXRjaChFTkRQT0lOVCArICc/JyArIHFzKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIuanNvbigpOyB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5lcnJvcikgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuXG4gICAgICAgIHZhciBpdGVtcyA9IGRhdGEucmVzdWx0cyB8fCBkYXRhLnByb2plY3RzIHx8IGRhdGEuZGF0YSB8fCBkYXRhLml0ZW1zIHx8IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtdKTtcbiAgICAgICAgdmFyIHRvdGFsID0gZGF0YS5jb3VudCB8fCBkYXRhLnRvdGFsIHx8IGRhdGEudG90YWxfY291bnQgfHwgMDtcblxuICAgICAgICBpZiAocmVzZXQgJiYgaXRlbXMubGVuZ3RoICYmIHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tUcnVIYXV6IFx1MDBkNyBSZWVsbHldIFNhbXBsZSBwcm9qZWN0IGtleXM6JywgT2JqZWN0LmtleXMoaXRlbXNbMF0pKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1RydUhhdXogXHUwMGQ3IFJlZWxseV0gU2FtcGxlIHByb2plY3Q6JywgaXRlbXNbMF0pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbVHJ1SGF1eiBcdTAwZDcgUmVlbGx5XSBBUEkgY291bnQgZmllbGQ6JywgdG90YWwsICdcdTIwMTQgbmV4dDonLCBkYXRhLm5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc2V0KSBncmlkLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB2YXIgbG9hZGluZ05vZGUgPSBncmlkLnF1ZXJ5U2VsZWN0b3IoJy50cmx5LWxvYWRpbmcnKTtcbiAgICAgICAgaWYgKGxvYWRpbmdOb2RlKSBsb2FkaW5nTm9kZS5yZW1vdmUoKTtcblxuICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCAmJiByZXNldCkge1xuICAgICAgICAgIGdyaWQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJ0cmx5LWVtcHR5XCI+Tm8gcHJvamVjdHMgbWF0Y2hlZCB5b3VyIGZpbHRlcnMuIFRyeSByZXNldHRpbmcgdGhlIHNlYXJjaC48XC9kaXY+JztcbiAgICAgICAgICBjb3VudEVsLnRleHRDb250ZW50ID0gJzAgcHJvamVjdHMnO1xuICAgICAgICAgIG1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgdmFyIHBpZCA9IHBpY2socCwgWydpZCcsJ3Byb2plY3RfaWQnLCdzbHVnJ10sICcnKTtcbiAgICAgICAgICBpZiAocGlkKSBwcm9qZWN0Q2FjaGVbcGlkXSA9IHA7XG4gICAgICAgICAgZ3JpZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHJlbmRlckNhcmQocCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsb2FkZWQgICArPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIHRvdGFsQWxsICA9IHRvdGFsIHx8IHRvdGFsQWxsO1xuXG4gICAgICAgIGlmICh0b3RhbEFsbCkge1xuICAgICAgICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSAnU2hvd2luZyAnICsgbG9hZGVkICsgJyBvZiAnICsgdG90YWxBbGwgKyAnIHByb2plY3RzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudEVsLnRleHRDb250ZW50ID0gbG9hZGVkICsgJyBwcm9qZWN0cyBsb2FkZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgXC9cLyBTaG93IFwiTG9hZCBNb3JlXCIgaWYgdGhlcmUncyBhIGBuZXh0YCBVUkwgT1Igd2UgZ290IGEgZnVsbCBwYWdlXG4gICAgICAgIFwvXC8gT1Igd2Uga25vdyB0aGVyZSdzIHN0aWxsIG1vcmUgZnJvbSB0b3RhbCBjb3VudC5cbiAgICAgICAgdmFyIGhhc01vcmUgPSAhIWRhdGEubmV4dCB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0b3RhbEFsbCAmJiBsb2FkZWQgPCB0b3RhbEFsbCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5sZW5ndGggPj0gUEVSX1BBR0U7XG5cbiAgICAgICAgaWYgKGhhc01vcmUpIHtcbiAgICAgICAgICBtb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICAgICAgICBtb3JlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgbW9yZUJ0bi50ZXh0Q29udGVudCA9ICdMb2FkIE1vcmUgUHJvamVjdHMnO1xuICAgICAgICAgIHBhZ2UrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBncmlkLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwidHJseS1lcnJvclwiPlx1MjZhMCBGYWlsZWQgdG8gbG9hZCBwcm9qZWN0czogJyArIGVyci5tZXNzYWdlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxzbWFsbD5NYWtlIHN1cmUgdGhlIFRydUhhdXogUmVlbGx5IHBsdWdpbiBpcyBpbnN0YWxsZWQgJmFtcDsgYWN0aXZhdGVkLjxcL3NtYWxsPjxcL2Rpdj4nO1xuICAgICAgICBjb3VudEVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIG1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH0pO1xuICB9XG5cbiAgXC8qIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCBNT0RBTCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgKlwvXG4gIHZhciBtb2RhbE92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJseS1tb2RhbC1vdmVybGF5Jyk7XG4gIHZhciBtb2RhbENvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJseS1tb2RhbC1jb250ZW50Jyk7XG5cbiAgZnVuY3Rpb24gb3Blbk1vZGFsKGlkLCBmYWxsYmFja05hbWUpIHtcbiAgICBtb2RhbE92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnb3BlbicpO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIFwvXC8gU1RFUCAxIFx1MjAxNCByZW5kZXIgSU1NRURJQVRFTFkgZnJvbSBjYWNoZWQgbGlzdCBkYXRhIHNvIHRoZSB1c2VyIGFsd2F5c1xuICAgIFwvXC8gc2VlcyB0aGUgcGhvdG8gKyBiYXNpYyBpbmZvLCBldmVuIGlmIHRoZSBkZXRhaWwgZW5kcG9pbnQgZmFpbHMuXG4gICAgdmFyIGNhY2hlZCA9IGlkID8gcHJvamVjdENhY2hlW2lkXSA6IG51bGw7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmVuZGVyTW9kYWwoY2FjaGVkLCBmYWxsYmFja05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RhbENvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLWxvYWRpbmdcIj48ZGl2IGNsYXNzPVwidHJseS1zcGlubmVyXCI+PFwvZGl2PkxvYWRpbmcgcHJvamVjdCBkZXRhaWxzXHUyMDI2PFwvZGl2Pic7XG4gICAgfVxuXG4gICAgaWYgKCFpZCkgcmV0dXJuO1xuXG4gICAgXC9cLyBTVEVQIDIgXHUyMDE0IHRyeSB0byBlbnJpY2ggd2l0aCB0aGUgZGV0YWlsIGVuZHBvaW50IGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgIGZldGNoKEVORFBPSU5UICsgJ1wvJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpXG4gICAgICAudGhlbihmdW5jdGlvbiAocikgeyByZXR1cm4gci5qc29uKCk7IH0pXG4gICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS5lcnJvcikgcmV0dXJuOyBcL1wvIGtlZXAgY2FjaGVkIHZlcnNpb25cbiAgICAgICAgdmFyIHAgPSBkYXRhLnJlc3VsdCB8fCBkYXRhLmRhdGEgfHwgZGF0YS5wcm9qZWN0IHx8IGRhdGE7XG4gICAgICAgIGlmICghcCB8fCB0eXBlb2YgcCAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLmxvZygnW1RydUhhdXogXHUwMGQ3IFJlZWxseV0gUHJvamVjdCBkZXRhaWw6JywgcCk7XG4gICAgICAgIFwvXC8gTWVyZ2U6IGRldGFpbCBmaWVsZHMgb3ZlcnJpZGUgY2FjaGVkLCBidXQga2VlcCBjYWNoZWQgZmFsbGJhY2tzXG4gICAgICAgIHZhciBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBjYWNoZWQgfHwge30sIHApO1xuICAgICAgICByZW5kZXJNb2RhbChtZXJnZWQsIGZhbGxiYWNrTmFtZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsgXC8qIHNpbGVudGx5IGtlZXAgdGhlIGNhY2hlZCByZW5kZXIgKlwvIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBtb2RhbE92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgfVxuXG4gIFwvXC8gQ2xvc2UgaGFuZGxlcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktbW9kYWwtY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICBtb2RhbE92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWxPdmVybGF5KSBjbG9zZU1vZGFsKCk7XG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZU1vZGFsKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RJbWFnZXMocCkgeyByZXR1cm4gZmluZEFsbEltYWdlcyhwKTsgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlck1vZGFsKHAsIGZhbGxiYWNrTmFtZSkge1xuICAgIHZhciBuYW1lICAgICAgPSBwLm5hbWUgfHwgZmFsbGJhY2tOYW1lIHx8ICdQcm9qZWN0JztcbiAgICB2YXIgZGV2ZWxvcGVyID0gYXNUZXh0KHAuZGV2ZWxvcGVyKTtcbiAgICB2YXIgYXJlYSAgICAgID0gYXNUZXh0KHAubG9jYXRpb24pIHx8ICdEdWJhaSc7XG4gICAgdmFyIHByaWNlICAgICA9IHAubWluX3ByaWNlO1xuICAgIHZhciBtYXhQcmljZSAgPSBwLm1heF9wcmljZTtcbiAgICB2YXIgY3VycmVuY3kgID0gcC5wcmljZV9jdXJyZW5jeSB8fCAnQUVEJztcbiAgICB2YXIgc2l6ZSAgICAgID0gcC5taW5fc2l6ZTtcbiAgICB2YXIgbWF4U2l6ZSAgID0gcC5tYXhfc2l6ZTtcbiAgICB2YXIgYXJlYVVuaXQgID0gcC5hcmVhX3VuaXQgfHwgJ3NxZnQnO1xuICAgIHZhciBjb21wRGF0ZSAgPSBwLmNvbXBsZXRpb25fZGF0ZSB8fCBwLmNvbXBsZXRpb25fZGF0ZXRpbWUgfHwgJyc7XG4gICAgdmFyIHN0YXJ0RGF0ZSA9IHAuY29uc3RydWN0aW9uX3N0YXJ0X2RhdGUgfHwgJyc7XG4gICAgdmFyIGVuZERhdGUgICA9IHAuY29uc3RydWN0aW9uX2VuZF9kYXRlIHx8ICcnO1xuICAgIHZhciBzYWxlU3RhdCAgPSBuaWNlTGFiZWwocC5zYWxlX3N0YXR1cyk7XG4gICAgdmFyIGNvblN0YXQgICA9IG5pY2VMYWJlbChwLmNvbnN0cnVjdGlvbl9zdGF0dXMpO1xuICAgIHZhciB1bml0c0NudCAgPSBwLnVuaXRzX2NvdW50O1xuICAgIHZhciBibGRncyAgICAgPSBwLmJ1aWxkaW5nX2NvdW50O1xuICAgIHZhciBkZXNjICAgICAgPSBwLm92ZXJ2aWV3IHx8IHAuZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgdmFyIHNob3J0RGVzYyA9IHAuc2hvcnRfZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgdmFyIGJyYW5kICAgICA9IHAuYnJhbmQgfHwgJyc7XG4gICAgdmFyIG1hbmFnaW5nICA9IHAubWFuYWdpbmdfY29tcGFueSB8fCAnJztcbiAgICB2YXIgZnVybmlzaGluZz0gbmljZUxhYmVsKHAuZnVybmlzaGluZyk7XG4gICAgdmFyIHNlcnZpY2VGZWU9IHAuc2VydmljZV9jaGFyZ2UgfHwgJyc7XG4gICAgdmFyIGVzY3JvdyAgICA9IHAuZXNjcm93X251bWJlciB8fCAnJztcbiAgICB2YXIgcmVhZGluZXNzID0gcC5yZWFkaW5lc3NfcHJvZ3Jlc3M7XG4gICAgdmFyIGJyb2NodXJlICA9IHAubWFya2V0aW5nX2Jyb2NodXJlIHx8ICcnO1xuXG4gICAgXC9cLyBCdWlsZCBnYWxsZXJ5IGZyb20gQUxMIGltYWdlIHNvdXJjZXMgaW4gdGhlIGRldGFpbCByZXNwb25zZVxuICAgIHZhciBpbWFnZXMgPSBbXTtcbiAgICBmdW5jdGlvbiBhZGRJbWcodikge1xuICAgICAgdmFyIHUgPSAnJztcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHUgPSB2O1xuICAgICAgZWxzZSBpZiAodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHUgPSB2LnVybCB8fCB2LnNyYyB8fCAnJztcbiAgICAgIGlmICh1ICYmIGltYWdlcy5pbmRleE9mKHUpID09PSAtMSkgaW1hZ2VzLnB1c2godSk7XG4gICAgfVxuICAgIGFkZEltZyhwLmNvdmVyX2ltYWdlKTtcbiAgICBhZGRJbWcocC5nZW5lcmFsX3BsYW4pO1xuICAgIChwLmxvYmJ5ICAgICAgICB8fCBbXSkuZm9yRWFjaChhZGRJbWcpO1xuICAgIChwLmludGVyaW9yICAgICB8fCBbXSkuZm9yRWFjaChhZGRJbWcpO1xuICAgIChwLmFyY2hpdGVjdHVyZSB8fCBbXSkuZm9yRWFjaChhZGRJbWcpO1xuICAgIChwLmJ1aWxkaW5ncyAgICB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYikgeyBhZGRJbWcoYiAmJiBiLmNvdmVyX2ltYWdlKTsgfSk7XG4gICAgXC9cLyBGYWxsYmFjazogcmVjdXJzaXZlIHNjYW4gaWYgd2Ugc3RpbGwgaGF2ZSBub3RoaW5nXG4gICAgaWYgKCFpbWFnZXMubGVuZ3RoKSBpbWFnZXMgPSBjb2xsZWN0SW1hZ2VzKHApO1xuICAgIHZhciBoZXJvID0gaW1hZ2VzWzBdIHx8ICcnO1xuXG4gICAgXC9cLyBEYXRlIGhlbHBlcnNcbiAgICBmdW5jdGlvbiBmbXREYXRlKGQpIHtcbiAgICAgIGlmICghZCkgcmV0dXJuICcnO1xuICAgICAgaWYgKFwvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9XC8udGVzdChkKSkge1xuICAgICAgICB2YXIgcGFydHMgPSBkLnN1YnN0cmluZygwLCAxMCkuc3BsaXQoJy0nKTtcbiAgICAgICAgdmFyIG1vbnRocyA9IFsnSmFuJywnRmViJywnTWFyJywnQXByJywnTWF5JywnSnVuJywnSnVsJywnQXVnJywnU2VwJywnT2N0JywnTm92JywnRGVjJ107XG4gICAgICAgIHJldHVybiBwYXJ0c1syXSArICcgJyArIG1vbnRoc1twYXJzZUludChwYXJ0c1sxXSwgMTApIC0gMV0gKyAnICcgKyBwYXJ0c1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbXRRdWFydGVyKGQpIHtcbiAgICAgIGlmICghZCkgcmV0dXJuICcnO1xuICAgICAgZCA9IFN0cmluZyhkKTtcbiAgICAgIFwvXC8gQWxyZWFkeSBmb3JtYXR0ZWQgYXMgXCJRMiAyMDI2XCIgXHUyMTkyIGRvbid0IG1hbmdsZSBpdFxuICAgICAgaWYgKFwvXlFbMS00XVxcc1wvLnRlc3QoZCkpIHJldHVybiBkO1xuICAgICAgaWYgKFwvXlxcZHs0fS1cXGR7Mn1cLy50ZXN0KGQpKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGQuc3BsaXQoJy0nKTtcbiAgICAgICAgdmFyIHEgPSBNYXRoLmNlaWwocGFyc2VJbnQocGFydHNbMV0sIDEwKSBcLyAzKTtcbiAgICAgICAgcmV0dXJuICdRJyArIHEgKyAnICcgKyBwYXJ0c1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkO1xuICAgIH1cblxuICAgIHZhciBwcmljZUxpbmUgPSBmbXRQcmljZShwcmljZSwgY3VycmVuY3kpO1xuICAgIGlmIChtYXhQcmljZSAmJiBtYXhQcmljZSAhPT0gcHJpY2UpIHByaWNlTGluZSArPSAnIFx1MjAxMyAnICsgZm10UHJpY2UobWF4UHJpY2UsIGN1cnJlbmN5KTtcbiAgICB2YXIgc2l6ZUxpbmUgPSAnJztcbiAgICBpZiAoc2l6ZSkge1xuICAgICAgdmFyIHNNaW4gPSBNYXRoLnJvdW5kKE51bWJlcihzaXplKSk7XG4gICAgICB2YXIgc01heCA9IG1heFNpemUgPyBNYXRoLnJvdW5kKE51bWJlcihtYXhTaXplKSkgOiAwO1xuICAgICAgc2l6ZUxpbmUgPSBzTWluICsgKHNNYXggJiYgc01heCAhPT0gc01pbiA/ICdcdTIwMTMnICsgc01heCA6ICcnKSArICcgJyArIGFyZWFVbml0O1xuICAgIH1cbiAgICB2YXIgZGF0ZVJhbmdlID0gJyc7XG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBjb21wRGF0ZSkgZGF0ZVJhbmdlID0gZm10RGF0ZShzdGFydERhdGUpICsgJyBcdTIwMTMgJyArIGZtdFF1YXJ0ZXIoY29tcERhdGUpO1xuICAgIGVsc2UgaWYgKGNvbXBEYXRlKSAgZGF0ZVJhbmdlID0gZm10UXVhcnRlcihjb21wRGF0ZSk7XG4gICAgZWxzZSBpZiAoc3RhcnREYXRlKSBkYXRlUmFuZ2UgPSBmbXREYXRlKHN0YXJ0RGF0ZSk7XG5cbiAgICB2YXIgaHRtbCA9ICcnO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLWhlcm9cIiBzdHlsZT1cIicgKyAoaGVybyA/IFwiYmFja2dyb3VuZC1pbWFnZTp1cmwoJ1wiIGhlcm8gXCInKTtiYWNrZ3JvdW5kLXNpemU6Y292ZXI7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7XCIgOiAnJykgJ1wiPic7XG4gICAgaWYgKHNhbGVTdGF0KSAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJ0cmx5LWNhcmQtdGFnXCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjBweDtsZWZ0OjMwcHg7XCI+JyArIGVzY2FwZUh0bWwoc2FsZVN0YXQpICsgJzxcL3NwYW4+JztcbiAgICBpZiAoZGF0ZVJhbmdlKSBodG1sICs9ICc8c3BhbiBjbGFzcz1cInRybHktY2FyZC10YWdcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO3RvcDo2MHB4O2xlZnQ6JyArIChzYWxlc3RhdCA/ICcxNjBweCcgOiAnMzBweCcpICc7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO1wiPicgKyBlc2NhcGVIdG1sKGRhdGVSYW5nZSkgKyAnPFwvc3Bhbj4nO1xuICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMSkgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJ0cmx5LWNhcmQtdGFnXCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MThweDtsZWZ0OjMwcHg7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNik7Y29sb3I6I2ZmZjtcIj5cdWQ4M2RcdWRjZjcgJyArIGltYWdlcy5sZW5ndGggKyAnIHBob3RvczxcL3NwYW4+JztcbiAgICBodG1sICs9ICc8XC9kaXY+JztcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1ib2R5XCI+JztcbiAgICBpZiAoZGV2ZWxvcGVyKSBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1kZXZcIj4nICsgZXNjYXBlSHRtbChkZXZlbG9wZXIpICsgKGJyYW5kICYmIGJyYW5kICE9PSBkZXZlbG9wZXIgPyAnIFx1MDBiNyAnICsgZXNjYXBlSHRtbChicmFuZCkgOiAnJykgKyAnPFwvZGl2Pic7XG4gICAgaHRtbCArPSAnPGgyPicgKyBlc2NhcGVIdG1sKG5hbWUpICsgJzxcL2gyPic7XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtbG9jXCI+XHVkODNkXHVkY2NkICcgKyBlc2NhcGVIdG1sKGFyZWEpICsgJzxcL2Rpdj4nO1xuICAgIGlmIChzaG9ydERlc2MpIGh0bWwgKz0gJzxwIHN0eWxlPVwiY29sb3I6Izc3Nztmb250LXN0eWxlOml0YWxpYzttYXJnaW46OHB4IDAgMThweDtcIj4nICsgZXNjYXBlSHRtbChzaG9ydERlc2MpICsgJzxcL3A+JztcblxuICAgIFwvXC8gU3RhdHMgZ3JpZFxuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLXN0YXRzXCI+JztcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zdGF0XCI+PHN0cm9uZz4nICsgcHJpY2VMaW5lICsgJzxcL3N0cm9uZz48c3Bhbj5QcmljZSBGcm9tPFwvc3Bhbj48XC9kaXY+JztcbiAgICBpZiAoc2l6ZUxpbmUpIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLXN0YXRcIj48c3Ryb25nPicgKyBlc2NhcGVIdG1sKHNpemVMaW5lKSArICc8XC9zdHJvbmc+PHNwYW4+VW5pdCBTaXplPFwvc3Bhbj48XC9kaXY+JztcbiAgICBpZiAodW5pdHNDbnQpIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLXN0YXRcIj48c3Ryb25nPicgKyBlc2NhcGVIdG1sKFN0cmluZyh1bml0c0NudCkpICsgJzxcL3N0cm9uZz48c3Bhbj5Vbml0czxcL3NwYW4+PFwvZGl2Pic7XG4gICAgaWYgKGJsZGdzKSAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zdGF0XCI+PHN0cm9uZz4nICsgZXNjYXBlSHRtbChTdHJpbmcoYmxkZ3MpKSArICc8XC9zdHJvbmc+PHNwYW4+QnVpbGRpbmdzPFwvc3Bhbj48XC9kaXY+JztcbiAgICBpZiAoY29tcERhdGUpIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLXN0YXRcIj48c3Ryb25nPicgKyBlc2NhcGVIdG1sKGZtdFF1YXJ0ZXIoY29tcERhdGUpKSArICc8XC9zdHJvbmc+PHNwYW4+SGFuZG92ZXI8XC9zcGFuPjxcL2Rpdj4nO1xuICAgIGlmIChjb25TdGF0KSAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtc3RhdFwiPjxzdHJvbmc+JyArIGVzY2FwZUh0bWwoY29uU3RhdCkgKyAnPFwvc3Ryb25nPjxzcGFuPkNvbnN0cnVjdGlvbjxcL3NwYW4+PFwvZGl2Pic7XG4gICAgaWYgKHJlYWRpbmVzcyAhPSBudWxsKSBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zdGF0XCI+PHN0cm9uZz4nICsgTWF0aC5yb3VuZChyZWFkaW5lc3MpICsgJyU8XC9zdHJvbmc+PHNwYW4+UmVhZGluZXNzPFwvc3Bhbj48XC9kaXY+JztcbiAgICBpZiAoZnVybmlzaGluZykgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtc3RhdFwiPjxzdHJvbmc+JyArIGVzY2FwZUh0bWwoZnVybmlzaGluZykgKyAnPFwvc3Ryb25nPjxzcGFuPkZ1cm5pc2hpbmc8XC9zcGFuPjxcL2Rpdj4nO1xuICAgIGlmIChzZXJ2aWNlRmVlKSBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zdGF0XCI+PHN0cm9uZz4nICsgZXNjYXBlSHRtbChzZXJ2aWNlRmVlKSArICc8XC9zdHJvbmc+PHNwYW4+U2VydmljZSBDaGFyZ2U8XC9zcGFuPjxcL2Rpdj4nO1xuICAgIGh0bWwgKz0gJzxcL2Rpdj4nO1xuXG4gICAgXC9cLyBPdmVydmlldyAobWFya2Rvd24pXG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLXNlY3Rpb25cIj48aDQ+T3ZlcnZpZXc8XC9oND48ZGl2PicgKyBtZFRvSHRtbChkZXNjKSArICc8XC9kaXY+PFwvZGl2Pic7XG4gICAgfVxuXG4gICAgXC9cLyBUeXBpY2FsIHVuaXRzIChiZWRyb29tcyBcLyBwcmljZXMgXC8gc2l6ZXMpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocC50eXBpY2FsX3VuaXRzKSAmJiBwLnR5cGljYWxfdW5pdHMubGVuZ3RoKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zZWN0aW9uXCI+PGg0PkF2YWlsYWJsZSBVbml0czxcL2g0Pic7XG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maWxsLG1pbm1heCgyMDBweCwxZnIpKTtnYXA6MTJweDtcIj4nO1xuICAgICAgcC50eXBpY2FsX3VuaXRzLmZvckVhY2goZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgdmFyIHBmID0gZm10UHJpY2UodS5mcm9tX3ByaWNlX2FlZCwgJ0FFRCcpO1xuICAgICAgICB2YXIgcHQgPSB1LnRvX3ByaWNlX2FlZCAmJiB1LnRvX3ByaWNlX2FlZCAhPT0gdS5mcm9tX3ByaWNlX2FlZCA/ICcgXHUyMDEzICcgKyBmbXRQcmljZSh1LnRvX3ByaWNlX2FlZCwgJ0FFRCcpIDogJyc7XG4gICAgICAgIHZhciBzZiA9IHUuZnJvbV9zaXplX3NxZnQgfHwgJyc7XG4gICAgICAgIHZhciBzdCA9IHUudG9fc2l6ZV9zcWZ0ICYmIHUudG9fc2l6ZV9zcWZ0ICE9PSB1LmZyb21fc2l6ZV9zcWZ0ID8gJ1x1MjAxMycgKyBNYXRoLnJvdW5kKHUudG9fc2l6ZV9zcWZ0KSA6ICcnO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzoxNHB4O2JhY2tncm91bmQ6I2Y5ZjRmNjtib3JkZXItcmFkaXVzOjEwcHg7XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM2NjAwMzM7Zm9udC1zaXplOjEuMXJlbTtkaXNwbGF5OmJsb2NrO1wiPicgKyAodS5iZWRyb29tcyB8fCAnPycpICsgJyBCUjxcL3N0cm9uZz4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07Y29sb3I6IzU1NTttYXJnaW4tdG9wOjRweDtcIj4nICsgcGYgKyBwdCArICc8XC9kaXY+JztcbiAgICAgICAgaWYgKHNmKSBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVyZW07Y29sb3I6Izg4ODttYXJnaW4tdG9wOjJweDtcIj4nICsgTWF0aC5yb3VuZChzZikgKyBzdCArICcgc3FmdDxcL2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8XC9kaXY+JztcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPFwvZGl2PjxcL2Rpdj4nO1xuICAgIH1cblxuICAgIFwvXC8gUGF5bWVudCBwbGFuc1xuICAgIGlmIChBcnJheS5pc0FycmF5KHAucGF5bWVudF9wbGFucykgJiYgcC5wYXltZW50X3BsYW5zLmxlbmd0aCkge1xuICAgICAgcC5wYXltZW50X3BsYW5zLmZvckVhY2goZnVuY3Rpb24gKHBsYW4pIHtcbiAgICAgICAgaWYgKCFwbGFuLnN0ZXBzIHx8ICFwbGFuLnN0ZXBzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zZWN0aW9uXCI+PGg0PicgKyBlc2NhcGVIdG1sKHBsYW4ubmFtZSB8fCAnUGF5bWVudCBQbGFuJykgKyAnPFwvaDQ+JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDtcIj4nO1xuICAgICAgICBwbGFuLnN0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZsZXg6MTttaW4td2lkdGg6MTQwcHg7cGFkZGluZzoxNHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEzNWRlZywjNjYwMDMzLCMzYTAwMjApO2NvbG9yOiNmZmY7Ym9yZGVyLXJhZGl1czoxMHB4O3RleHQtYWxpZ246Y2VudGVyO1wiPic7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxLjZyZW07Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtZmFtaWx5OlxcJ1BsYXlmYWlyIGRpc3BsYXlcXCcsc2VyaWY7XCI+JyArIChzdC5wZXJjZW50YWdlIHx8IDApICsgJyU8XC9kaXY+JztcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuNzVyZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuNXB4O29wYWNpdHk6MC44NTttYXJnaW4tdG9wOjRweDtcIj4nICsgZXNjYXBlSHRtbChzdC5uYW1lIHx8ICcnKSArICc8XC9kaXY+JztcbiAgICAgICAgICBodG1sICs9ICc8XC9kaXY+JztcbiAgICAgICAgfSk7XG4gICAgICAgIGh0bWwgKz0gJzxcL2Rpdj48XC9kaXY+JztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIFwvXC8gQW1lbml0aWVzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocC5wcm9qZWN0X2FtZW5pdGllcykgJiYgcC5wcm9qZWN0X2FtZW5pdGllcy5sZW5ndGgpIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLXNlY3Rpb25cIj48aDQ+QW1lbml0aWVzPFwvaDQ+PHVsPic7XG4gICAgICBwLnByb2plY3RfYW1lbml0aWVzLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGxhYmVsID0gKGEgJiYgYS5hbWVuaXR5ICYmIGEuYW1lbml0eS5uYW1lKSA/IGEuYW1lbml0eS5uYW1lIDogJyc7XG4gICAgICAgIGlmIChsYWJlbCkgaHRtbCArPSAnPGxpPicgKyBlc2NhcGVIdG1sKGxhYmVsKSArICc8XC9saT4nO1xuICAgICAgfSk7XG4gICAgICBodG1sICs9ICc8XC91bD48XC9kaXY+JztcbiAgICB9XG5cbiAgICBcL1wvIE1hcCBwb2ludHMgXC8gbmVhcmJ5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocC5wcm9qZWN0X21hcF9wb2ludHMpICYmIHAucHJvamVjdF9tYXBfcG9pbnRzLmxlbmd0aCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtc2VjdGlvblwiPjxoND5OZWFyYnkgUGxhY2VzPFwvaDQ+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpbGwsbWlubWF4KDIyMHB4LDFmcikpO2dhcDo4cHg7XCI+JztcbiAgICAgIHAucHJvamVjdF9tYXBfcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKG1wKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTRweDtiYWNrZ3JvdW5kOiNmOWY0ZjY7Ym9yZGVyLXJhZGl1czo4cHg7Zm9udC1zaXplOjAuODVyZW07XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHN0cm9uZyBzdHlsZT1cImNvbG9yOiM2NjAwMzM7XCI+JyArIGVzY2FwZUh0bWwobXAubWFwX3BvaW50X25hbWUgfHwgJycpICsgJzxcL3N0cm9uZz4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiY29sb3I6Izg4ODtmb250LXNpemU6MC43NXJlbTttYXJnaW4tdG9wOjJweDtcIj4nO1xuICAgICAgICBpZiAobXAuZGlzdGFuY2UgIT0gbnVsbCkgaHRtbCArPSBtcC5kaXN0YW5jZSArICcga20nO1xuICAgICAgICBpZiAobXAuZGlzdGFuY2UgIT0gbnVsbCAmJiBtcC50aW1lICE9IG51bGwpIGh0bWwgKz0gJyBcdTAwYjcgJztcbiAgICAgICAgaWYgKG1wLnRpbWUgIT0gbnVsbCkgaHRtbCArPSBtcC50aW1lICsgJyBtaW4nO1xuICAgICAgICBodG1sICs9ICc8XC9kaXY+PFwvZGl2Pic7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzxcL2Rpdj48XC9kaXY+JztcbiAgICB9XG5cbiAgICBcL1wvIFBhcmtpbmdcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwLnBhcmtpbmdzKSAmJiBwLnBhcmtpbmdzLmxlbmd0aCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtc2VjdGlvblwiPjxoND5QYXJraW5nPFwvaDQ+PHVsPic7XG4gICAgICBwLnBhcmtpbmdzLmZvckVhY2goZnVuY3Rpb24gKHBrKSB7XG4gICAgICAgIGh0bWwgKz0gJzxsaT4nICsgKHBrLnVuaXRfYmVkcm9vbXMgfHwgJz8nKSArICcgQlIgJyArIG5pY2VMYWJlbChway51bml0X3R5cGUgfHwgJycpICsgJzogJyArIChway5wYXJraW5nX3NwYWNlIHx8IDApICsgJyBwYXJraW5nIHNwYWNlczxcL2xpPic7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzxcL3VsPjxcL2Rpdj4nO1xuICAgIH1cblxuICAgIGlmIChtYW5hZ2luZyAmJiBtYW5hZ2luZyAhPT0gZGV2ZWxvcGVyKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zZWN0aW9uXCI+PGg0Pk1hbmFnaW5nIENvbXBhbnk8XC9oND48cD4nICsgZXNjYXBlSHRtbChtYW5hZ2luZykgKyAnPFwvcD48XC9kaXY+JztcbiAgICB9XG4gICAgaWYgKGVzY3Jvdykge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtc2VjdGlvblwiPjxoND5Fc2Nyb3cgTnVtYmVyPFwvaDQ+PHA+JyArIGVzY2FwZUh0bWwoZXNjcm93KSArICc8XC9wPjxcL2Rpdj4nO1xuICAgIH1cblxuICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMSkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRybHktbW9kYWwtc2VjdGlvblwiPjxoND5HYWxsZXJ5PFwvaDQ+PGRpdiBjbGFzcz1cInRybHktbW9kYWwtZ2FsbGVyeVwiPic7XG4gICAgICBpbWFnZXMuc2xpY2UoMSwgMTYpLmZvckVhY2goZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgaHRtbCArPSAnPGltZyBkZWNvZGluZz1cImFzeW5jXCIgc3JjPVwiJyArIGVzY2FwZWF0dHIodSkgJ1wiIGFsdCA9XCJcIiBsb2FkaW5nPVwibGF6eVwiPic7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzxcL2Rpdj48XC9kaXY+JztcbiAgICB9XG5cbiAgICBcL1wvIEdlbmVyaWMgZmllbGQgZHVtcCBcdTIwMTQgc2hvd3MgQUxMIG5vbi1lbXB0eSBwcmltaXRpdmUgZmllbGRzIHdlIGhhdmVuJ3QgYWxyZWFkeSB1c2VkXG4gICAgdmFyIHVzZWRLZXlzID0ge1xuICAgICAgbmFtZToxLHRpdGxlOjEscHJvamVjdF9uYW1lOjEsZGV2ZWxvcGVyOjEsZGV2ZWxvcGVyX25hbWU6MSxkZXZfbmFtZToxLFxuICAgICAgYXJlYToxLGxvY2F0aW9uOjEsYWRkcmVzczoxLHJlZ2lvbjoxLFxuICAgICAgbWluX3ByaWNlOjEsc3RhcnRpbmdfcHJpY2U6MSxwcmljZV9mcm9tOjEscHJpY2U6MSxtYXhfcHJpY2U6MSxwcmljZV90bzoxLHByaWNlX2N1cnJlbmN5OjEsY3VycmVuY3k6MSxcbiAgICAgIGJlZHJvb21zOjEsYmVkcm9vbV9yYW5nZToxLGJlZHM6MSxcbiAgICAgIG1pbl9zaXplOjEsbWF4X3NpemU6MSxtaW5fYXJlYToxLGFyZWFfZnJvbToxLGFyZWFfdG86MSxzaXplOjEsYXJlYV91bml0OjEsXG4gICAgICBoYW5kb3ZlcjoxLGNvbXBsZXRpb25fZGF0ZToxLGNvbXBsZXRpb25fZGF0ZXRpbWU6MSxjb21wbGV0aW9uX3llYXI6MSxkZWxpdmVyeV9kYXRlOjEscGxhbm5lZF9jb21wbGV0aW9uX2RhdGU6MSxcbiAgICAgIGNvbnN0cnVjdGlvbl9zdGFydF9kYXRlOjEsY29uc3RydWN0aW9uX2VuZF9kYXRlOjEsc2FsZXNfc3RhcnRfZGF0ZToxLHNhbGVzX3N0YXJ0ZWQ6MSxzYWxlX3N0YXJ0OjEsbGF1bmNoX2RhdGU6MSxcbiAgICAgIGNvbnN0cnVjdGlvbl9zdGF0dXM6MSxzYWxlX3N0YXR1czoxLHNhbGVzX3N0YXR1czoxLHN0YXR1czoxLGF2YWlsYWJpbGl0eToxLGlzX3B1Ymxpc2hlZDoxLFxuICAgICAgdW5pdHNfaW5fc2FsZToxLGF2YWlsYWJsZV91bml0czoxLHVuaXRzX2F2YWlsYWJsZToxLHVuaXRzX2NvdW50OjEsYnVpbGRpbmdfY291bnQ6MSxcbiAgICAgIHByb2plY3RfYW1lbml0aWVzOjEscHJvamVjdF9tYXBfcG9pbnRzOjEscGFya2luZ3M6MSx0eXBpY2FsX3VuaXRzOjEscGF5bWVudF9wbGFuczoxLFxuICAgICAgYnVpbGRpbmdzOjEsZmxvb3JfcGxhbnM6MSxtYXJrZXRpbmdfYnJvY2h1cmU6MSxnZW5lcmFsX3BsYW46MSxsb2JieToxLGludGVyaW9yOjEsYXJjaGl0ZWN0dXJlOjEsXG4gICAgICBzZXJ2aWNlX2NoYXJnZToxLGZ1cm5pc2hpbmc6MSxlc2Nyb3dfbnVtYmVyOjEscmVhZGluZXNzX3Byb2dyZXNzOjEscG9zdF9oYW5kb3ZlcjoxLFxuICAgICAgZGVwb3NpdF9kZXNjcmlwdGlvbjoxLFxuICAgICAgZGVzY3JpcHRpb246MSxvdmVydmlldzoxLHNob3J0X2Rlc2NyaXB0aW9uOjEsdGFnbGluZToxLGFib3V0OjEscHJvamVjdF9kZXNjcmlwdGlvbjoxLGZ1bGxfZGVzY3JpcHRpb246MSxcbiAgICAgIGJyYW5kOjEsbWFuYWdpbmdfY29tcGFueToxLFxuICAgICAgcGF5bWVudF9wbGFuOjEscGF5bWVudF9wbGFuczoxLHBheW1lbnQ6MSxcbiAgICAgIHVwZGF0ZWRfYXQ6MSxsYXN0X3VwZGF0ZToxLGxhc3RfdXBkYXRlZDoxLG1vZGlmaWVkX2F0OjEsXG4gICAgICBhbWVuaXRpZXM6MSxmYWNpbGl0aWVzOjEsZmVhdHVyZXM6MSxcbiAgICAgIGltYWdlczoxLGdhbGxlcnk6MSxtZWRpYToxLHBob3RvczoxLHBpY3R1cmVzOjEsdmlkZW9fcmV2aWV3czoxLFxuICAgICAgY292ZXJfaW1hZ2U6MSxjb3ZlcjoxLG1haW5faW1hZ2U6MSx0aHVtYm5haWw6MSxpbWFnZToxLHBob3RvOjEscGljdHVyZToxLHByZXZpZXdfaW1hZ2U6MSxcbiAgICAgIGlkOjEscHJvamVjdF9pZDoxLHNsdWc6MSxpc19wYXJ0bmVyX3Byb2plY3Q6MSxcbiAgICAgIHVybDoxLHNyYzoxLGhyZWY6MSxcbiAgICAgIGxhdGl0dWRlOjEsbG9uZ2l0dWRlOjEsbGF0OjEsbG5nOjEsY29vcmRpbmF0ZXM6MVxuICAgIH07XG4gICAgdmFyIGV4dHJhID0gW107XG4gICAgZm9yICh2YXIgayBpbiBwKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLCBrKSkgY29udGludWU7XG4gICAgICBpZiAodXNlZEtleXNba10pIGNvbnRpbnVlO1xuICAgICAgdmFyIHYgPSBwW2tdO1xuICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJyB8fCB2ID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIFwvXC8gU2hvdyB0aGUgLm5hbWUgb3IgLnRpdGxlIG9mIG5lc3RlZCBvYmplY3RzLCBvciBza2lwXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgaWYgKCF2Lmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgdmFyIHNpbXBsZSA9IHYuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHggPT09ICdudW1iZXInOyB9KTtcbiAgICAgICAgICBpZiAoc2ltcGxlLmxlbmd0aCkgZXh0cmEucHVzaChbaywgc2ltcGxlLmpvaW4oJywgJyldKTtcbiAgICAgICAgfSBlbHNlIGlmICh2Lm5hbWUgfHwgdi50aXRsZSB8fCB2LmxhYmVsKSB7XG4gICAgICAgICAgZXh0cmEucHVzaChbaywgdi5uYW1lIHx8IHYudGl0bGUgfHwgdi5sYWJlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZXh0cmEucHVzaChbaywgdl0pO1xuICAgIH1cbiAgICBpZiAoZXh0cmEubGVuZ3RoKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidHJseS1tb2RhbC1zZWN0aW9uXCI+PGg0PkFkZGl0aW9uYWwgRGV0YWlsczxcL2g0Pjx1bCBzdHlsZT1cImxpc3Qtc3R5bGU6bm9uZTtcIj4nO1xuICAgICAgZXh0cmEuZm9yRWFjaChmdW5jdGlvbiAoa3YpIHtcbiAgICAgICAgdmFyIGxhYmVsID0gU3RyaW5nKGt2WzBdKS5yZXBsYWNlKFwvX1wvZywgJyAnKS5yZXBsYWNlKFwvXFxiXFx3XC9nLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KTtcbiAgICAgICAgaHRtbCArPSAnPGxpIHN0eWxlPVwicGFkZGluZzo0cHggMDtcIj48c3Ryb25nIHN0eWxlPVwiY29sb3I6IzY2MDAzMztcIj4nICsgZXNjYXBlSHRtbChsYWJlbCkgKyAnOjxcL3N0cm9uZz4gJyArIGVzY2FwZUh0bWwoU3RyaW5nKGt2WzFdKSkgKyAnPFwvbGk+JztcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPFwvdWw+PFwvZGl2Pic7XG4gICAgfVxuXG4gICAgXC9cLyBBY3Rpb24gYnV0dG9uc1xuICAgIHZhciBwaWQgPSBwLmlkIHx8ICcnO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0cmx5LW1vZGFsLWFjdGlvbnNcIj4nO1xuICAgIGh0bWwgKz0gJzxhIGhyZWY9XCJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2NvbnRhY3RcLz9wcm9qZWN0PScgKyBlbmNvZGV1cmljb21wb25lbnQobmFtZSkgJ1wiPkVucXVpcmUgQWJvdXQgVGhpcyBQcm9qZWN0PFwvYT4nO1xuICAgIGlmIChicm9jaHVyZSkge1xuICAgICAgaHRtbCArPSAnPGEgY2xhc3M9XCJzZWNvbmRhcnlcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiIGhyZWY9XCInICsgZXNjYXBlYXR0cihicm9jaHVyZSkgJ1wiPlx1ZDgzZFx1ZGNjNCBNYXJrZXRpbmcgQnJvY2h1cmU8XC9hPic7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHAuZmxvb3JfcGxhbnMpICYmIHAuZmxvb3JfcGxhbnMubGVuZ3RoICYmIHAuZmxvb3JfcGxhbnNbMF0uZmlsZSkge1xuICAgICAgaHRtbCArPSAnPGEgY2xhc3M9XCJzZWNvbmRhcnlcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiIGhyZWY9XCInICsgZXNjYXBlYXR0cihwLmZsb29yX3BsYW5zWzBdLmZpbGUpICdcIj5cdWQ4M2RcdWRjZDAgRmxvb3IgUGxhbnM8XC9hPic7XG4gICAgfVxuICAgIGh0bWwgKz0gJzxcL2Rpdj4nO1xuXG4gICAgaHRtbCArPSAnPFwvZGl2Pic7IFwvXC8gXC9tb2RhbC1ib2R5XG4gICAgbW9kYWxDb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICBcL1wvIENhcmRzIGFyZSBub3cgcmVhbCA8YT4gbGlua3MgdG8gXC9wcm9qZWN0XC8/aWQ9TiAob3BlbiBpbiBuZXcgdGFiKSxcbiAgXC9cLyBzbyBubyBjbGljayBkZWxlZ2F0aW9uIGlzIG5lZWRlZC4gVGhlIG1vZGFsIG1hcmt1cCBiZWxvdyBpcyBsZWZ0XG4gIFwvXC8gaGlkZGVuIGFzIGEgZmFsbGJhY2sgaW4gY2FzZSBicm93c2VycyBibG9jayB0aGUgcG9wdXAuXG5cbiAgZnVuY3Rpb24gcmVhZEZpbHRlcnMoKSB7XG4gICAgY3VycmVudCA9IHt9O1xuICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktc2VhcmNoJykudmFsdWUudHJpbSgpO1xuICAgIHZhciBkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktZGV2ZWxvcGVyJykudmFsdWUudHJpbSgpO1xuICAgIHZhciBhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktYXJlYScpLnZhbHVlLnRyaW0oKTtcbiAgICB2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmx5LWJlZHJvb21zJykudmFsdWU7XG4gICAgdmFyIHN0PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJseS1zdGF0dXMnKS52YWx1ZTtcbiAgICBpZiAocykgIGN1cnJlbnQuc2VhcmNoICAgICAgPSBzO1xuICAgIGlmIChkKSAgY3VycmVudC5kZXZlbG9wZXIgICA9IGQ7XG4gICAgaWYgKGEpICBjdXJyZW50LmFyZWEgICAgICAgID0gYTtcbiAgICBpZiAoYikgIGN1cnJlbnQuYmVkcm9vbXMgICAgPSBiO1xuICAgIGlmIChzdCkgY3VycmVudC5zYWxlX3N0YXR1cyA9IHN0O1xuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktYXBwbHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICByZWFkRmlsdGVycygpOyBsb2FkKHRydWUpO1xuICB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktcmVzZXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJseS1zZWFyY2gnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmx5LWRldmVsb3BlcicpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktYXJlYScpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RybHktYmVkcm9vbXMnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cmx5LXN0YXR1cycpLnZhbHVlID0gJyc7XG4gICAgY3VycmVudCA9IHt9OyBsb2FkKHRydWUpO1xuICB9KTtcbiAgbW9yZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgbG9hZChmYWxzZSk7IH0pO1xuXG4gIFwvXC8gaW5pdGlhbCBsb2FkXG4gIGxvYWQodHJ1ZSk7XG59KSgpO1xuPFwvc2NyaXB0Plx0XHRcdFx0PFwvZGl2PlxuXHRcdFx0XHQ8XC9kaXY+XG5cdFx0XHRcdFx0PFwvZGl2PlxuXHRcdFx0XHQ8XC9kaXY+XG5cdFx0XHRcdDxcL2Rpdj5cblx0XHQiLCJwcm90ZWN0ZWQiOmZhbHNlfSwiZXhjZXJwdCI6eyJyZW5kZXJlZCI6IjxwPkxpdmUgSW52ZW50b3J5IFx1MDBiNyBSZWVsbHkuYWkgT2ZmLVBsYW4gUHJvamVjdHMgaW4gRHViYWkgQnJvd3NlIHRoZSBsYXRlc3Qgb2ZmLXBsYW4gZGV2ZWxvcG1lbnRzIGZyb20gRHViYWkmIzgyMTc7cyBsZWFkaW5nIGRldmVsb3BlcnMsIHVwZGF0ZWQgaW4gcmVhbCB0aW1lIGZyb20gb3VyIHBhcnRuZXIgZGF0YWJhc2UuIEFsbCBCZWRyb29tczEgQlIyIEJSMyBCUjQgQlI1KyBCUiBBbGwgU3RhdHVzZXNBdmFpbGFibGVTb2xkIE91dENvbWluZyBTb29uIFNlYXJjaCBSZXNldCBMb2FkaW5nIHByb2plY3RzXHUyMDI2IExvYWRpbmcgcHJvamVjdHMgZnJvbSBSZWVsbHlcdTIwMjYgTG9hZCBNb3JlIEZvdW5kIFNvbWV0aGluZyBZb3UgTGlrZT8gR2V0IGV4Y2x1c2l2ZSBmbG9vciBwbGFucywgcGF5bWVudCBbJmhlbGxpcDtdPFwvcD5cbiIsInByb3RlY3RlZCI6ZmFsc2V9LCJhdXRob3IiOjEyLCJmZWF0dXJlZF9tZWRpYSI6MzYyOTcsInBhcmVudCI6MCwibWVudV9vcmRlciI6MCwiY29tbWVudF9zdGF0dXMiOiJjbG9zZWQiLCJwaW5nX3N0YXR1cyI6ImNsb3NlZCIsInRlbXBsYXRlIjoiZWxlbWVudG9yX2hlYWRlcl9mb290ZXIiLCJtZXRhIjp7Il9qb2luY2hhdCI6W10sImZvb3Rub3RlcyI6IiJ9LCJjbGFzc19saXN0IjpbInBvc3QtMzY0MDQiLCJwYWdlIiwidHlwZS1wYWdlIiwic3RhdHVzLXB1Ymxpc2giLCJoYXMtcG9zdC10aHVtYm5haWwiLCJoZW50cnkiXSwieW9hc3RfaGVhZCI6IjwhLS0gVGhpcyBzaXRlIGlzIG9wdGltaXplZCB3aXRoIHRoZSBZb2FzdCBTRU8gUHJlbWl1bSBwbHVnaW4gdjI4LjYgKFlvYXN0IFNFTyB2MjguNikgLSBodHRwczpcL1wveW9hc3QuY29tXC9wcm9kdWN0XC95b2FzdC1zZW8tcHJlbWl1bS13b3JkcHJlc3NcLyAtLT5cbjx0aXRsZT5OZXcgUHJvamVjdHMgfCBEdWJhaSBSZWFsIEVzdGF0ZSAtIEFwYXJ0bWVudHMsIFZpbGxhcywgVG93bmhvdXNlcywgUGVudGhvdXNlcyB8IFRydUhhdXo8XC90aXRsZT5cbjxtZXRhIG5hbWU9XCJkZXNjcmlwdGlvblwiIGNvbnRlbnQ9XCJMaXZlIGludmVudG9yeSBcdTAwYjcgcmVlbGx5LmFpIG9mZi1wbGFuIHByb2plY3RzIGluIGR1YmFpIGJyb3dzZSB0aGUgbGF0ZXN0IGRldmVsb3BtZW50cyBmcm9tIGR1YmFpJiMwMzk7cyBsZWFkaW5nIGRldmVsb3BlcnMsIHVwZGF0ZWQgcmVhbCB0aW1lIGZyb21cIiBcPlxuPG1ldGEgbmFtZT1cInJvYm90c1wiIGNvbnRlbnQ9XCJpbmRleCwgZm9sbG93LCBtYXgtc25pcHBldDotMSwgbWF4LWltYWdlLXByZXZpZXc6bGFyZ2UsIG1heC12aWRlby1wcmV2aWV3Oi0xXCIgXD5cbjxsaW5rIHJlbD1cImNhbm9uaWNhbFwiIGhyZWY9XCJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2FyXC9uZXctcHJvamVjdHNcL1wiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOmxvY2FsZVwiIGNvbnRlbnQ9XCJhcl9BUlwiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOnR5cGVcIiBjb250ZW50PVwiYXJ0aWNsZVwiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk5ldyBwcm9qZWN0c1wiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOmRlc2NyaXB0aW9uXCIgY29udGVudD1cIkxpdmUgaW52ZW50b3J5IFx1MDBiNyByZWVsbHkuYWkgb2ZmLXBsYW4gcHJvamVjdHMgaW4gZHViYWkgYnJvd3NlIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnRzIGZyb20gZHViYWkmIzAzOTtzIGxlYWRpbmcgZGV2ZWxvcGVycywgdXBkYXRlZCByZWFsIHRpbWUgZnJvbVwiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOnVybFwiIGNvbnRlbnQ9XCJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2FyXC9uZXctcHJvamVjdHNcL1wiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOnNpdGVfbmFtZVwiIGNvbnRlbnQ9XCJEdWJhaSByZWFsIGVzdGF0ZSAtIGFwYXJ0bWVudHMsIHZpbGxhcywgdG93bmhvdXNlcywgcGVudGhvdXNlcyB8IHRydWhhdXpcIiBcPlxuPG1ldGEgcHJvcGVydHk9XCJhcnRpY2xlOnB1Ymxpc2hlclwiIGNvbnRlbnQ9XCJodHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvcHJvZmlsZS5waHA/aWQ9NjE1NzUzOTMwODQ5MjBcIiBcPlxuPG1ldGEgcHJvcGVydHk9XCJhcnRpY2xlOm1vZGlmaWVkX3RpbWVcIiBjb250ZW50PVwiMjAyNi0wNC0wN1QxMzo1Nzo0NiswMDowMFwiIFw+XG48bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOlwvXC90cnVoYXV6LmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDRcL0RVQkFJXzIwMjZfSEVST19JTUFHRV9VUkwuanBnXCIgXD5cblx0PG1ldGEgcHJvcGVydHk9XCJvZzppbWFnZTp3aWR0aFwiIGNvbnRlbnQ9XCIxMjAwXCIgXD5cblx0PG1ldGEgcHJvcGVydHk9XCJvZzppbWFnZTpoZWlnaHRcIiBjb250ZW50PVwiNzcyXCIgXD5cblx0PG1ldGEgcHJvcGVydHk9XCJvZzppbWFnZTp0eXBlXCIgY29udGVudD1cImltYWdlXC9qcGVnXCIgXD5cbjxtZXRhIG5hbWU9XCJ0d2l0dGVyOmNhcmRcIiBjb250ZW50PVwic3VtbWFyeV9sYXJnZV9pbWFnZVwiIFw+XG48bWV0YSBuYW1lPVwidHdpdHRlcjpsYWJlbDFcIiBjb250ZW50PVwiXHUwNjQ4XHUwNjQyXHUwNjJhIFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYzMVx1MDYyN1x1MDYyMVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NGZcdTA2NDJcdTA2MmZcdTA2NTFcdTA2MzFcIiBcPlxuXHQ8bWV0YSBuYW1lPVwidHdpdHRlcjpkYXRhMVwiIGNvbnRlbnQ9XCJcdTA2MmZcdTA2NDJcdTA2NGFcdTA2NDJcdTA2MjkgXHUwNjQ4XHUwNjI3XHUwNjJkXHUwNjJmXHUwNjI5XCIgXD5cbjxzY3JpcHQgdHlwZT1cImFwcGxpY2F0aW9uXC9sZCtqc29uXCIgY2xhc3M9XCJ5b2FzdC1zY2hlbWEtZ3JhcGhcIj57XCJAY29udGV4dFwiOlwiaHR0cHM6XFxcL1xcXC9zY2hlbWEub3JnXCIsXCJAZ3JhcGhcIjpbe1wiQHR5cGVcIjpcIldlYlBhZ2VcIixcIkBpZFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC9uZXctcHJvamVjdHNcXFwvXCIsXCJ1cmxcIjpcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvbmV3LXByb2plY3RzXFxcL1wiLFwibmFtZVwiOlwiTmV3IFByb2plY3RzIHwgRHViYWkgUmVhbCBFc3RhdGUgLSBBcGFydG1lbnRzLCBWaWxsYXMsIFRvd25ob3VzZXMsIFBlbnRob3VzZXMgfCBUcnVIYXV6XCIsXCJpc1BhcnRPZlwiOntcIkBpZFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC8jd2Vic2l0ZVwifSxcInByaW1hcnlJbWFnZU9mUGFnZVwiOntcIkBpZFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC9uZXctcHJvamVjdHNcXFwvI3ByaW1hcnlpbWFnZVwifSxcImltYWdlXCI6e1wiQGlkXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcL25ldy1wcm9qZWN0c1xcXC8jcHJpbWFyeWltYWdlXCJ9LFwidGh1bWJuYWlsVXJsXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcL3dwLWNvbnRlbnRcXFwvdXBsb2Fkc1xcXC8yMDI2XFxcLzA0XFxcL0RVQkFJXzIwMjZfSEVST19JTUFHRV9VUkwuanBnXCIsXCJkYXRlUHVibGlzaGVkXCI6XCIyMDI2LTA0LTA3VDA3OjU4OjE0KzAwOjAwXCIsXCJkYXRlTW9kaWZpZWRcIjpcIjIwMjYtMDQtMDdUMTM6NTc6NDYrMDA6MDBcIixcImRlc2NyaXB0aW9uXCI6XCJMaXZlIEludmVudG9yeSBcdTAwYjcgUmVlbGx5LmFpIE9mZi1QbGFuIFByb2plY3RzIGluIER1YmFpIEJyb3dzZSB0aGUgbGF0ZXN0IG9mZi1wbGFuIGRldmVsb3BtZW50cyBmcm9tIER1YmFpJ3MgbGVhZGluZyBkZXZlbG9wZXJzLCB1cGRhdGVkIGluIHJlYWwgdGltZSBmcm9tXCIsXCJicmVhZGNydW1iXCI6e1wiQGlkXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcL25ldy1wcm9qZWN0c1xcXC8jYnJlYWRjcnVtYlwifSxcImluTGFuZ3VhZ2VcIjpcImFyXCIsXCJwb3RlbnRpYWxBY3Rpb25cIjpbe1wiQHR5cGVcIjpcIlJlYWRBY3Rpb25cIixcInRhcmdldFwiOltcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvbmV3LXByb2plY3RzXFxcL1wiXX1dfSx7XCJAdHlwZVwiOlwiSW1hZ2VPYmplY3RcIixcImluTGFuZ3VhZ2VcIjpcImFyXCIsXCJAaWRcIjpcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvbmV3LXByb2plY3RzXFxcLyNwcmltYXJ5aW1hZ2VcIixcInVybFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC93cC1jb250ZW50XFxcL3VwbG9hZHNcXFwvMjAyNlxcXC8wNFxcXC9EVUJBSV8yMDI2X0hFUk9fSU1BR0VfVVJMLmpwZ1wiLFwiY29udGVudFVybFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC93cC1jb250ZW50XFxcL3VwbG9hZHNcXFwvMjAyNlxcXC8wNFxcXC9EVUJBSV8yMDI2X0hFUk9fSU1BR0VfVVJMLmpwZ1wiLFwid2lkdGhcIjoxMjAwLFwiaGVpZ2h0XCI6NzcyLFwiY2FwdGlvblwiOlwiRFVCQUkgMjAyNiBIRVJPIElNQUdFIFVSTFwifSx7XCJAdHlwZVwiOlwiQnJlYWRjcnVtYkxpc3RcIixcIkBpZFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC9uZXctcHJvamVjdHNcXFwvI2JyZWFkY3J1bWJcIixcIml0ZW1MaXN0RWxlbWVudFwiOlt7XCJAdHlwZVwiOlwiTGlzdEl0ZW1cIixcInBvc2l0aW9uXCI6MSxcIm5hbWVcIjpcIkhvbWVcIixcIml0ZW1cIjpcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvXCJ9LHtcIkB0eXBlXCI6XCJMaXN0SXRlbVwiLFwicG9zaXRpb25cIjoyLFwibmFtZVwiOlwiTmV3IFByb2plY3RzXCJ9XX0se1wiQHR5cGVcIjpcIldlYlNpdGVcIixcIkBpZFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC8jd2Vic2l0ZVwiLFwidXJsXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcL1wiLFwibmFtZVwiOlwiVHJ1SGF1elwiLFwiZGVzY3JpcHRpb25cIjpcIlwiLFwicHVibGlzaGVyXCI6e1wiQGlkXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcLyNvcmdhbml6YXRpb25cIn0sXCJwb3RlbnRpYWxBY3Rpb25cIjpbe1wiQHR5cGVcIjpcIlNlYXJjaEFjdGlvblwiLFwidGFyZ2V0XCI6e1wiQHR5cGVcIjpcIkVudHJ5UG9pbnRcIixcInVybFRlbXBsYXRlXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcLz9zPXtzZWFyY2hfdGVybV9zdHJpbmd9XCJ9LFwicXVlcnktaW5wdXRcIjp7XCJAdHlwZVwiOlwiUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25cIixcInZhbHVlUmVxdWlyZWRcIjp0cnVlLFwidmFsdWVOYW1lXCI6XCJzZWFyY2hfdGVybV9zdHJpbmdcIn19XSxcImluTGFuZ3VhZ2VcIjpcImFyXCJ9LHtcIkB0eXBlXCI6XCJPcmdhbml6YXRpb25cIixcIkBpZFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC8jb3JnYW5pemF0aW9uXCIsXCJuYW1lXCI6XCJUcnVIYXV6XCIsXCJ1cmxcIjpcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvXCIsXCJsb2dvXCI6e1wiQHR5cGVcIjpcIkltYWdlT2JqZWN0XCIsXCJpbkxhbmd1YWdlXCI6XCJhclwiLFwiQGlkXCI6XCJodHRwczpcXFwvXFxcL3RydWhhdXouY29tXFxcLyNcXFwvc2NoZW1hXFxcL2xvZ29cXFwvaW1hZ2VcXFwvXCIsXCJ1cmxcIjpcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvd3AtY29udGVudFxcXC91cGxvYWRzXFxcLzIwMjZcXFwvMDhcXFwvdHJ1aGF1ei1sb2dvLnBuZ1wiLFwiY29udGVudFVybFwiOlwiaHR0cHM6XFxcL1xcXC90cnVoYXV6LmNvbVxcXC93cC1jb250ZW50XFxcL3VwbG9hZHNcXFwvMjAyNlxcXC8wOFxcXC90cnVoYXV6LWxvZ28ucG5nXCIsXCJ3aWR0aFwiOjI0OTgsXCJoZWlnaHRcIjo2NzYsXCJjYXB0aW9uXCI6XCJUcnVIYXV6XCJ9LFwiaW1hZ2VcIjp7XCJAaWRcIjpcImh0dHBzOlxcXC9cXFwvdHJ1aGF1ei5jb21cXFwvI1xcXC9zY2hlbWFcXFwvbG9nb1xcXC9pbWFnZVxcXC9cIn0sXCJzYW1lQXNcIjpbXCJodHRwczpcXFwvXFxcL3d3dy5mYWNlYm9vay5jb21cXFwvcHJvZmlsZS5waHA/aWQ9NjE1NzUzOTMwODQ5MjBcIixcImh0dHBzOlxcXC9cXFwvd3d3Lmluc3RhZ3JhbS5jb21cXFwvdHJ1aGF1elwiLFwiaHR0cHM6XFxcL1xcXC93d3cubGlua2VkaW4uY29tXFxcL2NvbXBhbnlcXFwvdHJ1aGF1elxcXC9cIixcImh0dHBzOlxcXC9cXFwvd3d3LnRpa3Rvay5jb21cXFwvQHRydWhhdXpcIixcImh0dHBzOlxcXC9cXFwvd3d3LnlvdXR1YmUuY29tXFxcL0BUcnVIYXV6XCJdfV19PFwvc2NyaXB0PlxuPCEtLSBcLyBZb2FzdCBTRU8gUHJlbWl1bSBwbHVnaW4uIC0tPiIsInlvYXN0X2hlYWRfanNvbiI6eyJ0aXRsZSI6Ik5ldyBQcm9qZWN0cyB8IER1YmFpIFJlYWwgRXN0YXRlIC0gQXBhcnRtZW50cywgVmlsbGFzLCBUb3duaG91c2VzLCBQZW50aG91c2VzIHwgVHJ1SGF1eiIsImRlc2NyaXB0aW9uIjoiTGl2ZSBJbnZlbnRvcnkgXHUwMGI3IFJlZWxseS5haSBPZmYtUGxhbiBQcm9qZWN0cyBpbiBEdWJhaSBCcm93c2UgdGhlIGxhdGVzdCBvZmYtcGxhbiBkZXZlbG9wbWVudHMgZnJvbSBEdWJhaSdzIGxlYWRpbmcgZGV2ZWxvcGVycywgdXBkYXRlZCBpbiByZWFsIHRpbWUgZnJvbSIsInJvYm90cyI6eyJpbmRleCI6ImluZGV4IiwiZm9sbG93IjoiZm9sbG93IiwibWF4LXNuaXBwZXQiOiJtYXgtc25pcHBldDotMSIsIm1heC1pbWFnZS1wcmV2aWV3IjoibWF4LWltYWdlLXByZXZpZXc6bGFyZ2UiLCJtYXgtdmlkZW8tcHJldmlldyI6Im1heC12aWRlby1wcmV2aWV3Oi0xIn0sImNhbm9uaWNhbCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvYXJcL25ldy1wcm9qZWN0c1wvIiwib2dfbG9jYWxlIjoiYXJfQVIiLCJvZ190eXBlIjoiYXJ0aWNsZSIsIm9nX3RpdGxlIjoiTmV3IFByb2plY3RzIiwib2dfZGVzY3JpcHRpb24iOiJMaXZlIEludmVudG9yeSBcdTAwYjcgUmVlbGx5LmFpIE9mZi1QbGFuIFByb2plY3RzIGluIER1YmFpIEJyb3dzZSB0aGUgbGF0ZXN0IG9mZi1wbGFuIGRldmVsb3BtZW50cyBmcm9tIER1YmFpJ3MgbGVhZGluZyBkZXZlbG9wZXJzLCB1cGRhdGVkIGluIHJlYWwgdGltZSBmcm9tIiwib2dfdXJsIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC9hclwvbmV3LXByb2plY3RzXC8iLCJvZ19zaXRlX25hbWUiOiJEdWJhaSBSZWFsIEVzdGF0ZSAtIEFwYXJ0bWVudHMsIFZpbGxhcywgVG93bmhvdXNlcywgUGVudGhvdXNlcyB8IFRydUhhdXoiLCJhcnRpY2xlX3B1Ymxpc2hlciI6Imh0dHBzOlwvXC93d3cuZmFjZWJvb2suY29tXC9wcm9maWxlLnBocD9pZD02MTU3NTM5MzA4NDkyMCIsImFydGljbGVfbW9kaWZpZWRfdGltZSI6IjIwMjYtMDQtMDdUMTM6NTc6NDYrMDA6MDAiLCJvZ19pbWFnZSI6W3sid2lkdGgiOjEyMDAsImhlaWdodCI6NzcyLCJ1cmwiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzA0XC9EVUJBSV8yMDI2X0hFUk9fSU1BR0VfVVJMLmpwZyIsInR5cGUiOiJpbWFnZVwvanBlZyJ9XSwidHdpdHRlcl9jYXJkIjoic3VtbWFyeV9sYXJnZV9pbWFnZSIsInR3aXR0ZXJfbWlzYyI6eyJcdTA2NDhcdTA2NDJcdTA2MmEgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjMxXHUwNjI3XHUwNjIxXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0Zlx1MDY0Mlx1MDYyZlx1MDY1MVx1MDYzMSI6Ilx1MDYyZlx1MDY0Mlx1MDY0YVx1MDY0Mlx1MDYyOSBcdTA2NDhcdTA2MjdcdTA2MmRcdTA2MmZcdTA2MjkifSwic2NoZW1hIjp7IkBjb250ZXh0IjoiaHR0cHM6XC9cL3NjaGVtYS5vcmciLCJAZ3JhcGgiOlt7IkB0eXBlIjoiV2ViUGFnZSIsIkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvbmV3LXByb2plY3RzXC8iLCJ1cmwiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL25ldy1wcm9qZWN0c1wvIiwibmFtZSI6Ik5ldyBQcm9qZWN0cyB8IER1YmFpIFJlYWwgRXN0YXRlIC0gQXBhcnRtZW50cywgVmlsbGFzLCBUb3duaG91c2VzLCBQZW50aG91c2VzIHwgVHJ1SGF1eiIsImlzUGFydE9mIjp7IkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvI3dlYnNpdGUifSwicHJpbWFyeUltYWdlT2ZQYWdlIjp7IkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvbmV3LXByb2plY3RzXC8jcHJpbWFyeWltYWdlIn0sImltYWdlIjp7IkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvbmV3LXByb2plY3RzXC8jcHJpbWFyeWltYWdlIn0sInRodW1ibmFpbFVybCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDRcL0RVQkFJXzIwMjZfSEVST19JTUFHRV9VUkwuanBnIiwiZGF0ZVB1Ymxpc2hlZCI6IjIwMjYtMDQtMDdUMDc6NTg6MTQrMDA6MDAiLCJkYXRlTW9kaWZpZWQiOiIyMDI2LTA0LTA3VDEzOjU3OjQ2KzAwOjAwIiwiZGVzY3JpcHRpb24iOiJMaXZlIEludmVudG9yeSBcdTAwYjcgUmVlbGx5LmFpIE9mZi1QbGFuIFByb2plY3RzIGluIER1YmFpIEJyb3dzZSB0aGUgbGF0ZXN0IG9mZi1wbGFuIGRldmVsb3BtZW50cyBmcm9tIER1YmFpJ3MgbGVhZGluZyBkZXZlbG9wZXJzLCB1cGRhdGVkIGluIHJlYWwgdGltZSBmcm9tIiwiYnJlYWRjcnVtYiI6eyJAaWQiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL25ldy1wcm9qZWN0c1wvI2JyZWFkY3J1bWIifSwiaW5MYW5ndWFnZSI6ImFyIiwicG90ZW50aWFsQWN0aW9uIjpbeyJAdHlwZSI6IlJlYWRBY3Rpb24iLCJ0YXJnZXQiOlsiaHR0cHM6XC9cL3RydWhhdXouY29tXC9uZXctcHJvamVjdHNcLyJdfV19LHsiQHR5cGUiOiJJbWFnZU9iamVjdCIsImluTGFuZ3VhZ2UiOiJhciIsIkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvbmV3LXByb2plY3RzXC8jcHJpbWFyeWltYWdlIiwidXJsIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI2XC8wNFwvRFVCQUlfMjAyNl9IRVJPX0lNQUdFX1VSTC5qcGciLCJjb250ZW50VXJsIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI2XC8wNFwvRFVCQUlfMjAyNl9IRVJPX0lNQUdFX1VSTC5qcGciLCJ3aWR0aCI6MTIwMCwiaGVpZ2h0Ijo3NzIsImNhcHRpb24iOiJEVUJBSSAyMDI2IEhFUk8gSU1BR0UgVVJMIn0seyJAdHlwZSI6IkJyZWFkY3J1bWJMaXN0IiwiQGlkIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC9uZXctcHJvamVjdHNcLyNicmVhZGNydW1iIiwiaXRlbUxpc3RFbGVtZW50IjpbeyJAdHlwZSI6Ikxpc3RJdGVtIiwicG9zaXRpb24iOjEsIm5hbWUiOiJIb21lIiwiaXRlbSI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvIn0seyJAdHlwZSI6Ikxpc3RJdGVtIiwicG9zaXRpb24iOjIsIm5hbWUiOiJOZXcgUHJvamVjdHMifV19LHsiQHR5cGUiOiJXZWJTaXRlIiwiQGlkIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC8jd2Vic2l0ZSIsInVybCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvIiwibmFtZSI6Ilx1MDYyYVx1MDYzMVx1MDY0OFx1MDY0N1x1MDYyN1x1MDY0OFx1MDYzMiIsImRlc2NyaXB0aW9uIjoiIiwicHVibGlzaGVyIjp7IkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvI29yZ2FuaXphdGlvbiJ9LCJwb3RlbnRpYWxBY3Rpb24iOlt7IkB0eXBlIjoiU2VhcmNoQWN0aW9uIiwidGFyZ2V0Ijp7IkB0eXBlIjoiRW50cnlQb2ludCIsInVybFRlbXBsYXRlIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC8/cz17c2VhcmNoX3Rlcm1fc3RyaW5nfSJ9LCJxdWVyeS1pbnB1dCI6eyJAdHlwZSI6IlByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uIiwidmFsdWVSZXF1aXJlZCI6dHJ1ZSwidmFsdWVOYW1lIjoic2VhcmNoX3Rlcm1fc3RyaW5nIn19XSwiaW5MYW5ndWFnZSI6ImFyIn0seyJAdHlwZSI6Ik9yZ2FuaXphdGlvbiIsIkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvI29yZ2FuaXphdGlvbiIsIm5hbWUiOiJcdTA2MmFcdTA2MzFcdTA2NDhcdTA2NDdcdTA2MjdcdTA2NDhcdTA2MzIiLCJ1cmwiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cLyIsImxvZ28iOnsiQHR5cGUiOiJJbWFnZU9iamVjdCIsImluTGFuZ3VhZ2UiOiJhciIsIkBpZCI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvI1wvc2NoZW1hXC9sb2dvXC9pbWFnZVwvIiwidXJsIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI2XC8wOFwvdHJ1aGF1ei1sb2dvLnBuZyIsImNvbnRlbnRVcmwiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzA4XC90cnVoYXV6LWxvZ28ucG5nIiwid2lkdGgiOjI0OTgsImhlaWdodCI6Njc2LCJjYXB0aW9uIjoiVHJ1SGF1eiJ9LCJpbWFnZSI6eyJAaWQiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cLyNcL3NjaGVtYVwvbG9nb1wvaW1hZ2VcLyJ9LCJzYW1lQXMiOlsiaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cL3Byb2ZpbGUucGhwP2lkPTYxNTc1MzkzMDg0OTIwIiwiaHR0cHM6XC9cL3d3dy5pbnN0YWdyYW0uY29tXC90cnVoYXV6IiwiaHR0cHM6XC9cL3d3dy5saW5rZWRpbi5jb21cL2NvbXBhbnlcL3RydWhhdXpcLyIsImh0dHBzOlwvXC93d3cudGlrdG9rLmNvbVwvQHRydWhhdXoiLCJodHRwczpcL1wvd3d3LnlvdXR1YmUuY29tXC9AVHJ1SGF1eiJdfV19fSwiX2xpbmtzIjp7InNlbGYiOlt7ImhyZWYiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2FyXC93cC1qc29uXC93cFwvdjJcL3BhZ2VzXC8zNjQwNCIsInRhcmdldEhpbnRzIjp7ImFsbG93IjpbIkdFVCJdfX1dLCJjb2xsZWN0aW9uIjpbeyJocmVmIjoiaHR0cHM6XC9cL3RydWhhdXouY29tXC9hclwvd3AtanNvblwvd3BcL3YyXC9wYWdlcyJ9XSwiYWJvdXQiOlt7ImhyZWYiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2FyXC93cC1qc29uXC93cFwvdjJcL3R5cGVzXC9wYWdlIn1dLCJhdXRob3IiOlt7ImVtYmVkZGFibGUiOnRydWUsImhyZWYiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2FyXC93cC1qc29uXC93cFwvdjJcL3VzZXJzXC8xMiJ9XSwicmVwbGllcyI6W3siZW1iZWRkYWJsZSI6dHJ1ZSwiaHJlZiI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvYXJcL3dwLWpzb25cL3dwXC92MlwvY29tbWVudHM/cG9zdD0zNjQwNCJ9XSwidmVyc2lvbi1oaXN0b3J5IjpbeyJjb3VudCI6MCwiaHJlZiI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvYXJcL3dwLWpzb25cL3dwXC92MlwvcGFnZXNcLzM2NDA0XC9yZXZpc2lvbnMifV0sIndwOmZlYXR1cmVkbWVkaWEiOlt7ImVtYmVkZGFibGUiOnRydWUsImhyZWYiOiJodHRwczpcL1wvdHJ1aGF1ei5jb21cL2FyXC93cC1qc29uXC93cFwvdjJcL21lZGlhXC8zNjI5NyJ9XSwid3A6YXR0YWNobWVudCI6W3siaHJlZiI6Imh0dHBzOlwvXC90cnVoYXV6LmNvbVwvYXJcL3dwLWpzb25cL3dwXC92MlwvbWVkaWE/cGFyZW50PTM2NDA0In1dLCJjdXJpZXMiOlt7Im5hbWUiOiJ3cCIsImhyZWYiOiJodHRwczpcL1wvYXBpLncub3JnXC97cmVsfSIsInRlbXBsYXRlZCI6dHJ1ZX1dfX0=">